配置 PHP-FPM 的 ping.path 需要在 pool 配置文件中设置路径,并在 Web 服务器中放行该路径直接代理给 FPM 套接字。适用场景为负载均衡健康检查或进程存活监控,风险边界是必须限制访问来源防止信息泄露。
先说结论:ping.path 是 PHP-FPM 内置的健康检查接口,配置后需配合 Web 服务器规则放行,默认返回 pong 字符串。
- 适合:K8s 存活探针、Nginx 上游健康检查、Zabbix 自定义监控。
- 先准备:确认 php-fpm 池配置文件路径,通常位于 /etc/php/*/fpm/pool.d/。
- 验收:使用 curl 请求配置路径,预期返回 HTTP 200 和 pong 内容。
命令速用版
查看当前 ping.path 配置:
grep -r \"ping.path\" /etc/php/*/fpm/pool.d/
测试连通性(假设路径为 /ping):
curl -o /dev/null -w \"%{http_code}\" http://127.0.0.1/ping重载 PHP-FPM 配置:
systemctl reload php-fpm
为什么会这样
ping.path 是 PHP-FPM 进程管理器直接处理的请求,不经过 PHP 脚本解释器。配置该路径后,FPM 主进程会拦截匹配该 URI 的请求并直接返回 pong,用于判断 FPM 进程是否存活且可接受连接。这与执行 PHP 脚本不同,即使所有 PHP worker 忙满,只要主进程正常,ping 请求通常仍能响应。
分步处理
步骤 1:修改 PHP-FPM 池配置
找到 pool 配置文件,例如 /etc/php/8.1/fpm/pool.d/www.conf,取消注释或添加 ping.path 指令。
ping.path = /ping
步骤 2:配置 Web 服务器代理
以 Nginx 为例,需要添加 location 规则将请求转发给 FPM 套接字,且不传递 SCRIPT_FILENAME。
location = /ping {
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
allow 127.0.0.1;
deny all;
}步骤 3:重载服务
先重载 PHP-FPM 使配置生效,再重载 Nginx 应用路由规则。
systemctl reload php-fpm systemctl reload nginx
怎么验证是否生效
在服务器本地执行 curl 命令,检查状态码和响应体。
curl http://127.0.0.1/ping
正常响应内容应为纯文本 pong。如果返回 404,检查 Nginx location 配置;如果返回 403,检查 allow/deny 规则;如果返回 502/504,检查 FPM 套接字权限或进程状态。
常见坑
1. 混淆 ping.path 和 pm.status_path:前者用于存活检查返回 pong,后者用于状态监控返回详细指标,配置指令不同。
2. 权限开放过大:不要将 ping 路径暴露在公网,虽然不执行脚本,但暴露 FPM 可达性可能辅助攻击者判断后端状态。
3. Web 服务器未放行:仅在 FPM 配置 ping.path 而不配置 Nginx/Apache 转发规则,会导致 404 错误,因为 Web 服务器默认将其当作静态文件处理。
常见问题
ping.path 和 pm.status_path 有什么区别?
ping.path 仅返回 pong 用于判断存活,pm.status_path 返回 JSON 或 HTML 格式的详细进程状态数据。
默认配置下 ping.path 是什么?
不同发行版默认值不同,常见默认为 /ping 或注释状态,需查看 pool 配置文件确认。
健康检查返回 502 怎么办?
检查 PHP-FPM 进程是否运行,确认 fastcgi_pass 指向的套接字路径与 Nginx 配置一致。
参考来源
PHP Manual - FPM Configuration
URL: https://www.php.net/manual/en/install.fpm.configuration.php