nginx 本身不内置监控探针,但可通过专用配置目录(如 /etc/nginx/conf.d/probe/)+ include 加载 + internal/stub_status 等指令实现轻量、隔离、可维护的健康检查能力,并支持与 keepalived 等高可用组件联动。

Nginx 本身不内置“监控探针”功能,但可通过标准配置机制 + 自定义 location + 健康检查脚本(如 /healthz、/status)实现轻量级探针能力。要让这类探针配置清晰、可维护、不干扰主业务,关键在于在目录结构中为其建立专用、隔离、可复用的配置文件目录,而非硬编码进主配置。
以下是具体做法,适用于主流 Linux 发行版(Ubuntu/Debian/CentOS/RHEL),兼顾包管理安装与源码安装场景:
专用探针配置目录的规划与创建
目标是将探针相关配置(如健康检查 endpoint、状态页、自定义返回逻辑)从 nginx.conf 主文件中解耦,统一收口到独立目录。
-
推荐路径:
/etc/nginx/conf.d/probe/(包管理安装)或/usr/local/nginx/conf/conf.d/probe/(源码安装) -
创建命令:
sudo mkdir -p /etc/nginx/conf.d/probe
-
权限设置(避免被意外修改):
sudo chown root:root /etc/nginx/conf.d/probe sudo chmod 755 /etc/nginx/conf.d/probe
⚠️ 注意:该目录需被主配置显式
include,否则不会生效。确认/etc/nginx/nginx.conf中存在这一行(通常默认已有):include /etc/nginx/conf.d/*.conf;它会递归加载
.conf文件,但不自动扫描子目录 —— 所以必须单独 include 探针目录,例如:include /etc/nginx/conf.d/probe/*.conf;
探针配置文件的标准化命名与内容
在 /etc/nginx/conf.d/probe/ 下新建文件,例如 health-check.conf,内容示例:
# /etc/nginx/conf.d/probe/health-check.conf
location /healthz {
internal; # 仅允许内部请求(如 keepalived 或上游 LB 调用),禁止外部直接访问
return 200 'OK\n';
add_header Content-Type text/plain;
}
location /status {
stub_status on; # 启用 Nginx 内置状态页(需编译时含 http_stub_status_module)
access_log off;
allow 127.0.0.1; # 仅允许本地或指定监控 IP 访问
deny all;
}
-
internal指令确保/healthz不被公网暴露,适合用于 keepalived 的vrrp_script脚本调用; -
stub_status是最轻量的状态探针,返回活跃连接数等基础指标; - 所有探针 location 应避免影响
server级别的root或index,保持无侵入性。
与高可用组件(如 Keepalived)联动的关键点
Keepalived 依赖探针返回状态判断 Nginx 是否存活。典型做法是在 /etc/keepalived/keepalived.conf 中定义检测脚本:
vrrp_script chk_nginx {
script "/usr/bin/curl -f http://127.0.0.1/healthz >/dev/null 2>&1"
interval 2
fall 2
rise 2
}
- 此脚本依赖 Nginx 已加载
health-check.conf并监听127.0.0.1; - 若你使用
stub_status,可改用curl -f http://127.0.0.1/status | grep Active等更严格校验; -
务必测试:
sudo nginx -t && sudo systemctl reload nginx后,手动执行 curl 验证返回是否符合预期。
补充建议:避免常见陷阱
- 不要把探针配置写在
sites-enabled/下——那是为虚拟主机准备的,探针应全局生效或按需注入到特定 server 块; - 不要直接修改
nginx.conf主文件添加 location——破坏可维护性,升级时易被覆盖; - 如果使用 Docker,把
/etc/nginx/conf.d/probe/映射为 volume,便于配置热更新; - 日志可单独隔离:在探针 location 中加
access_log /var/log/nginx/probe-access.log;,方便审计。
不复杂但容易忽略。











