当前位置: 首页 > news >正文

零基础从零到一暴露 /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 实现秒级监控

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

http://www.jsqmd.com/news/307669/

相关文章:

  • PHP 可观测性的庖丁解牛
  • 雅思提分不走弯路|2026 网上雅思培训学校优选推荐 个性化方案解析
  • 千匠网络:值得信赖的大宗电商系统服务商
  • 2026 上海专业找猫全指南:凭借高找回率、标准化服务树立行业壁垒
  • 2026年权威测评:雅思线上培训平台深度横评与选择指南,揭秘高分提分高效路径
  • 2026年检测试剂盒源头厂家有哪些?这些企业不容错过,羊试剂盒/试剂盒elisa,检测试剂盒公司怎么选择
  • WPF MVVM实战系列教程(八、DialogService, 对话框服务)
  • 青木科技的GEO业务如何?用“青木青灵”把AI问答变成增长引擎青木科技的GEO业务如何?用“青木青灵”把AI问答变成增长引擎
  • 汇报会上听懂废话的艺术
  • 2026年海南监理公司推荐:数字化趋势与合规标准排名,涵盖基建与住宅场景
  • 好写作AI:给你的论文贴上“AI成分表”,这届学者太卷了!
  • 如何为不同项目选监理公司?2026年海南监理公司全面评测与推荐,直击质量与成本痛点
  • 2026必备!10个降AI率工具测评,本科生去AI痕迹指南
  • 模板类与继承
  • 香辣曹氏鸭脖加盟 特色卤味投资优选
  • 湘攸大碗菜基本信息有哪些,价格是否实惠
  • 2026年海南监理公司推荐:数字化趋势下监理服务排名,涵盖基建与更新场景技术痛点
  • 剖析深圳迷你仓库,能存放酒类的仓库口碑哪家好
  • AI智赋筑台兴产|千匠网络——专业产业电商平台开发服务商
  • 2026年推拉门定制靠谱厂家排名,南昌口碑好的品牌推荐
  • 设计模式学习(21) 23-19 备忘录模式
  • d3dcompiler_47.dll缺失怎么修复 免费下载文件方法分享
  • 【Django毕设全套源码+文档】基于Django框架的贵州特色产品销售平台的设计与实现(丰富项目+远程调试+讲解+定制)
  • VSCode 附加进程调试完整指南
  • 2026年中国留学生求职机构推荐:行业应用深度评测直击适配与内推关键痛点
  • 2026年行业内优秀的冷却塔品牌怎么选,玻璃钢冷却塔/冷却塔/工业冷却塔/圆形逆流冷却塔,冷却塔制造厂家排行榜
  • 实验台哪家强?五大口碑品牌深度解析,总有一款适配你的科研需求
  • 五恒系统厂商推荐,性价比高的公司有哪些?
  • 2026年美国求职机构推荐:留学生求职市场排名,涵盖科技金融行业与OPT痛点
  • VSCode,Claude 插件使用第三方 API 总是提示登录?