如何解决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 举报,一经查实,本站将立刻删除。