Lua
名称
ngx_http_lua_module - 将Lua的功能嵌入到Nginx HTTP服务器中。
这个模块没有与Nginx源码一起发布。详见安装介绍
内容列表
状态
已经发布。
版本
此文档基于2017年4月8日发布的ngx_lua v0.10.8。
概要
|
|
描述
通过标准的Lua5.1解释器或者LuaJIT2.0/2.1以及借助Nginx的子请求,此模块将Lua嵌入到Nginx中,允许将强大的Lua线程集成到Nginx事件模块中。
与Apcache’s mod_lua和Lighttpd’s mod_magnet不同的是,使用此模块执行Lua代码,在网络传输中完全是非阻塞的,只要使用此模块提供的Nginx API for Lua来处理上游服务的请求,例如MySQL, PostgreSQL, Memcached,Redis 或上游Http web服务。
至少以下Lua库和Nginx模块可以和ngx_lua模块一起使用:
- lua-resty-memcached
- lua-resty-mysql
- lua-resty-redis
- lua-resty-dns
- lua-resty-upload
- lua-resty-websocket
- lua-resty-lock
- lua-resty-logger-socket
- lua-resty-lrucache
- lua-resty-string
- ngx_memc
- ngx_postgres
- ngx_redis2
- ngx_redis
- ngx_proxy
- ngx_fastcgi
通过ngx.location.capture或者ngx.location.capture_multi,几乎所有的Ngnix模块都可以与ngx_lua模块一起使用,但是我们建议使用lua-resty-*代替创建子请求去访问Nginx upstream模块,因为前者更加灵活且存储效率更高。
在一个单独的nginx worker进程中,所有的请求共享一个Lua解释器或LuaJIT实例,但是请求上下文却是使用轻量级的Lua协程隔离。
被加载的Lua模块保持在nginx worker级别使得只占用极小内存,即使在重负载下也是如此。
这个模块被插入NGINX的“http”子系统,所以它仅仅支持Http家族中的晚期通信协议(例如HTTP0.9/1.0/1.1/2.0,WebSockets等等)。如果你想使用TCP协议与晚期版本客户端通信,你应该使用兼容Lua APi的ngx_stream_lua模块。
典型应用
仅仅列举一些:
- 使用Lua处理各种nginx upstream输出(代理,dirzzle, postgres,redis, memcached,等等)
- 在请求真正到达upstream后端之前,使用处理任意复杂的访问控制和安全检查
- 使用随意方式操纵响应头
- 从外部存储(例如redis, memcached,mysql,postgresql)获取后端信息,从而即时根据那些信息来选择访问哪个upstream后端
- 在一个content handler中使用同步方式编写任意复杂的web应用,但是仍然使用非阻塞方式访问数据库后端和其他存储。
- 使用Lua在重写阶段做非常复杂的URL调度
- 使用Lua为Nginx的子请求和任意的location实现高级的缓存机制。
作为模块,他允许将Nginx内的各种元素聚集在一起,并将Lua的优势暴露给用户,这种可能性是无限的。该模块提供了脚本的全部灵活性,同时在cpu时间以及内存占用方面,提供了与C语言同等级别的性能水平。当LusJIT2.x可用后尤其是如此。
而其他的脚本语言通常难以实现此性能级别。
Lua状态(Lua虚拟机实例)跨所有请求共享,通过一个单独的nginx worker进程处理以最小化内存占用。
Nginx兼容性
该模块最新的版本兼容一下Nginx版本:
- 1.11.x (last tested: 1.11.2)
- 1.10.x
- 1.9.x (last tested: 1.9.15)
- 1.8.x
- 1.7.x (last tested: 1.7.10)
- 1.6.x
Nginx cores低于1.6.0(包含)版本不再支持。