问题描述
我的基于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 (将#修改为@)