Nginx 自1.9.11起支持动态模块加载而非DSO热插拔,需版本≥1.9.11、configure启用dynamic、本地编译匹配ABI的.so文件,通过load_module绝对路径在配置顶部加载,reload生效且不可卸载。

Nginx 本身不原生支持 DSO(Dynamic Shared Object)机制,所谓“DSO 管理模块”是常见误解。真正可用的是 动态模块加载(Dynamic Modules),自 Nginx 1.9.11 起引入,依赖 load_module 指令和预编译的 .so 文件,不是传统 Unix 风格的 dlopen/dlsym 式热插拔。
确认是否支持动态模块
不是所有 Nginx 都能用动态模块,必须同时满足:
- 运行
nginx -v,版本 ≥ 1.9.11 - 运行
nginx -V 2>&1 | grep dynamic,输出中含dynamic字样(说明 configure 时启用了--with-dynamic-modules或类似选项) - 查看
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 - 执行
make modules,生成的.so文件在objs/目录下(如ngx_http_echo_module.so) - 将
.so复制到--modules-path对应目录,并设为可读:chmod 644 /usr/lib/nginx/modules/ngx_http_echo_module.so
在配置中声明并启用模块
load_module 是唯一入口指令,位置和写法极其关键:
- 必须放在
nginx.conf最顶部,在events { }块之前、任何其他块之外 - 必须使用绝对路径,例如:
load_module /usr/lib/nginx/modules/ngx_http_geoip2_module.so; - 不支持相对路径、通配符或变量;多模块可写多行,顺序一般无关(除非有隐式依赖)
- 修改后先运行
nginx -t验证语法,再执行nginx -s reload才会加载新模块
注意:这不是热插拔,也没有卸载能力
动态模块 ≠ DSO 热管理:
-
load_module只在 master 进程启动或reload时解析一次,worker 进程继承已加载模块 - 没有
unload_module指令,也不能运行时移除模块;要“禁用”,只能注释掉load_module行并 reload - 模块一旦加载,其指令(如
echo、geoip2_country)才可在配置中使用;否则会报 “unknown directive” 错误


















