linux下nginx支持lua需通过openresty或手动编译ngx_lua模块,原生nginx不支持;配置须用content_by_lua_block等指定指令嵌入对应生命周期阶段,并注意resolver、lua_shared_dict及异步调用等关键细节。

Linux 下让 Nginx 支持 Lua 脚本,**不是简单装个包就能用**,关键在于环境是否真正具备 Lua 运行能力。原生 Nginx 完全不支持 Lua,必须通过 OpenResty(推荐)或手动编译 ngx_lua 模块实现。跳过这一步直接写 content_by_lua_block 会报错 500 或配置加载失败。
首选方案:用 OpenResty 替代原生 Nginx
OpenResty 是 Nginx + LuaJIT + ngx_lua 模块的完整集成发行版,开箱即用,省去编译依赖、路径配置等大量坑。
- 下载安装(以 Ubuntu/Debian 为例):
wget https://openresty.org/download/openresty-1.21.4.2.tar.gztar -xzf openresty-1.21.4.2.tar.gz && cd openresty-1.21.4.2./configure --prefix=/usr/local/openresty --with-http_lua_modulemake && sudo make install - 验证是否就绪:
/usr/local/openresty/nginx/sbin/nginx -V 2>&1 | grep -o with-http_lua_module
有输出即表示模块已启用 - 启动服务:
/usr/local/openresty/nginx/sbin/nginx
此时nginx命令实际指向 OpenResty 的二进制文件
确认 Lua 能正常执行的最小测试
别急着写复杂逻辑,先确保基础通路跑通:
- 在
nginx.conf的server块里加一个测试 location:location /lua-test {<br> content_by_lua_block {<br> ngx.say("Hello from Lua!")<br> }<br> } - 重载配置:
/usr/local/openresty/nginx/sbin/nginx -s reload - 访问
http://your-server/lua-test,看到文字即说明 Lua 环境可用
关键配置项与常用指令位置
Lua 代码需嵌入 Nginx 请求生命周期的特定阶段,不同指令用途明确,不能混用:
- init_by_lua_block:Nginx 启动时执行一次,适合初始化全局连接池、加载配置表、预热缓存
-
set_by_lua_block:rewrite 阶段运行,可动态生成变量供后续
proxy_pass或if使用(如解析请求参数设 $backend) -
access_by_lua_block:权限校验、IP 黑白名单、限流计数(配合
lua_shared_dict实现跨 worker 共享状态) - content_by_lua_block:完全接管响应内容,适合 API 网关、轻量服务端渲染
- balancer_by_lua_block:绕过静态 upstream,实现动态负载均衡选点(灰度、用户分组、健康感知)
几个容易踩的坑
即使模块装好了,Lua 逻辑也常因细节失效:
-
变量 proxy_pass 不生效?:Nginx 默认不解析变量中的域名,需在 http 块加
resolver 8.8.8.8 valid=30s;,再用set_by_lua_block赋值 $target,最后proxy_pass http://$target; -
共享数据要持久?:用
lua_shared_dict my_cache 10m;在 http 块声明,再在 Lua 中用ngx.shared.my_cache:set("key", "val")存取 -
调外部 API 别阻塞?:禁用
http.client等同步方式;改用ngx.location.capture或cosocket异步发起请求 -
日志调试用 ngx.log,别 print;错误级别选
ngx.ERR或ngx.WARN,日志会出现在 error_log 指定文件中











