本文主要记录在 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 类
Nginx1.21.4
LuaJITOpenResty luajit2 v2.1-20211210,安装前缀 /usr/local/luajit
NDKngx_devel_kit v0.3.1
ngx_lualua-nginx-module v0.10.20
OpenSSL1.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 为准,本文数字仅为历史可复现示例。

参考资料