我是在一个请求里面这样发送请求的
local sock = ngx.socket.tcp()
sock:settimeout(100000)
local ok, err = sock:connect(ip, port)
if not ok then
ngx.log(ngx.ERR,"failed to connect: ", err)
return nginx_resp_op.nginx_resp(200,"failed")
end
local data_json = body_data
local data_json_len = string.len(body_data)
ngx.log(ngx.DEBUG,"data_json:"..data_json)
local send_data = "$"..data_len.."\r\n"..data.."\r\n"
local bytes, err = sock:send(send_data)
if not bytes then
ngx.log(ngx.ERR,"failed to send query: ", err)
return nginx_resp_op.nginx_resp(200,"failed")
end
ngx.log(ngx.DEBUG,"send data:"..send_data)
local line, err = sock:receive()
if not line then
if err == "timeout" then
ngx.log(ngx.ERR,"recv timeout")
sock:close()
end
ngx.log(ngx.ERR,"recv time out")
return nginx_resp_op.nginx_resp(200,"failed")
end
local tcpdata = nil
local prefix = byte(line)
ngx.log(ngx.DEBUG,"tcp prefix:"..prefix)
if prefix == 36 then -- char '$'
local size = tonumber(sub(line, 2))
if size < 0 then
ngx.log(ngx.ERR,"recv size < 0")
return nginx_resp_op.nginx_resp(200,"failed")
end
ngx.log(ngx.DEBUG,"size:"..size)
tcpdata, err = sock:receive(size)
if not tcpdata then
if err == "timeout" then
sock:close()
end
return nginx_resp_op.nginx_resp(200,"failed")
end
ngx.log(ngx.DEBUG,"recv from tcp server:"..tcpdata)
local dummy, err = sock:receive(2)
if not dummy then
ngx.log(ngx.ERR,"it is not /r/n")
return nginx_resp_op.nginx_resp(200,"failed")
end
ngx.log(ngx.DEBUG,"deal packet finish")
else
ngx.log(ngx.ERR,"unkown prefix:".. prefix)
return nginx_resp_op.nginx_resp(200,"failed")
end
local ok, err = sock:setkeepalive(0,1)
if not ok then
ngx.log(ngx.DEBUG,"keepalive error:"..err)
else
ngx.log(ngx.DEBUG,"set keepalive success")
end
ngx.log(ngx.DEBUG,"send to client data:"..tcpdata)
return nginx_resp_op.nginx_resp(200,tcpdata)
收的话,像redis协议那样子,去收,如果是一个请求一个请求的发送是没问题,但是在很多请求同时并发的时候,收数据,有时候总是在recv那里停住了,这是怎么回事呢。
在 2014年10月27日星期一UTC+8下午8时10分28秒,xiati...@gmail.com写道:
大家好:
客户端发送请求给nginx,nginx解析之后,把数据发给我后端的tcp服务器,用的是tcp协议,现在问题来了,我希望nginx跟我的后端tcp服务器维持一个长连接的通信,那么我使用这几个函数进行长连接到我的tcp服务器。
local sock = ngx.socket.tcp()
sock:settimeout(10000) -- one second
local ok, err = sock:connect("127.0.0.1", 13900)
if not ok then
ngx.say("failed to connect: ", err)
return
end
local bytes, err = sock:send("i am nginx")
if not bytes then
ngx.say("failed to send query: ", err)
return
end
local chunk,err = sock:receive()
if not chunk then
ngx.say("failed to receive a chunk: ", err)
return
end
ngx.log(ngx.DEBUG,"result: ", chunk)
local ok, err = sock:setkeepalive(0, 1)
if not ok then
ngx.say("failed to put the connection into pool "
.. "with pool capacity 500 "
.. "and maximal idle time 60 sec")
return
end
我把sock:setkeepalive的连接数设置为1,就是希望连接池里面只有一个长连接进行通信,数据都是通过唯一的一个连接,进行发送和回复。
但是发现我根本不能建立起长连接,就是nginx一段时间后会自动断开和我的服务器进行连接,请问我这种设计方式是否有问题,如果有问题请问我要怎么改进,非常感谢大家在百忙之中给予回复。。。