Hello!2012/11/29 tg.yang wrote
> 1 我知道为啥获取len不对了,我定义的table不是列表式的,而是类似的是t = { x =1 , y = 2 }, 这种不迭代的话应该如何获取长度?
>
这个是 Lua 语言方面的 FAQ,和 ngx_lua 模块本身无关。哈希表类型的 Lua table 并不能通过 # 运算符获取长度:
$ lua -e 'local tb = {x = 1, y = 2} print(#tb)'
0
$ luajit -e 'local tb = {x = 1, y = 2} print(#tb)'
0
建议先仔细阅读 Lua 5.1 语言的参考手册,以节约大家的时间,呵呵:
http://www.lua.org/manual/5.1/manual.html
> 2 对于upstream我使用了setkeepalive(0,100),不过也经常报下面两种错误
>
> 1) 10240 worker_connections are not enough
你需要在 nginx.conf 中恰当地配置 worker_connections 配置指令:
http://wiki.nginx.org/EventsModule#worker_connections
这个错误是说你的 worker_connections 配置的上限不够大。
值得一提的是,这里 worker_connections 的含义是指每个 nginx worker
进程中可以创建的连接数的上限。而连接数不仅包括下游连接(即 http 请求对应的连接),也包括上游连接(包括 ngx_lua
cosocket 和 nginx upstream 创建的连接)。
> 2) lua tcp socket connect timed out
> 是否是upstream性能不够导致的还是我超时时间设置的3s太短了?
>
常见的一种情况是你的远方服务过于繁忙而来不及 accept() 新的连接请求,导致远端的 accept 队列溢出,而导致 nginx
一侧发出的 TCP SYN 包被丢弃。另外一种情况就是 nginx 与你远方服务之间的网络链路上的延时问题。你需要通过 tcpdump 或者
wireshark 这样的抓包工具予以确认。
> 3) 好像luajit 不支持unpack,
> 对于
> t = { "Content-Type","text/css" }
> ngx.req.set_header(table.unpack(t))
> 我现在就写成
> ngx.req.set_header(t[1], t[2]),有更优雅的写法么?
>
table.unpack 是 Lua 5.2 语言的特性,在 Lua 5.1 语言中并不存在(正如 Kindy 同学所指出的)。而
ngx_openresty 只与 Lua 5.1 兼容(无论是标准 Lua 5.1 解释器还是 LuaJIT 2.0)。所以你需要这么写:
ngx.req.set_header(unpack(t))
即去掉 table. 前缀。细节可以参见 Lua 5.1 语言的官方手册:
http://www.lua.org/manual/5.1/manual.html#pdf-unpack
> 4)对于自定义的协议,我想使用capture_multi使用多个subrequest同时访问多个upstream有啥好的解决方案么?
> 我现在就是一次访问一个,访问时间为两者之和。
>
1. 如果你的自定义协议客户端是用 nginx upstream C 模块来实现的,则可以直接使用
ngx.location.capture_multi API 来发起多个并发的子请求,细节见官方文档:
http://wiki.nginx.org/HttpLuaModule#ngx.location.capture_multi
2. 如果你的客户端是像 lua-resty-mysql 那样基于 ngx_lua 的 cosocket API 来实现的话,则可以直接使用
ngx.thread API 来发起多个并发的 cosocket 连接,细节可以参见文档:
http://wiki.nginx.org/HttpLuaModule#ngx.thread.spawn
> 5)我想使用lua脚本访问一个路由服务,这个服务返回多个地址,然后类似nginx 标准的upstream模块对这多个地址访问,有容错处理。这种场景通过lua有好的解决方案么?
>
Lua 是图灵完全的语言,容错逻辑不过是一些 if else 而已。特别地,你会发现前面提及的 ngx.thread API 会对降低延时很有帮助。
另外,建议与当前邮件主题《关于使用nginx lua模块导致nginx内存暴涨》无关的问题和内容放入拥有正确标题的独立邮件中,这样方便大家追踪和回复。谢谢合作。
Best regards,
-agentzh