nginx 从 1.9.11 版本起支持动态模块加载,需用 load_module 指令在 main 上下文加载 .so 文件,路径须正确、abi 兼容,并通过 nginx -t 验证、-s reload 生效。

从 Nginx 1.9.11 开始,官方支持通过 load_module 指令动态加载第三方模块(前提是模块已编译为 .so 共享对象),无需重新编译整个 Nginx。这是生产环境热更新模块能力的关键前提。
确认 Nginx 版本与模块编译方式
动态加载仅适用于以 --add-dynamic-module=PATH 方式编译的第三方模块(生成 .so 文件),而非 --add-module 静态链接方式。执行以下命令验证:
nginx -v # 确保 ≥ 1.9.11<br>nginx -V 2>&1 | grep -o 'dynamic'
若输出含 dynamic,说明支持动态模块;再检查目标模块是否提供 .so 文件(如 ngx_http_geoip2_module.so),通常位于 /usr/lib/nginx/modules/ 或自定义路径。
在主配置中声明 load_module 指令
load_module 必须出现在主上下文(即 nginx.conf 的最外层),且必须在 events、http 等块之前。例如:
load_module modules/ngx_http_geoip2_module.so;<br>load_module modules/ngx_http_headers_more_filter_module.so;<br><br>events { ... }<br>http { ... }- 路径为相对于 Nginx 安装前缀(
prefix)的相对路径,也可用绝对路径(推荐) - 每个
load_module一行,不可合并或加注释 - 模块加载顺序一般无依赖要求,但若存在隐式依赖(如某模块依赖另一模块导出的函数),需按依赖顺序书写
验证加载结果与重启生效
执行配置检查并重载:
nginx -t # 应提示 "syntax is ok"<br>nginx -s reload
验证是否成功加载:
- 查看错误日志:
tail -f /var/log/nginx/error.log,正常无报错;若失败会提示module "xxx" is not binary compatible(版本不匹配)或undefined symbol(符号缺失) - 运行时确认:
nginx -V 2>&1 | grep -o 'modules/.*\.so'可列出已加载的模块路径 - 部分模块会在
nginx -V输出中显示其名称(如--with-http_geoip2_module是静态编译标识,动态模块不会出现于此,需依赖日志或功能测试)
常见问题与注意事项
-
ABI 兼容性严格:模块必须由相同 Nginx 源码版本、相同编译参数(尤其
--with-cc-opt、--with-ld-opt)、相同 OpenSSL/zlib 等依赖版本编译,否则nginx -t会直接失败 -
模块不能重复加载:同一
.so文件多次load_module会导致启动失败 -
不支持卸载:已加载模块无法运行时卸载,只能修改配置后
reload(未引用的模块不再加载)或完全重启 -
权限与 SELinux:确保 Nginx worker 进程有读取
.so文件的权限;SELinux 启用时可能需设置httpd_execmem布尔值或添加自定义策略











