必须先确认Nginx版本≥1.9.11且编译启用with-compat支持,再用匹配源码和--add-dynamic-module参数本地编译生成.so文件,load_module须置于nginx.conf最顶部、用绝对路径声明,权限可读且ABI兼容,最后通过nginx -t校验、-s reload生效并查error.log验证。

不能直接在配置中“启用”第三方 .so 模块——必须先确认该模块支持动态加载,且已用匹配的 Nginx 源码正确编译生成 .so 文件。Nginx 本身不提供运行时兼容层,load_module 只是加载入口,不是万能插件接口。
确认 Nginx 支持动态模块
执行以下命令检查:
-
nginx -v确保版本 ≥ 1.9.11 -
nginx -V 2>&1 | grep -o with-compat—— 输出有with-compat才表示编译时启用了动态模块兼容支持 - 若无输出,说明当前 Nginx 不支持加载任何动态模块,需重新编译或更换版本
确保第三方模块已正确编译为 .so
绝大多数第三方模块(如 ngx_http_geoip2_module、ngx_brotli)默认不提供动态编译支持。必须满足:
- 使用与当前运行 Nginx 完全相同版本号 的源码(例如正在运行 1.22.1,就必须用 nginx-1.22.1.tar.gz)
- 配置时加入
--with-compat --add-dynamic-module=/path/to/module - 执行
make modules(不是make install),生成objs/xxx.so - 模块源码中必须正确定义
ngx_module_t结构体,并适配 Nginx 动态 ABI
在 nginx.conf 中加载模块
load_module 必须写在配置文件最顶层(events 或 http 块之外),每行一条,路径推荐用绝对路径:
load_module /usr/lib/nginx/modules/ngx_http_geoip2_module.so;- 路径必须可读,Nginx 工作进程用户(如
www-data或nginx)要有读取权限 - 不能加注释,不能合并多条,不能放在
http{}内部 - 如有依赖关系(如某模块调用另一模块导出函数),需按依赖顺序书写
验证是否加载成功
执行以下操作确认效果:
-
nginx -t:语法正确不代表模块加载成功,仅校验配置格式 -
nginx -s reload后观察/var/log/nginx/error.log—— 成功无报错;失败常见提示:module "xxx" is not binary compatible(版本/ABI 不匹配)或undefined symbol(符号缺失) - 功能测试:如模块提供新指令(如
geoip2、echo),在 location 中使用并访问验证 -
nginx -V不会显示动态模块名,但可通过grep -r "xxx\.so" /etc/nginx/或日志确认路径是否被引用


















