ngx_lua 模块将 Lua 整合在 NginX 中,使用 Lua coroutine per request 机制实现无缝的 I/O 复用处理。受益于 Lua 解释器的极低开销和原生 coroutine 支持,用户代码仍然能以习惯的顺序方式编写,丝毫不会感受到 NginX I/O 复用结构的存在,同时又能享受到其天然的非阻塞大并发能力和非凡的速度。借助 agentzh 在 ngx_echo 模块上的积累支持 subrequest 机制后,ngx_lua 能够整合各类 NginX 模块的功能,成为真正意义上的 Web 粘合层。
ngx_lua 基本实现原理:
- 缓存用户代码,解析配置文件时即载入用户Lua代码,将其包装为 closure factory 缓存在NginX内,以便创建供每个 coroutine 使用的 Lua closure;
- one coroutine per request,基于 closure factory 实现 coroutine 之间完全隔离 globals table,HTTP request 处理过程放在一个新创建的 Lua coroutine 内,处理结束或出错时结束该 coroutine,释放处理过程中消耗的所有资源;
- NginX 相关操作以 API 形式注入 Lua main thread 的 globals table,各个 coroutine 的 globals table 继承 自 main thread,节约了重新初始化 coroutine globals table 的开销;
- 调用注入的 NginX API 时,若涉及 I/O 则直接 yield 中断当前 coroutine,并调用 NginX 内的 subrequest 接口生成新的内部请求交给 NginX 处理,待其处理完毕后靠 NginX 事件系统重新 resume 被中断的 coroutine 继续运行用户代码。
在使用标准 Lua 5.1.4 的情况下,ngx_lua 可轻松达到上万QPS的吞吐量。对于涉及复杂运算的 Lua 代码,可以让 ngx_lua 使用 LuaJIT 而非标准 Lua 来实现性能上的极大提升。
后续 ngx_lua 将会得到持续的开发改进,力图成为好用、灵活、高效的 NginX 脚本引擎,请大家拭目以待!