确认nginx模块支持需分静态与动态:静态查nginx -v | grep with-http_模块名_module或add-module=;动态查配置中load_module、.so文件存在性及nginx -t是否报错。

要确认 Nginx 是否支持某个指定模块,关键在于区分它是**静态编译进二进制**的,还是**以动态模块(.so)形式加载**的。两者验证方式完全不同,不能只靠一个命令就下结论。
查静态编译模块:用 nginx -V + grep
运行 nginx -V 2>&1 | grep -o with-http_模块名_module(注意大小写和下划线),例如:
- 查 SSL 支持:
nginx -V 2>&1 | grep -o with-http_ssl_module - 查 HTTP/2 支持:
nginx -V 2>&1 | grep -o with-http_v2_module - 查真实 IP 解析:
nginx -V 2>&1 | grep -o with-http_realip_module - 查第三方模块是否编译过:
nginx -V 2>&1 | grep 'add-module='
有输出说明该模块在编译时已集成;无输出则肯定不支持(除非是动态模块)。
查动态模块是否已声明并可用
动态模块不会出现在 nginx -V 输出中,必须检查三处:
- 配置文件里是否有
load_module modules/xxx.so;指令(必须在events块之前) - 对应
.so文件是否真实存在,路径是否匹配(如/usr/lib/nginx/modules/ngx_http_echo_module.so) - 执行
nginx -t—— 若报dlopen() failed或undefined symbol,说明模块加载失败;若提示syntax is ok,说明该模块已成功加载
查指令是否被识别(功能级验证)
模块加载成功 ≠ 功能可用。还需确认配置中使用的指令能被识别:
- 在配置中搜索你关心的指令,比如
echo "hello";、brotli on;、lua_code_cache off; - 运行
nginx -t,若报unknown directive "xxx",说明模块未加载或未编译 - 更准的方式是用
nginx -T输出完整生效配置,再定位该指令所在上下文,判断是否缺load_module或位置错误(如stream指令写在http块内)
终端直出错误,绕过日志系统
模块加载失败常发生在日志初始化前,error.log 可能为空。此时应强制错误输出到屏幕:
- 运行
nginx -c /etc/nginx/nginx.conf -e stderr - 常见输出:
[emerg] unknown directive "geoip2_country"(模块没加载)、[emerg] dlopen() ... failed: undefined symbol: ngx_http_upstream_init_request(ABI 不兼容)











