Tcp反向代理OpenResty+Lua在建立连接后不能传输数据?

我的基于TCP的协议需要使用OpenResty+Lua作为网关。当TCP客户端与网关建立连接后,第一个1536字节的数据包将告诉目标服务器地址。Lua脚本在preread_by_lua_block中解析并获取服务器地址,并将其设置为ngx.ctx.hsr_server_ip变量。然后,我通过balancer.set_current_peer在balancer_by_lua_block中将服务器地址设置为上游。在实际运行中,执行set_current_peer步骤后,网关后面的最终TCP服务器也接收到连接请求,TCP链接已经成功建立。但客户端发送的随后的TCP数据从未传输到服务器。如果在客户端代码中第一个数据包发送到网关后休眠1秒钟,那么服务器稍后就可以接收到数据。

OpenResty配置文件如下:

events {
    worker_connections  1024;
}

stream {
    lua_code_cache on;

    init_by_lua_block {
        require('ngx.balancer')
    }

    upstream lua_dispatcher {
        # just an invalid address as a placeholder
        server 0.0.0.1:1234;

        balancer_by_lua_block {
            local balancer = require('ngx.balancer')
            local host = ngx.ctx.hsr_server_ip
            local port = ngx.ctx.hsr_server_port

            -- set peer
            local ok, err = balancer.set_current_peer(host, port)
            if ok then
              ngx.log(ngx.NOTICE, "Forward a client to server: ", host)
            else
              ngx.log(ngx.ERR, err)
              ngx.exit(ngx.ERROR)
            end
        }
    }

    # proxy
    server {
        listen 5701;
        proxy_pass lua_dispatcher;

        # Parse HSR Server IP from first packet
        preread_by_lua_block {
            local sock = ngx.req.socket()
            local data, err = sock:receive(1536)
            if not data then
            ngx.log(ngx.ERR, err)
            ngx.exit(ngx.ERROR)
            end

            local datastr = tostring(data)

            -- get x.x.x.x from first tcp packet with length of 1536
            local ipStrTable = {}
            local tempStr = '\0'
            for i=1,#datastr do
              tempStr = string.sub(datastr,i,i)
              if tonumber(tempStr) or tempStr == "." then
                  table.insert(ipStrTable, tempStr)
              end
            end

            -- save upstream server ip to ngx.ctx
            local ipstr = table.concat(ipStrTable)
            ngx.ctx.hsr_server_ip = ipstr
            ngx.ctx.hsr_server_port = 5701
            ngx.log(ngx.NOTICE, "Connect to hsr server: " ,ngx.ctx.hsr_server_ip)
        }
    }
}
点赞