Nginx 1.9.11起支持动态模块,需通过load_module在main上下文加载.so文件,存放于--modules-path指定目录,确保ABI兼容、权限正确,并用nginx -t验证、-s reload生效。

Nginx 从 1.9.11 版本开始正式支持动态模块(Dynamic Modules),允许在不重新编译主程序的前提下,按需加载功能模块(如 ngx_http_geoip2_module、ngx_http_headers_more_filter_module 等)。关键在于正确组织模块文件路径,并通过 load_module 指令显式声明。
确认 Nginx 支持动态模块
运行以下命令检查是否启用动态模块支持:
nginx -V 2>&1 | grep -o 'dynamic'
若输出包含 dynamic,说明已启用。同时注意输出中的 --modules-path 路径(如 /usr/lib/nginx/modules),这是官方推荐的动态模块存放目录。
将动态模块文件放入指定目录
动态模块通常为 .so 文件(如 ngx_http_geoip2_module.so)。请确保:
- 模块文件与当前 Nginx 主版本和构建参数严格兼容(建议使用相同编译环境生成)
- 文件权限为可读(如
chmod 644 /usr/lib/nginx/modules/xxx.so) - 所有模块统一放在
modules目录下,避免路径混乱
在配置中加载模块
load_module 指令必须出现在 全局块(main context),即配置文件最外层,不能写在 http、server 或 location 块内。例如:
load_module modules/ngx_http_geoip2_module.so;
load_module modules/ngx_http_headers_more_filter_module.so;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
server {
listen 80;
location / {
more_set_headers "X-Module-Loaded: true";
...
}
}
}
每行一个 load_module,路径为相对于 nginx.conf 所在目录的相对路径;也可用绝对路径(推荐)。
验证与重载
执行以下步骤确保生效:
- 语法检查:
nginx -t(若报错“module not found”,检查路径、权限或 ABI 兼容性) - 平滑重载:
nginx -s reload(无需重启进程) - 查看已加载模块:
nginx -V不显示动态模块列表,可通过模块特有指令是否被识别间接验证(如添加geoip2指令后nginx -t不报错)










