news 2026/4/4 23:55:55

零基础从零到一暴露 /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/3/17 22:55:12

设计模式学习(21) 23-19 备忘录模式

文章目录 0. 个人感悟1. 概念2. 适配场景2.1 适合的场景2.2 常见场景举例 3. 实现方法3.1 实现思路3.2 UML类图3.3 代码示例 4. 优缺点4.1 优点4.2 缺点 5. 源码分析5.1 Java Swing中的UndoManager 0. 个人感悟 备忘录模式的场景也比较专。适合进行备份、恢复模式优点很明显&a…

作者头像 李华
网站建设 2026/4/2 21:52:04

Wilcoxon秩和检验

下面内容摘录自《用R探索医药数据科学》专栏文章的部分内容&#xff08;原文5762字&#xff09;。 2篇3章9节&#xff1a;组间差异的非参数检验&#xff0c;Wilcoxon秩和检验和Kruskal-Wallis检验-CSDN博客 在实际数据分析过程中&#xff0c;我们经常会遇到数据无法满足假设检…

作者头像 李华
网站建设 2026/4/4 5:37:28

动态形状、稀疏计算等高级特性昇腾实战

一、动态形状处理深度指南 1.1 动态形状基础与配置 # dynamic_shape_basics.py import mindspore as ms import mindspore.nn as nn import mindspore.ops as ops import numpy as np from typing import Tuple, Optional, Unionclass DynamicShapeConfig:"""…

作者头像 李华
网站建设 2026/3/25 16:04:26

Transform:Beam数据转换操作的抽象方法.md

你好&#xff0c;我是程序员贵哥。 今天我要与你分享的主题是“Beam数据转换操作的抽象方法”。 在上一讲中&#xff0c;我们一起学习了Beam中数据的抽象表达——PCollection。但是仅仅有数据的表达肯定是无法构建一个数据处理框架的。那么今天&#xff0c;我们就来看看Beam中…

作者头像 李华
网站建设 2026/4/2 15:23:05

他拉唑帕利talazoparib常见副作用管理:骨髓抑制与疲劳的监测应对策略

他拉唑帕利在治疗过程中可能引发多种副作用&#xff0c;其中骨髓抑制与疲劳最为常见&#xff0c;需通过系统化监测与针对性干预&#xff0c;以保障患者生活质量与治疗连续性。骨髓抑制&#xff1a;分级监测与动态调整骨髓抑制是他拉唑帕利最突出的副作用之一&#xff0c;表现为…

作者头像 李华
网站建设 2026/4/4 20:50:15

让机器人“看清”三维世界,蚂蚁灵波开源LingBot-Depth模型

空间智能迎来重要开源进展。1月 27 日&#xff0c;蚂蚁集团旗下具身智能公司灵波科技宣布开源高精度空间感知模型 LingBot-Depth。该模型基于奥比中光 Gemini 330 系列双目 3D 相机提供的芯片级原始数据&#xff0c;专注于提升环境深度感知与三维空间理解能力&#xff0c;旨在为…

作者头像 李华