Nginx 从1.9.11版本起支持动态模块加载,通过load_module指令在main上下文声明.so文件并执行nginx -s reload生效;需满足版本≥1.9.11、编译启用dynamic、ABI兼容、绝对路径配置且权限正确。

Nginx 从 1.9.11 版本开始支持动态模块(Dynamic Modules),允许在不重新编译整个 Nginx 的前提下,通过 load_module 指令加载独立编译的模块。这大大提升了模块扩展的灵活性和运维效率。
确认 Nginx 版本与动态模块支持
运行以下命令检查:
nginx -v
确保版本 ≥ 1.9.11;再执行:
nginx -V 2>&1 | grep -o "dynamic"
若输出 dynamic,说明编译时启用了动态模块支持(需 configure 时带 --with-dynamic-modules 或默认启用)。
获取或编译动态模块文件(.so)
动态模块必须是编译生成的共享对象文件(如 ngx_http_geoip2_module.so),常见方式有:
- 从第三方模块源码编译:需使用与当前 Nginx 完全一致的源码、configure 参数及编译器,执行
./configure --add-dynamic-module=/path/to/module,然后make(注意不要make install);生成的.so文件在objs/目录下 - 使用包管理器安装(如 Ubuntu 的
nginx-module-geoip2),模块通常放在/usr/lib/nginx/modules/ - 确认模块 ABI 兼容:模块必须由相同主版本(如 1.22.x)的 Nginx 源码编译,否则启动会报错
module "<name>" is not binary compatible</name>
在配置中加载模块
load_module 指令只能出现在主配置块(main context),即 nginx.conf 的最外层,且必须在 events 和 http 块之前:
load_module modules/ngx_http_geoip2_module.so;
events { ... }
http { ... }
注意要点:
- 路径为相对于 Nginx 安装前缀(prefix)的相对路径;也可写绝对路径,如
/usr/lib/nginx/modules/ngx_http_headers_more_filter_module.so - 一个模块只能
load_module一次;重复加载会导致启动失败 - 加载后,该模块提供的指令(如
geoip2、more_set_headers)才可在配置中使用
验证与重启
执行语法检查:
nginx -t
若提示 module "<name>" is not binary compatible</name>,说明模块与当前 Nginx 不匹配;若提示 unknown directive,说明模块未成功加载或指令拼写错误。确认无误后重载:
nginx -s reload
可通过 nginx -V 查看已加载的模块列表(部分版本会显示 loaded modules 行),或观察 error log 中是否出现模块初始化日志。


















