nginx第三方模块只能通过源码编译静态集成,需用--add-module指定含config文件的模块根目录,复用原configure参数并验证nginx -v及配置生效。

Nginx 本身不支持“静态编译第三方模块”这一说法——准确讲,第三方模块只能通过源码编译方式静态集成进 Nginx 二进制文件,不存在“单独静态编译模块再链接”的操作。所谓“静态”,是指模块代码在 ./configure 和 make 阶段被直接编译进 objs/nginx,运行时无需 .so 文件,也不依赖 load_module 指令。
下面分关键点说明怎么做:
必须用源码编译,不能绕过 configure 流程
Nginx 的模块列表在 configure 阶段就完全确定。你无法:
- 把第三方模块单独
make出一个.a或.o文件再手动链接 - 在已安装的 Nginx 上“追加”模块(
nginx -V不会显示,配置中也加载失败) - 使用
load_module /path/to/module.so加载绝大多数第三方模块(仅少数官方兼容模块支持,且需 ≥1.9.11 +--with-compat编译)
正确路径只有一条:下载 Nginx 源码 + 第三方模块源码 → 运行 configure 启用模块 → make && make install
正确指定 --add-module 路径
--add-module 参数必须指向模块的根目录,且该目录下必须包含 config 文件(Nginx configure 脚本靠它识别模块类型)。例如:
--add-module=/usr/src/nginx-modules/headers-more-nginx-module
常见错误:
- 路径末尾多加
/(如/module/)一般不影响,但建议不加 - 指向压缩包解压后的子目录(如
/module/src/),而非模块根目录 → configure 会静默忽略 - 模块目录里没有
config文件 → configure 报错或跳过,nginx -V中看不到模块名
复用原编译参数,避免功能丢失
执行 nginx -V 查看当前参数,尤其是:
-
--prefix、--conf-path等路径选项(确保重装后配置、日志、pid 不变) -
--with-http_ssl_module、--with-http_v2_module等已有模块(漏掉会导致功能退化) - OpenSSL、PCRE、zlib 相关参数(如
--with-openssl=...,若你同时要静态 OpenSSL,必须保留)
推荐做法:把 nginx -V 输出中的 configure arguments: 全部复制,删掉换行和反斜杠,再追加 --add-module=...。
编译后验证是否生效
成功集成后需确认两点:
-
nginx -V 2>&1 | grep -i "modules\|add"应显示你的模块名(部分模块会在输出中打印自定义字符串) - 启动时无报错,且在
nginx.conf中能正常使用该模块指令(如more_set_headers、lua_code_cache off) -
nginx -t配置检查通过,说明语法已被识别
注意:不建议用 ldd nginx 验证模块——模块是静态编译进二进制的,不会产生动态库依赖;它和 OpenSSL 静态链接是两回事。
不复杂但容易忽略











