请求编写监控Apache日志并自动重启PHP-FPM的Shell脚本
解决方案:Apache错误触发PHP-FPM自动重启脚本
问题背景
使用cPanel托管的网站在流量峰值(未知访问、爬虫或DOS攻击)时,常因PHP-FPM故障抛出503错误,对应的Apache错误日志包含以下两种特征信息:
[proxy:error] [pid 32549] (111)Connection refused: AH02454: FCGI: attempt to connect to Unix domain socket /opt/cpanel/ea-php74/root/usr/var/run/php-fpm/c31dac5ed583d707687865fef34d1a67.sock (*:80) failed
或
[proxy_fcgi:error] [pid 32549] [client 20.40.43.219:64380] AH01079: failed to make connection to backend: httpd-UDS
需要实现实时监控Apache错误日志,匹配到上述任一错误时自动重启PHP-FPM,未匹配时定期记录当前PHP-FPM进程数到日志。
实现脚本
#!/usr/bin/env bash # 配置参数(根据实际环境调整) APACHE_ERROR_LOG="/usr/local/apache/logs/error_log" # cPanel默认Apache错误日志路径 PHP_FPM_SERVICE="ea-php74-php-fpm.service" LOG_FILE="/opt/httpd/php-fpm-autorestart.log" # 重启PHP-FPM并记录日志 restart_php_fpm() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] 检测到PHP-FPM连接错误,启动重启流程..." >> "$LOG_FILE" systemctl restart "$PHP_FPM_SERVICE" >> "$LOG_FILE" 2>&1 if [ $? -eq 0 ]; then echo "[$(date '+%Y-%m-%d %H:%M:%S')] PHP-FPM服务重启成功" >> "$LOG_FILE" else echo "[$(date '+%Y-%m-%d %H:%M:%S')] PHP-FPM服务重启失败,请手动排查" >> "$LOG_FILE" fi } # 记录当前PHP-FPM进程数 log_php_fpm_processes() { # 过滤掉grep自身进程,仅统计PHP-FPM主进程 local process_count=$(ps aux | grep -c "[p]hp-fpm: master process") echo "[$(date '+%Y-%m-%d %H:%M:%S')] 当前PHP-FPM进程数: $process_count" >> "$LOG_FILE" } # 实时监控Apache错误日志 tail -n 0 -f "$APACHE_ERROR_LOG" | while read -r line; do # 匹配目标错误字符串 if echo "$line" | grep -qE 'Connection refused: AH02454:|AH01079: failed to make connection to backend: httpd-UDS'; then restart_php_fpm else # 每小时整点记录一次进程数,避免日志刷屏 local current_minute=$(date '+%M') if [ "$current_minute" = "00" ]; then log_php_fpm_processes fi fi done
脚本说明
- 实时监控:通过
tail -n 0 -f跟踪Apache错误日志的新增内容,确保不会重复处理历史日志 - 错误匹配:使用
grep -qE同时检测两个目标错误字符串,实现多规则匹配 - 重启逻辑:匹配到错误时调用
systemctl restart重启指定PHP-FPM服务,并记录重启结果 - 日志优化:仅在整点记录PHP-FPM进程数,避免无意义的日志冗余(可根据需求调整时间规则)
- 路径适配:cPanel环境下Apache错误日志默认路径为
/usr/local/apache/logs/error_log,若你的环境不同请自行修改
内容的提问来源于stack exchange,提问作者user3526312
相关产品推荐
相关产品推荐

