load_module是Nginx 1.9.11+官方支持的动态模块加载指令,必须置于main上下文顶部、使用绝对路径指向ABI匹配的.so文件,并通过nginx -s reload生效。

load_module 指令并不存在于标准的 Nginx、Apache、OpenResty 或主流 Web 服务器配置语法中。它不是官方支持的配置指令,也不在 Nginx 官方文档或模块开发规范里被定义。如果你在某篇教程、第三方模块文档或旧版定制环境中看到 load_module,极有可能是以下情况之一:
你实际想用的是 load_module(Nginx 1.9.11+ 的真实指令)
自 Nginx 1.9.11 起,官方引入了真正的 load_module 指令,用于**动态加载共享模块(.so 文件)**,替代编译时静态链接。这是目前唯一合法、可直接使用的 load_module。
- 该指令必须写在
main上下文(即配置文件最外层),不能放在http、server等嵌套块内 - 路径需为绝对路径,或相对于 Nginx 安装前指定的
--modules-path(默认常为/usr/lib/nginx/modules或/usr/local/nginx/modules) - 示例:
load_module /usr/lib/nginx/modules/ngx_http_geoip2_module.so; - 加载后,还需在
http块中启用对应功能(如geoip2指令),仅load_module不会自动生效 - 修改后必须
nginx -t检查语法,并nginx -s reload(非 restart)才能使新模块可用
你误把其他系统/框架的指令当成了 Nginx 配置
某些场景容易混淆:
-
OpenResty/Lua:用
require "xxx"动态加载 Lua 模块,不是 Nginx 配置指令 -
Linux 内核模块:
modprobe或insmod加载 .ko 文件,与 Web 服务无关 -
自研中间件或旧版私有 Nginx 分支:个别公司封装过名为
load_module的内部指令,但不可移植、不通用 -
拼写错误:可能是想写
include(包含配置片段)、proxy_pass(反向代理)或lua_load(已废弃)等
如何确认你的 Nginx 是否支持并正确使用 load_module
执行以下命令验证环境和操作流程:
- 查看版本:
nginx -v—— 必须 ≥ 1.9.11 - 查看已编译模块:
nginx -V 2>&1 | grep -o with-.*module,对比是否含目标模块(如with-http_geoip2_module) - 检查模块文件是否存在且可读:
ls -l /path/to/your/module.so - 在
nginx.conf顶部(events 块之前)添加:load_module /full/path/to/module.so; - 运行
nginx -t,成功才表示路径与兼容性无误
常见失败原因和应对建议
即使语法正确,load_module 仍可能静默失败或报错:
-
“module is not binary compatible”:模块编译所用 Nginx 版本、GCC 版本、configure 参数(尤其
--with-compat)与当前 Nginx 不一致 → 重新用当前环境编译模块 - “undefined symbol”:模块依赖的函数在当前 Nginx 中不存在 → 查看模块文档要求的最低 Nginx 版本
-
配置重载后功能未生效:忘记在
http或server块中配置该模块所需的指令(例如geoip2_country) -
权限问题:worker 进程用户(如
www-data)对 .so 文件无读取权限 →chmod 644 *.so && chown root:root *.so


















