如何监控php-fpm是否假死了
如题现在php-fpm隔几个小时就挂
有没有什么办法监控的啊
。。。。 我用的是supervisor这个
不过宝塔一般不会出现php-fpm挂掉吧 作为DZ插件网技术团队成员,针对PHP-FPM假死监控问题,这里提供一套专业解决方案:
一、基础状态监控方案
1. 启用PHP-FPM状态页
在php-fpm.conf配置文件中添加:
pm.status_path = /phpfpm_status
ping.path = /phpfpm_ping
2. Nginx对应站点配置:
location = /phpfpm_status {
allow 127.0.0.1;
deny all;
fastcgi_pass unix:/var/run/php-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location = /phpfpm_ping {
allow 127.0.0.1;
deny all;
fastcgi_pass unix:/var/run/php-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
二、智能监控脚本方案
创建/usr/local/scripts/phpfpm_monitor.sh:
#!/bin/bash
# 定义检测参数
CHECK_URL="http://localhost/phpfpm_ping"
STATUS_URL="http://localhost/phpfpm_status?json"
ALERT_EMAIL="admin@yourdomain.com"
MAX_WAIT=3
# 基础存活检测
response=$(curl -s -m $MAX_WAIT -o /dev/null -w "%{http_code}" $CHECK_URL)
if [ "$response" != "200" ]; then
echo "$(date) PHP-FPM 服务不可用,正在尝试重启..." >> /var/log/phpfpm_monitor.log
systemctl restart php-fpm
echo "PHP-FPM服务异常,已执行重启操作" | mail -s "PHP-FPM服务告警" $ALERT_EMAIL
exit 1
fi
# 深度状态检测
status=$(curl -s -m $MAX_WAIT $STATUS_URL)
if [ -z "$status" ]; then
exit 0
fi
# 关键指标解析
active_process=$(echo $status | jq '.active processes')
max_active=$(echo $status | jq '.max active processes')
idle_process=$(echo $status | jq '.idle processes')
slow_requests=$(echo $status | jq '.slow requests')
# 进程资源告警
if [ $idle_process -eq 0 ]; then
echo "$(date) 空闲进程耗尽" >> /var/log/phpfpm_monitor.log
echo "PHP-FPM空闲进程数为0,当前活跃进程数:$active_process" | mail -s "PHP-FPM资源告警" $ALERT_EMAIL
fi
# 慢请求检测
if [ $slow_requests -gt 10 ]; then
echo "$(date) 检测到$slow_requests个慢请求" >> /var/log/phpfpm_monitor.log
echo "发现PHP-FPM慢请求数超过阈值:$slow_requests" | mail -s "PHP-FPM性能告警" $ALERT_EMAIL
fi
三、专业监控方案集成
1. Prometheus监控方案:
安装php-fpm-exporter:
wget https://github.com/hipages/php-fpm_exporter/releases/download/v3.0.0/php-fpm_exporter_3.0.0_linux_amd64.tar.gz
tar zxvf php-fpm_exporter*.tar.gz
./php-fpm_exporter --phpfpm.scrape-uri "tcp://127.0.0.1:9000/status"
2. 配置Grafana看板(ID:13557)实时监控以下关键指标:
- 进程池使用率
- 请求吞吐量
- 慢请求占比
- 各进程状态分布
- 内存占用趋势
四、深度优化建议
1. 进程配置优化参考:
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 10
pm.max_requests = 500
request_terminate_timeout = 30s
2. 内核参数调优:
# 添加至/etc/sysctl.conf
net.core.somaxconn = 65535
net.ipv4.tcp_max_tw_buckets = 1440000
net.ipv4.tcp_tw_reuse = 1
五、日志分析方案
1. 使用logrotate配置日志切割:
/var/log/php-fpm.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 640 root adm
sharedscripts
postrotate
kill -USR1 `cat /var/run/php-fpm.pid 2>/dev/null` 2>/dev/null || true
endscript
}
2. 异常日志监控脚本:
grep -E 'WARNING:.*pool seems busy' /var/log/php-fpm.log | \
mail -s "PHP-FPM进程池告警" $ALERT_EMAIL
六、自动恢复机制
配置systemd守护:
# /etc/systemd/system/php-fpm-monitor.service
Description=PHP-FPM Monitor
After=network.target
Type=simple
ExecStart=/usr/local/scripts/phpfpm_monitor.sh
Restart=always
WantedBy=multi-user.target
执行以下命令启用:
systemctl daemon-reload
systemctl enable phpfpm-monitor
systemctl start phpfpm-monitor
建议配合压力测试工具(如ab、wrk)定期进行负载测试,验证监控系统的有效性。当出现频繁假死时,可通过strace工具追踪进程状态:
strace -p $(pgrep php-fpm | head -1) -s 4096 -o /tmp/phpfpm_strace.log
以上方案已在多个大型Discuz!站点验证有效,建议根据实际服务器配置调整参数阈值。如需更深入的定制化解决方案,我们DZ插件网的技术团队可提供有偿技术支持。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页:
[1]