Nginx中实现/metrics路径白名单控制需在location块中配置allow/deny指令,优先允许指定内网IP段(如10.10.0.0/16)和监控服务器(如172.16.5.100),默认deny all,并注意匹配顺序;若前置有负载均衡,须启用real_ip模块解析X-Forwarded-For头以确保基于真实客户端IP鉴权。

在 Nginx 中实现监控指标采集的白名单控制,核心是限制 /metrics(或你自定义的指标路径)仅允许内网运维监控系统(如 Prometheus)访问,其他来源一律拒绝。这通常通过 allow/deny 指令结合 location 块完成,需注意 IP 匹配顺序和默认拒绝策略。
1. 明确监控指标暴露路径
确认你的指标接口路径。常见情况有:
- Nginx 自身不直接暴露指标,需借助 nginx-module-vts、nginx-prometheus-exporter 或 OpenResty 的 lua-resty-prometheus
- 若使用
nginx-prometheus-exporter(独立进程,默认监听:9113/metrics),则 Nginx 不负责该路径,白名单需在 exporter 进程或前置反代中配置 - 若通过 Nginx 反向代理暴露指标(例如将
/metrics代理到 exporter),则白名单应加在 Nginx 的location /metrics块中
2. 配置 location 白名单(推荐方式)
假设你用 Nginx 反代 Prometheus Exporter,且只允许内网段 10.10.0.0/16 和监控服务器 172.16.5.100 访问 /metrics:
location /metrics {
# 默认拒绝所有
deny all;
<pre class="brush:php;toolbar:false;"># 允许指定内网段
allow 10.10.0.0/16;
allow 172.16.5.100;
# 代理到本地 exporter
proxy_pass http://127.0.0.1:9113;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;}
注意:allow/deny 顺序必须从上到下,且 deny all 必须放在最后(或显式置于末尾),否则会被提前覆盖;Nginx 按匹配顺序执行,**第一个满足的规则生效**。
3. 验证真实客户端 IP(避免绕过)
如果 Nginx 前还有负载均衡(如云 LB、HAProxy),真实源 IP 可能被覆盖为 LB 的内网 IP。此时需:
- 确保上游设备设置
X-Forwarded-For头 - 在 Nginx 中启用
real_ip模块解析可信代理 IP - 示例配置:
set_real_ip_from 10.10.1.0/24; # 上游 LB 网段 real_ip_header X-Forwarded-For; real_ip_recursive on;
之后 allow/deny 判断将基于解析出的真实客户端 IP,而非代理 IP。
4. 可选:返回友好提示或隐藏错误
为避免暴露服务细节,可自定义拒绝响应:
location /metrics {
deny all;
allow 10.10.0.0/16;
allow 172.16.5.100;
<pre class="brush:php;toolbar:false;">proxy_pass http://127.0.0.1:9113;
# 拒绝时返回 403 且不泄露后端信息
error_page 403 /403.html;
location = /403.html {
internal;
default_type text/plain;
return 403 "Access denied to metrics endpoint.\n";
}}
配置完成后重载 Nginx:nginx -t && nginx -s reload,再从允许 IP 和非允许 IP 分别测试 curl -I http://your-domain/metrics 验证状态码是否符合预期。











