本文主要记录在 Nginx 官方源码基础上,编译并静态链入 OpenResty 生态的 lua-nginx-module(及 NDK、LuaJIT)的过程,便于在已有 Nginx 编译参数体系中启用 Lua。
OpenResty 官方更推荐直接使用 OpenResty 发行版,其中已捆绑 Nginx、ngx_lua、优化版 LuaJIT 与补丁。自行把模块编进原版 Nginx 可行,但对 LuaJIT/OpenSSL/补丁版本组合更敏感,排障成本更高。若无强约束(必须沿用现有 --prefix 与模块集),优先 OpenResty。模块说明见 lua-nginx-module Installation。
背景说明
适用场景:
- 现网 Nginx 已按自有
./configure参数维护,需要追加 Lua 能力 - 需要与站内其它自编译 Nginx(OpenSSL/HTTP2/stream 等)参数对齐
不适用:希望“开箱即用”的全套 OpenResty Lua 库与性能补丁——应直接装 OpenResty。
环境信息
历史编译示例:
| 项目 | 取值(示例) |
|---|---|
| 系统 | CentOS 7.x 类 |
| Nginx | 1.21.4 |
| LuaJIT | OpenResty luajit2 v2.1-20211210,安装前缀 /usr/local/luajit |
| NDK | ngx_devel_kit v0.3.1 |
| ngx_lua | lua-nginx-module v0.10.20 |
| OpenSSL | 1.1.1l(源码编入) |
| 安装前缀 | /home/nginx |
| build 标记 | ngx-lua-tinychen(仅标识,可自定) |
版本组合需满足 Nginx Compatibility;换新版本时重新核对,勿照搬过旧 tag。
准备工作
工作目录示例为 /home 下并列解压各组件;路径按本机调整。
安装 LuaJIT(OpenResty 分支)
cd /home
wget https://github.com/openresty/luajit2/archive/refs/tags/v2.1-20211210.tar.gz
tar -zxvf v2.1-20211210.tar.gz
cd luajit2-2.1-20211210/
make install PREFIX=/usr/local/luajit
配置动态链接搜索路径:
echo "/usr/local/luajit/lib" > /etc/ld.so.conf.d/usr_local_luajit_lib.conf
ldconfig
确认库与头文件存在:
ls /usr/local/luajit/lib
ls /usr/local/luajit/include/luajit-2.1
下载 NDK 与 lua-nginx-module
cd /home
wget https://github.com/vision5/ngx_devel_kit/archive/refs/tags/v0.3.1.tar.gz
tar -zxvf v0.3.1.tar.gz
wget https://github.com/openresty/lua-nginx-module/archive/refs/tags/v0.10.20.tar.gz
tar -zxvf v0.10.20.tar.gz
下载 Nginx 与依赖库源码
cd /home
wget http://nginx.org/download/nginx-1.21.4.tar.gz
tar -zxvf nginx-1.21.4.tar.gz
wget https://www.openssl.org/source/openssl-1.1.1l.tar.gz
tar -zxvf openssl-1.1.1l.tar.gz
# pcre、zlib 源码路径按你现有编译习惯准备(示例中为 ../pcre-8.44、../zlib-1.2.11)
导出 LuaJIT 环境变量
编译 Nginx 前在同一 shell 中:
export LUAJIT_LIB=/usr/local/luajit/lib
export LUAJIT_INC=/usr/local/luajit/include/luajit-2.1
LuaJIT 2.0 头文件路径可能是 luajit-2.0,以实际 include 目录为准。
对齐现有 Nginx 参数
若替换正在运行的 Nginx,先导出当前构建参数,避免漏模块:
nginx -V
# 将 configure arguments 合并进新的 ./configure
编译安装
进入 Nginx 源码目录执行 configure(路径按并列解压布局):
cd /home/nginx-1.21.4
./configure \
--prefix=/home/nginx \
--without-select_module \
--without-poll_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-debug \
--with-http_ssl_module \
--with-http_v2_module \
--with-stream \
--with-stream=dynamic \
--with-stream_ssl_module \
--with-stream_realip_module \
--with-stream_ssl_preread_module \
--with-openssl=../openssl-1.1.1l \
--with-pcre=../pcre-8.44 \
--with-zlib=../zlib-1.2.11 \
--with-ld-opt="-Wl,-rpath,/usr/local/luajit/lib" \
--add-module=../ngx_devel_kit-0.3.1 \
--add-module=../lua-nginx-module-0.10.20 \
--build=ngx-lua-tinychen
与 Lua 直接相关的三项:
--with-ld-opt="-Wl,-rpath,/usr/local/luajit/lib":运行时找到 libluajit--add-module=.../ngx_devel_kit-...--add-module=.../lua-nginx-module-...
编译并安装:
make -j"$(nproc)"
make install
动态模块方式(可选)
Nginx ≥ 1.9.11 可用 --add-dynamic-module= 代替 --add-module=,在 nginx.conf 中:
load_module modules/ndk_http_module.so;
load_module modules/ngx_http_lua_module.so;
动态模块路径以 make install 实际产出为准。
测试验证
查看构建信息:
/home/nginx/sbin/nginx -V
历史成功输出要点(示意):
nginx version: nginx/1.21.4 (ngx-lua-tinychen)
built with OpenSSL 1.1.1l 24 Aug 2021
configure arguments: ... --with-ld-opt=-Wl,-rpath,/usr/local/luajit/lib \
--add-module=../ngx_devel_kit-0.3.1 \
--add-module=../lua-nginx-module-0.10.20 \
--build=ngx-lua-tinychen
配置中增加最小 Lua 探针(语法以模块版本为准):
location /lua-ok {
default_type text/plain;
content_by_lua_block {
ngx.say("lua ok")
}
}
/home/nginx/sbin/nginx -t
# 启动或热加载后
curl -sS http://127.0.0.1/lua-ok
# 期望输出:lua ok
若启动报找不到 libluajit-5.1.so 等,检查 ldconfig 与 rpath 是否指向正确 PREFIX。
注意事项
- 官方明确:手搓 Nginx+ngx_lua 容易因版本/补丁不齐导致功能缺失或性能回退;长期维护成本高时迁 OpenResty。
make install默认不覆盖你自定义的 conf;替换二进制前备份,并用-t验证。- OpenSSL/PCRE/zlib 路径必须与
./configure时一致;升级依赖应整链重编。 - 生产切换建议:新前缀并行安装 → 配置测试 → 再切 systemd/脚本中的二进制路径。
- 版本号以下载时的 tag 为准,本文数字仅为历史可复现示例。