You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求编写监控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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 10:43:16