local tcpso = require "ngx.socket.tcp"tcpso:connect("127.0.0.1", 8080)tcpso:send("hi")tcpso:receive("*a")';
ngx.say("ok")
hi, 比如在rewrite_by_lua中的发起一个socket.receive的操作, 那么content_by_lua一定不会在socket receive结束之前被执行, 对吗?不知道理解代码是否准确, 我觉得cosocket是yield到req ctx里面的lua_State中了, 所以cosocket连接的生命周期在req的里面.
动手做了个实验, 如下. 仔细想了下, 发现问得好笨...=="所以现在要做不阻塞req的远端日志记录, 是不是放在init_worker_by_lua中, 然后通过shared_dict来做buffer? #1 nginx.conflocation / {rewrite_by_lua 'local tcpso = require "ngx.socket.tcp"tcpso:connect("127.0.0.1", 8080) tcpso:send("hi")tcpso:receive("*a")';content_by_lua 'ngx.say("ok") ';}# 2 `nc -l 8080`# 3 run nginx; `curl localhost/` 是阻塞的On Tuesday, April 15, 2014 4:52:52 PM UTC+8, Ruoshan Huang wrote: hi, 比如在rewrite_by_lua中的发起一个socket.receive的操作, 那么content_by_lua一定不会在socket receive结束之前被执行, 对吗?不知道理解代码是否准确, 我觉得cosocket是yield到req ctx里面的lua_State中了, 所以cosocket连接的生命周期在req的里面. --
local tcpso = require "ngx.socket.tcp"tcpso:connect("127.0.0.1", 8080) tcpso:send("hi")tcpso:receive("*a")';
Hello! 2014-04-15 3:24 GMT-07:00 Ruoshan Huang: > 动手做了个实验, 如下. 仔细想了下, 发现问得好笨...==" > 所以现在要做不阻塞req的远端日志记录, 是不是放在init_worker_by_lua中, 然后通过shared_dict来做buffer? > 建议直接在每 worker 的 Lua 空间里做缓冲。 另外,我觉得你或许可以参考或者直接应用下面这个 lua-resty-logger-socket 库: https://github.com/cloudflare/lua-resty-logger-socket 我们公司就在生产上使用它把 nginx 访问日志非阻塞地推送给外部的 TCP 服务。 Regards, -agentzh