2026/4/18 17:17:40
网站建设
项目流程
泽国镇规划建设局网站,怎么做卖卷网站,校园网门户网站建设,google doc wordpress一、核心目标与安全原则
▶ 1. 目标
暴露 /metrics 端点#xff0c;返回 Prometheus 格式指标仅允许内网 IP 访问#xff08;如 10.0.0.0/8, 192.168.0.0/16#xff09;无外部依赖#xff08;纯 PHP 实现#xff09;
▶ 2. 安全原则
禁止公网访问#xff1a;防止敏感…一、核心目标与安全原则▶ 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_longip2long($ip);$subnet_longip2long($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])){$ipexplode(,,$_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; version0.0.4; charsetutf-8);// 3. 收集指标$metrics[];// 3.1 OPcache 指标if(function_exists(opcache_get_status)){$opcacheopcache_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.重载 Nginxsudonginx -tsudosystemctl 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{stateused} 12345678# opcache_memory_usage_bytes{statefree} 87654321# ...▶ 2.公网访问拒绝# 从公网 IP 访问curlhttp://your-server/metrics# 输出Forbidden: Metrics endpoint only accessible from private networks▶ 3.Prometheus 配置# prometheus.ymlscrape_configs:-job_name:php-appstatic_configs:-targets:[your-server:80]metrics_path:/metrics五、避坑指南陷阱破局方案忽略代理 IP通过HTTP_X_FORWARDED_FOR获取真实 IP未禁用缓存添加Cache-Control: no-cache防止指标过期指标不持久化用 Redis 存储计数器如http_requests_totalOPcache 未启用检查php.ini中opcache.enable1六、终极心法**“/metrics 不是端点而是系统的脉搏——当你校验 IP你在守护安全当你暴露指标你在量化状态当你集成 Prometheus你在铸造可观测性。真正的系统掌控始于对数据的敬畏成于对细节的精控。”结语从今天起所有 PHP 服务暴露/metrics端点Nginx 强制内网访问用 Prometheus 实现秒级监控因为最好的系统稳定性不是祈祷不崩而是让每一比特都可被观测。