openresty+lua的tcp反向代理在链接建立后无法传输数据?

问题描述

我的基于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 server也收到了connect请求,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)
        }
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)