nginx动态模块支持热更新:需编译为.so文件、配置load_module指令加载,通过nginx -s reload切换新旧版本,无需重启;静态模块不支持,必须升级整个nginx二进制。

运行时不能直接“替换”动态模块文件本身,但可以安全地加载新版本动态模块并停用旧版本,前提是模块支持热加载且已正确编译为 .so 文件。Nginx 本身不提供“卸载模块”的机制,所谓“更新”,本质是先加载新模块、再通过配置切换生效、最后清理旧文件,全程无需重启或中断服务。
确认模块是否为动态类型
只有以 .so 形式存在的模块才支持运行时加载。静态模块(编译进 nginx 二进制)无法热更新,必须走完整热升级流程。
- 检查当前已加载的动态模块:查看配置中是否有
load_module指令,例如load_module modules/ngx_http_brotli_filter_module.so; - 确认模块文件存在且路径正确:
ls -l /usr/lib/nginx/modules/ngx_http_brotli_filter_module.so - 若模块是静态编译的(如通过
--add-module直接编译进 nginx),则不属于此场景,需升级整个 nginx 二进制
编译并部署新版本动态模块
新版模块必须与当前运行的 Nginx 主版本、ABI 兼容(推荐使用相同源码树 + --with-compat 编译)。
- 下载对应 Nginx 源码(如
nginx-1.24.0),解压后进入目录 - 使用兼容模式编译模块:
./configure --with-compat --add-dynamic-module=/path/to/module && make modules - 生成的
.so文件在objs/下,复制到模块目录(如/usr/lib/nginx/modules/),建议重命名带版本号,例如ngx_http_brotli_filter_module_v1.0.3.so - 备份旧模块文件(非必需但强烈推荐):
cp ngx_http_brotli_filter_module.so ngx_http_brotli_filter_module.so.bak
切换配置并平滑生效
模块加载本身不触发 reload,但启用新模块必须修改配置并执行 nginx -s reload —— 这一步是安全的,属于配置热重载,不中断连接。
- 编辑
nginx.conf,将load_module指向新模块路径:load_module modules/ngx_http_brotli_filter_module_v1.0.3.so; - 验证语法:
nginx -t(必须返回success) - 重载配置:
nginx -s reload,主进程会加载新模块、启动新 worker,旧 worker 处理完存量请求后退出 - 确认新模块已加载:
nginx -V 2>&1 | grep -i "brotli"或检查 error.log 中模块初始化日志
清理与回退准备
旧模块文件不会自动删除,也不影响运行,但应保留一段时间用于快速回退。
- 若新模块异常,立即改回配置中
load_module指向旧.so文件,再执行nginx -s reload - 确认服务恢复后,可手动删除旧模块文件(如
rm /usr/lib/nginx/modules/ngx_http_brotli_filter_module.so.bak) - 注意:不要在 Nginx 运行时直接覆盖正在使用的
.so文件,可能引发 dlopen 失败或段错误











