要在 Nginx 源码编译阶段嵌入 Lua 支持,核心是将 lua-nginx-module 作为第三方模块静态编译进 Nginx 二进制文件,需依次安装 LuaJIT、ngx_devel_kit 和 ngx_lua,配置正确路径与 --with-ld-opt 参数,并通过 nginx -V 验证 with-http_lua_module 是否生效。

要在 Nginx 源码编译阶段嵌入 Lua 支持,核心是把 lua-nginx-module(即 ngx_lua)作为第三方模块一起编译进 Nginx,而不是后期动态加载。这要求你从源码出发,完整构建一个带 Lua 能力的 Nginx 二进制文件。整个过程对版本兼容性、依赖顺序和编译参数非常敏感,稍有偏差就会失败。
确认基础依赖已安装
编译前必须装齐底层支撑库,否则 configure 阶段会报错或缺失关键功能:
- 编译工具链:
gcc、make、perl - 正则支持:
pcre-devel(CentOS/RHEL)或libpcre3-dev(Ubuntu/Debian) - SSL 支持:
openssl-devel或libssl-dev - 压缩支持:
zlib-devel或zlib1g-dev
准备 Lua 运行时环境
Nginx 的 Lua 模块依赖 LuaJIT(非标准 Lua),推荐使用 OpenResty 官方维护的 LuaJIT 版本:
- 下载并安装 LuaJIT(如
LuaJIT-2.1.0-beta3),指定安装路径(例如/usr/local/luajit) - 设置环境变量:
LUAJIT_LIB指向/usr/local/luajit/lib,LUAJIT_INC指向头文件目录(如/usr/local/luajit/include/luajit-2.1) - 确保
ldconfig能识别 LuaJIT 动态库,或在编译 Nginx 时显式传入--with-luajit-lib=/path/to/lib和--with-luajit-inc=/path/to/include
获取并校验模块与 Nginx 版本匹配
版本不兼容是编译失败最常见原因:
- 从 GitHub 获取
lua-nginx-module(推荐用 OpenResty 官方发布的稳定 tag,如v0.10.24) - 同时获取对应兼容的
ngx_devel_kit(NDK,v0.3.1+),它是 lua-nginx-module 的底层依赖 - 选用 Nginx 主线稳定版(如
1.24.0或1.25.3),避免使用 EOL 版本;查阅模块 README 中的「Compatibility」表格确认支持关系
执行 configure + make 编译安装
进入 Nginx 源码目录后,运行 configure 命令,关键是要把两个模块路径正确加入 --add-module:
- 示例命令(路径按实际调整):
./configure --prefix=/usr/local/nginx \<br> --with-http_ssl_module \<br> --with-http_gzip_static_module \<br> --add-module=/path/to/ngx_devel_kit-0.3.1 \<br> --add-module=/path/to/lua-nginx-module-0.10.24 \<br> --with-ld-opt="-Wl,-rpath,/usr/local/luajit/lib" \<br> --with-http_stub_status_module
-
--with-ld-opt确保运行时能定位 LuaJIT 动态库,避免libluajit.so: cannot open shared object file - 执行
make -j$(nproc)编译,再sudo make install
验证是否成功集成
安装完成后不是立刻就能写 Lua,必须确认模块真正生效:
- 运行
/usr/local/nginx/sbin/nginx -V,检查输出中是否含with-http_lua_module - 在
nginx.conf的http块中添加测试指令:init_by_lua_block { ngx.log(ngx.INFO, "Lua module loaded") } - 重启 Nginx,查看 error.log 是否出现该日志;若报
unknown directive "init_by_lua_block",说明模块未加载或配置位置错误 - 注意:Lua 指令只能出现在特定上下文(如 http/server/location),不能放在 events 或 stream 块里


















