Nginx动态模块加载非热插拔,而是通过load_module指令配合nginx -s reload实现;Master仅校验路径与ABI并预加载,Worker进程启动时才初始化并启用功能。

运行时加载新模块不是“热插拔”,而是通过 load_module 指令 + nginx -s reload 实现的配置驱动式加载。Nginx 主进程只做路径校验和句柄预加载,真正启用功能在 Worker 进程启动时完成。
确认 Nginx 支持动态模块
不满足任一条件,load_module 会失效或报错:
- 运行
nginx -v,版本必须 ≥ 1.9.11 - 运行
nginx -V 2>&1 | grep -o with-compat,有输出表示 ABI 兼容支持已启用 - 运行
nginx -V 2>&1 | grep -o dynamic,有输出说明二进制支持加载.so - 从
nginx -V输出中找到--modules-path(如/usr/lib/nginx/modules),这是推荐存放模块的位置
编译与部署模块文件
第三方模块不能直接使用他人编译好的 .so,必须本地编译,确保 ABI 完全一致:
- 下载与当前 Nginx 完全同版本 的源码包(例如你用的是
nginx-1.24.0,就下对应源码) - 进入源码目录,执行:
./configure --add-dynamic-module=/path/to/your/module --with-compat
若原 Nginx 使用了自定义 OpenSSL/PCRE/zlib 路径,这里也需一并带上 - 执行
make modules,生成的.so文件位于objs/目录下(如objs/ngx_http_vts_module.so) - 复制到模块路径:
sudo cp objs/ngx_http_vts_module.so /usr/lib/nginx/modules/ - 设置读权限:
sudo chmod 644 /usr/lib/nginx/modules/ngx_http_vts_module.so
在配置中声明并生效
load_module 是唯一入口指令,位置和写法极其关键:
- 必须放在
nginx.conf最顶部,在events { }块之前、任何其他块之外 - 必须使用绝对路径,例如:
load_module /usr/lib/nginx/modules/ngx_http_vts_module.so;
相对路径(如modules/xxx.so)会基于nginx.conf所在目录解析,极易出错 - 可多行声明多个模块,顺序无关;但若存在依赖关系(如某模块依赖 stream 模块),应将被依赖模块写在前面
- 修改后务必执行
nginx -t测试语法,再执行nginx -s reload触发加载
验证是否真正生效
reload 后不要只看配置是否通过,还要查实际行为:
- 检查
error.log:ABI 不匹配常表现为undefined symbol,路径错误则报module not found - 执行
nginx -V不会显示已加载模块,它只反映编译参数 - 模块功能是否可用,取决于其自身配置是否启用(如
vhost_traffic_status on;或brotli on;),这些需写在http或server块内 - Worker 进程启动时才调用模块的
init_process钩子,因此功能真正激活发生在 reload 后新 Worker 接管请求时


















