news 2026/6/10 0:27:30

零基础从零到一暴露 /metrics 端点(内网访问)的庖丁解牛

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
零基础从零到一暴露 /metrics 端点(内网访问)的庖丁解牛

一、核心目标与安全原则

▶ 1.目标
  • 暴露/metrics端点,返回 Prometheus 格式指标
  • 仅允许内网 IP 访问(如10.0.0.0/8,192.168.0.0/16
  • 无外部依赖(纯 PHP 实现)
▶ 2.安全原则
  • 禁止公网访问:防止敏感指标泄露(如数据库连接数)
  • 最小权限:指标只读,无业务逻辑
  • 轻量级:单文件实现,无额外库

二、完整代码实现(单文件)

▶ 1.创建/metrics.php
<?php// metrics.php - Prometheus 指标端点(仅内网访问)// 1. 安全校验:仅允许内网 IP$allowed_networks=['10.0.0.0/8','172.16.0.0/12','192.168.0.0/16','127.0.0.1/32'];functionis_private_ip($ip){foreach($allowed_networksas$network){list($subnet,$bits)=explode('/',$network);$ip_long=ip2long($ip);$subnet_long=ip2long($subnet);$mask=-1<<(32-$bits);if(($ip_long&$mask)==($subnet_long&$mask)){returntrue;}}returnfalse;}// 获取真实 IP(支持代理)$ip=$_SERVER['REMOTE_ADDR']??'0.0.0.0';if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){$ip=explode(',',$_SERVER['HTTP_X_FORWARDED_FOR'])[0];}if(!is_private_ip(trim($ip))){http_response_code(403);exit('Forbidden: Metrics endpoint only accessible from private networks');}// 2. 设置响应头header('Content-Type: text/plain; version=0.0.4; charset=utf-8');// 3. 收集指标$metrics=[];// 3.1 OPcache 指标if(function_exists('opcache_get_status')){$opcache=opcache_get_status();$metrics[]="# HELP opcache_memory_usage_bytes OPcache memory usage";$metrics[]="# TYPE opcache_memory_usage_bytes gauge";$metrics[]="opcache_memory_usage_bytes{state=\"used\"} ".$opcache['memory_usage']['used_memory'];$metrics[]="opcache_memory_usage_bytes{state=\"free\"} ".$opcache['memory_usage']['free_memory'];$metrics[]="# HELP opcache_hit_rate OPcache hit rate";$metrics[]="# TYPE opcache_hit_rate gauge";$hit_rate=$opcache['opcache_statistics']['misses']>0?$opcache['opcache_statistics']['hits']/($opcache['opcache_statistics']['hits']+$opcache['opcache_statistics']['misses']):1;$metrics[]="opcache_hit_rate ".$hit_rate;}// 3.2 内存使用$metrics[]="# HELP php_memory_usage_bytes PHP memory usage";$metrics[]="# TYPE php_memory_usage_bytes gauge";$metrics[]="php_memory_usage_bytes ".memory_get_usage();// 3.3 请求计数(简单示例)// 生产环境建议用 Redis 或 APCu 存储计数器$metrics[]="# HELP http_requests_total Total HTTP requests";$metrics[]="# TYPE http_requests_total counter";$metrics[]="http_requests_total ".(int)getenv('REQUEST_COUNT')?:1;// 4. 输出指标echoimplode("\n",$metrics)."\n";

三、Nginx 配置(强制内网访问)

▶ 1.添加 location 块
# /etc/nginx/sites-available/your-site server { # ... 其他配置 ... location = /metrics { # 1. 仅允许内网访问 allow 10.0.0.0/8; allow 172.16.0.0/12; allow 192.168.0.0/16; allow 127.0.0.1; deny all; # 2. 转发到 PHP-FPM fastcgi_pass unix:/run/php/php8.1-fpm.sock; include fastcgi_params; fastcgi_param SCRIPT_FILENAME /var/www/html/metrics.php; # 3. 禁用缓存 expires -1; add_header Cache-Control "no-cache, no-store, must-revalidate"; } }
▶ 2.重载 Nginx
sudonginx -t&&sudosystemctl reload nginx

四、验证与测试

▶ 1.内网访问(成功)
# 从内网机器访问curlhttp://your-server/metrics# 输出示例:# HELP opcache_memory_usage_bytes OPcache memory usage# TYPE opcache_memory_usage_bytes gauge# opcache_memory_usage_bytes{state="used"} 12345678# opcache_memory_usage_bytes{state="free"} 87654321# ...
▶ 2.公网访问(拒绝)
# 从公网 IP 访问curlhttp://your-server/metrics# 输出:Forbidden: Metrics endpoint only accessible from private networks
▶ 3.Prometheus 配置
# prometheus.ymlscrape_configs:-job_name:'php-app'static_configs:-targets:['your-server:80']metrics_path:/metrics

五、避坑指南

陷阱破局方案
忽略代理 IP通过HTTP_X_FORWARDED_FOR获取真实 IP
未禁用缓存添加Cache-Control: no-cache防止指标过期
指标不持久化用 Redis 存储计数器(如http_requests_total
OPcache 未启用检查php.iniopcache.enable=1

六、终极心法

**“/metrics 不是端点,
而是系统的脉搏——

  • 当你校验 IP
    你在守护安全;
  • 当你暴露指标
    你在量化状态;
  • 当你集成 Prometheus
    你在铸造可观测性。

真正的系统掌控,
始于对数据的敬畏,
成于对细节的精控。”


结语

从今天起:

  1. 所有 PHP 服务暴露/metrics端点
  2. Nginx 强制内网访问
  3. 用 Prometheus 实现秒级监控

因为最好的系统稳定性,
不是祈祷不崩,
而是让每一比特都可被观测。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/28 21:32:13

一天一个Python库:python-dateutil - 强大的日期时间解析与计算工具

python-dateutil - 强大的日期时间解析与计算工具 一、什么是python-dateutil&#xff1f; python-dateutil 是一个用于扩展标准库 datetime 模块的 Python 库。 它可以帮助你&#xff1a; 灵活地解析各种格式的日期时间字符串。进行复杂的日期时间计算&#xff0c;例如计算…

作者头像 李华
网站建设 2026/5/30 4:47:15

Deepoc具身模型开发板:智能采摘机器人的技术突破与产业实践

在智慧农业快速发展的背景下&#xff0c;传统农业采摘环节面临劳动力短缺、作业效率低、采摘质量不稳定等现实挑战。Deepoc具身模型开发板通过创新的技术架构和产业化路径&#xff0c;为智能采摘机器人提供了核心驱动力&#xff0c;实现了从传统人工采摘向智能化精准作业的重要…

作者头像 李华
网站建设 2026/5/21 18:40:18

VSCode 附加进程调试完整指南

目录 概述附加调试 vs 启动调试配置说明使用方法常见场景调试技巧故障排除 概述 附加进程调试&#xff08;Attach Debugging&#xff09;是一种强大的调试技术&#xff0c;允许调试器附加到已经运行的进程上&#xff0c;而不需要从调试器启动程序。这在以下场景特别有用&…

作者头像 李华
网站建设 2026/6/9 0:57:53

索洛模型的核心观点对现代经济增长理论有哪些影响?

罗伯特・索洛提出的新古典增长模型&#xff08;索洛模型&#xff09;是现代经济增长理论的奠基性框架&#xff0c;其核心观点彻底颠覆了传统增长理论的认知逻辑&#xff0c;不仅重塑了经济学家对经济增长驱动因素的理解&#xff0c;更催生了后续诸多分支理论的发展&#xff0c;…

作者头像 李华
网站建设 2026/6/7 10:43:26

学长亲荐!MBA开题报告必备TOP10一键生成论文工具深度测评

学长亲荐&#xff01;MBA开题报告必备TOP10一键生成论文工具深度测评 2026年MBA开题报告写作工具测评&#xff1a;精准筛选&#xff0c;高效助力 MBA学员在撰写开题报告时&#xff0c;常常面临选题方向不明确、文献资料繁杂、格式要求严格等挑战。面对这些痛点&#xff0c;一款…

作者头像 李华