load_module指令必须置于nginx.conf最顶部全局上下文,使用绝对路径单行书写;要求nginx≥1.9.11、启用dynamic支持、模块abi匹配且权限正确;加载后需在对应配置块中显式调用模块指令才能生效。

直接在 nginx.conf 最顶部写 load_module 指令,路径用绝对路径,放在所有配置块(events、http 等)之前,不能嵌套、不能注释、不能合并多行。
load_module 的位置和语法要求
这条指令只允许出现在全局上下文(main context),也就是配置文件最开头,events { } 块之前、http { } 块之外。任何其他位置都会报错,比如写在 http 里会提示 "load_module" directive is not allowed here。
- 每行只能有一个
load_module,例如:load_module /usr/lib/nginx/modules/ngx_http_geoip2_module.so; - 不能加
#注释,也不能用分号或逗号连写多个模块 - 路径必须可读,Nginx 主进程需有权限访问(注意 SELinux 或文件权限限制,如
chmod 644) - 不支持相对路径的可靠解析,强烈建议用绝对路径,避免因
--prefix变更失效
加载前必须确认的基础条件
不是所有 Nginx 都能用 load_module,得先验证运行环境是否支持:
- 版本 ≥ 1.9.11:执行
nginx -v查看,低于该版本无此指令 - 二进制启用了 dynamic 支持:运行
nginx -V 2>&1 | grep dynamic,有输出才可用 - 模块本身是动态编译的
.so文件,且与当前 Nginx 版本 ABI 完全匹配(不能混用别人编译的、不同版本的 .so) - 模块存放路径建议与
nginx -V中的--modules-path一致,减少路径歧义
加载后如何让功能真正生效
load_module 只是把模块载入内存,不等于功能自动开启。你还得在后续配置中显式调用该模块提供的指令:
- 比如加载了
headers-more-nginx-module,就得在server或location块里写more_set_headers "X-Custom: true"; - 加载了
ngx_http_geoip2_module,就得在http块里配geoip2 /usr/share/GeoIP/GeoLite2-Country.mmdb ... - 有些模块(如仅提供内部钩子)无需额外配置,加载即生效,但这类情况较少
验证模块是否成功加载
不能只靠 nginx -t 通过就认为成功,要分步确认:
- 先运行
nginx -t:检查语法是否合法(但不校验模块能否加载) - 再执行
nginx -s reload:观察是否报错,失败时立即查/var/log/nginx/error.log - 常见错误包括:
module "xxx" is not binary compatible(ABI 不匹配)、failed to load module(路径错或权限不足)、undefined symbol(依赖缺失) - 运行时确认:用
nginx -V 2>&1 | grep -o 'modules/.*\.so'列出已加载的模块路径 - 最后做功能测试:发请求验证对应指令是否实际起作用(如响应头是否新增、变量是否可取值)











