更新nginx第三方动态模块需重新编译模块本身(不重编nginx),替换.so文件并重载配置;前提为nginx≥1.9.11且原模块以--add-dynamic-module构建,需验证动态模块支持、获取模块路径、在同版本源码下用configure --add-dynamic-module和make modules编译,再备份替换.so、nginx -t校验、nginx -s reload生效。

更新 Nginx 第三方动态模块,核心是**重新编译模块本身(不重编整个 Nginx)**,再替换旧的 .so 文件并重载配置。前提是你的 Nginx 版本 ≥ 1.9.11,且原模块是以 --add-dynamic-module 方式构建的。
确认当前环境支持动态模块
执行以下命令验证:
-
nginx -v—— 确保版本 ≥ 1.9.11 -
nginx -V 2>&1 | grep -o "dynamic"—— 若有输出,说明支持动态模块机制 -
nginx -V 2>&1 | grep "modules-path"—— 记下模块存放路径(如/usr/lib64/nginx/modules或/usr/local/nginx/modules)
下载并编译新版动态模块
进入与当前 Nginx **完全一致版本**的源码目录(例如 /usr/src/nginx-1.22.1),然后:
- 拉取或解压目标模块新版源码(如
ngx_http_geoip2_module),确保其config文件存在 - 运行 configure 命令,仅启用动态模块构建:
./configure --add-dynamic-module=/path/to/new-module
⚠️ 不要加其他--with-xxx参数,也不用指定--prefix—— 此步只生成模块,不构建 Nginx 主程序 - 执行
make modules(不是make或make install) - 编译成功后,在
objs/目录下会生成一个.so文件,例如ngx_http_geoip2_module.so
替换模块并生效
按顺序操作,全程不影响线上服务:
- 备份旧模块:
cp /usr/lib64/nginx/modules/ngx_http_geoip2_module.so{,.bak} - 复制新模块到相同路径,覆盖旧文件
- 检查语法:
nginx -t—— 必须通过,否则可能因 ABI 不兼容失败 - 重载配置使新模块加载:
nginx -s reload - 验证是否加载成功:
nginx -V 2>&1 | grep -i geoip2或查看error.log中模块初始化日志
注意事项
动态模块更新不是“热插拔”,它依赖 Nginx 主进程在 reload 时重新加载 .so。若模块内部状态不可重入(如某些 Lua 共享字典或 C 静态变量未清理),仍需谨慎测试。另外,模块升级后若依赖新版 Nginx API,务必确认其 config 脚本中声明的 NGX_MODULE_VERSION 兼容范围。











