Keepalived通过vrrp_script调用自定义脚本探测PHP-FPM真实可用性,需验证端口连通性或FastCGI响应,脚本返回0/非0退出码触发weight调整与VIP切换。

Keepalived 本身不直接监控 PHP-FPM 进程,必须通过自定义脚本 + vrrp_script 机制实现状态探测,再联动 VIP 漂移。核心是让 Keepalived “感知” PHP-FPM 是否真正可用,而非仅判断进程是否存在。
编写可靠的 PHP-FPM 健康检查脚本
不能只用 ps aux | grep php-fpm,要验证其能否响应 FastCGI 请求或监听端口是否就绪。推荐两种方式:
-
检查监听端口(推荐):PHP-FPM 默认监听
127.0.0.1:9000(或 socket 文件)。用nc -z 127.0.0.1 9000 -w 2测试连通性,超时即视为异常 -
调用简单 PHP 探针:部署一个轻量
/usr/share/nginx/html/health.php,内容为<?php echo 'ok'; ?>,再用curl -s http://127.0.0.1/health.php | grep -q 'ok'验证 Web 层与 PHP-FPM 协同工作正常
脚本示例(保存为 /opt/scripts/check_php.sh):
#!/bin/bash
if nc -z 127.0.0.1 9000 -w 2; then
exit 0
else
exit 1
fi
赋予执行权限:chmod +x /opt/scripts/check_php.sh
在 Keepalived 配置中集成检测逻辑
编辑 /etc/keepalived/keepalived.conf,在 global_defs 后添加 vrrp_script 块,并在 vrrp_instance 中引用:
vrrp_script chk_php_fpm {
script "/opt/scripts/check_php.sh"
interval 2
weight -5
fall 2
rise 2
}
-
interval 2:每 2 秒执行一次检测 -
weight -5:检测失败时,将当前节点优先级减 5;若减后低于备机优先级,触发主备切换 -
fall 2:连续 2 次失败才判定为宕机 -
rise 2:连续 2 次成功才恢复为健康
然后在 vrrp_instance VI_1 内加入:track_script { chk_php_fpm }
确保 Nginx 与 PHP-FPM 协同无单点故障
Keepalived 管 VIP,但后端服务仍需自身健壮:
- Nginx 配置中避免硬编码
fastcgi_pass 127.0.0.1:9000—— 若 PHP-FPM 崩溃,Nginx 日志会报connect() failed (111: Connection refused),此时 Keepalived 脚本已触发切换,用户无感知 - PHP-FPM 主配置
www.conf中开启pm.status_path = /status,配合 Nginx 可暴露运行状态页,便于人工核查 - 建议设置
php-fpm开机自启并启用 systemd 服务依赖:systemctl enable php-fpm,防止系统重启后 PHP-FPM 未启动导致检测永远失败
验证与常见问题
启动后检查关键点:
- 运行
ip a确认 VIP 是否绑定到主节点网卡 - 手动停止 PHP-FPM:
systemctl stop php-fpm,观察约 4–6 秒后 VIP 是否漂移到备机(ip a查看) - 查看 Keepalived 日志:
journalctl -u keepalived -f,搜索chk_php_fpm或Transition to MASTER等关键词
典型问题:脚本权限不足、SELinux 阻止 nc 网络访问、PHP-FPM 监听地址非 127.0.0.1(如只监听 socket)、脚本路径写错或未加可执行位。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











