load_module仅用于启动时加载动态.so模块,必须置于nginx.conf最顶层main上下文、events块之前,使用绝对路径且权限为644;加载后需在http/server块中显式启用对应指令,并通过error.log和nginx -v验证是否成功。

load_module 指令不是用来引入配置文件或业务逻辑的,它只做一件事:在 Nginx 启动时加载一个编译好的动态模块(.so 文件),让新功能(比如 geoip2、echo、brotli)可用。用错位置、路径或时机,Nginx 就会直接启动失败。
必须放在最顶层(main 上下文)
它不能出现在 http、server、location 或任何 include 进来的配置文件里——只允许写在 nginx.conf 的最开头,events { } 块之前、所有其他块之外:
- ✅ 正确位置示例:
load_module /usr/lib/nginx/modules/ngx_http_echo_module.so;
events { ... }
http { ... }
- ❌ 错误写法(任意嵌套、注释、合并、include 中)都会报
"load_module" directive is not allowed here
路径必须是绝对路径且可读
相对路径(如 modules/xxx.so)会被解析为相对于 nginx.conf 所在目录,极易出错;Nginx 主进程(通常是 root)和 worker 进程都必须能读取该文件:
- 确保路径完整准确,例如:
/usr/lib/nginx/modules/ngx_http_geoip2_module.so - 执行
chmod 644 /path/to/module.so,避免权限拒绝 - SELinux 或 AppArmor 启用时,需额外放行该路径(否则静默失败)
加载后还需显式启用功能
load_module 只是“载入”,不代表功能自动生效。你必须在 http 或 server 块中使用该模块提供的指令,才算真正启用:
- 比如加载了 echo 模块,就得写
location /test { echo "hello"; } - 加载了 brotli 模块,就得在
http块中配置brotli on;等指令 - 缺少对应指令,模块虽已加载,但请求中完全无反应
验证是否真正成功
别只信 nginx -t ——它只检查语法,不校验模块能否加载:
- 运行
nginx -s reload,观察终端是否报错 - 查错误日志:
tail -f /var/log/nginx/error.log,重点关注:
•module "xxx" is not binary compatible(版本或 ABI 不匹配)
•undefined symbol: ...(依赖缺失,如没装 libmaxminddb)
•failed to load module(路径错、权限不足、文件损坏) - 确认已加载:
nginx -V 2>&1 | grep '\.so'列出实际载入的模块路径











