502 Bad Gateway 通常意味著 Nginx 無法從上游獲取有效回應。PHP-FPM 常見原因包括:進程耗盡、請求阻塞、記憶體洩漏、僵屍進程、配置不當。本文提供診斷思路與自動化恢復腳本。
request_terminate_timeout 觸發殺死進程fastcgi_buffers 導致大回應截斷#!/bin/bash
# restart-php-fpm-v1.sh
SERVICE="php-fpm"
if netstat -anp | grep -q ":9000"; then
echo "$SERVICE 運行正常"
else
echo "$SERVICE 未運行,嘗試重啟"
systemctl restart php-fpm
fi
#!/bin/bash
# restart-php-fpm-v2.sh
MY_URL="https://your-domain.com"
RESULT=$(curl -I -s -o /dev/null -w "%{http_code}" "$MY_URL" --max-time 10)
if [[ "$RESULT" == "502" ]]; then
echo "檢測到 502,強制重啟 PHP-FPM"
killall -9 php-fpm 2>/dev/null
systemctl restart php-fpm
# 可選:發送告警通知
# curl -X POST "https://hooks.slack.com/..." -d '{"text":"PHP-FPM 自動重啟"}'
fi
chmod +x restart-php-fpm-v2.sh
# 每分鐘檢查一次
echo "* * * * * /path/to/restart-php-fpm-v2.sh >> /var/log/php-fpm-watchdog.log 2>&1" | crontab -
/etc/php-fpm.d/www.conf):
pm = dynamic
pm.max_children = 100 # 依記憶體計算:總記憶體 / 單進程記憶體
pm.start_servers = 20
pm.min_spare_servers = 10
pm.max_spare_servers = 30
pm.max_requests = 500 # 重生進程防洩漏
request_terminate_timeout = 60s
rlimit_files = 65535
slowlog = /var/log/php-fpm/slow.log
request_slowlog_timeout = 5s
php-fpm_exporter 指標fastcgi_buffers 8 16k;
fastcgi_buffer_size 32k;
fastcgi_connect_timeout 60s;
fastcgi_send_timeout 60s;
fastcgi_read_timeout 60s;
自動重啟是治標手段,根治需從配置優化、代碼效能、資源監控三方面入手。建議建立完整觀測體系,而非單純依賴重啟腳本。