不知道nginx有没有计划将log phase从ngx_http_free_request和ngx_http_finalize_request中移出来,让log phase成为一个普通的phase,这样就可以支持cosocket的操作了。
估计很多人需要这个特性,:)
在 2012年8月21日星期二UTC+8上午8时31分20秒,agentzh写道:
Hello!2012/8/20 queyimeng <shif...@gmail.com>:
> 得到的错误是API disabled in the context of log_by_lua
>
lua-resty-redis 库依赖 ngx_lua 模块的 cosocket API,而 cosocket API 只能用于
rewrite_by_lua*, access_by_lua*, 和 content_by_lua* 这些上下文中。
> 有四个疑问?
>
> 1. log_by_lua是用于哪些场景?
一般用于请求的后续操作,比如在共享内存中进行统计,或者输出信息到某个文件。见 log_by_lua 的官方文档中的示例:
http://wiki.nginx.org/HttpLuaModule#log_by_lua
> 2. 为什么log_by_lua要禁止resty-redis使用?
这个是受制于目前 nginx 核心的 log phase handler 的实现,即在 log phase 是不允许有非阻塞的 I/O
操作的。其实我也非常不希望有此限制 ;)
> 3. 我希望做一些比如统计这样的操作,用哪种context合适?
这个取决于你的统计需求。如果你的 content phase 已经配置了 ngx_proxy 或者 ngx_fastcgi
模块了的话,一般在 rewrite_by_lua, access_by_lua, 或者 log_by_lua 进行统计。
> 4. resty整套api框架中,有没有文档描述,哪些api在某个Context中禁止使用?
>
ngx_lua 模块的官方文档中对各个 API 有明确说明,例如 TCP cosocket API
http://wiki.nginx.org/HttpLuaModule#ngx.socket.tcp
中,标记了
“context: rewrite_by_lua*, access_by_lua*, content_by_lua* ”
Best regards,
-agentzh