網站突然顯示 503 Service Unavailable,通常代表網站服務暫時無法處理新的請求。
和 500 錯誤不同,503 比較常見於 PHP-FPM 程序已滿、主機記憶體不足、網站流量突然增加、程式執行時間過長,或 Web Server 無法連線到 PHP 處理服務。
有些網站重新整理幾次後會恢復,但如果 503 持續或反覆發生,通常代表主機資源或程式效能已經出現問題。
先提醒:重啟 PHP-FPM 可能讓網站暫時恢復,但如果沒有找出程序塞滿或記憶體不足的原因,503 通常還會再次出現。
503 Service Unavailable 常見症狀
- 網站偶爾正常,流量一高就出現 503。
- 前台可以開啟,但後台、搜尋或報表功能容易失敗。
- 重新啟動 PHP-FPM 後暫時恢復。
- 網站同時出現 502、503 或 Gateway Timeout。
- 主機控制面板顯示 PHP-FPM 程序數已達上限。
- 伺服器記憶體或 Swap 使用量很高。
- 網站受到大量爬蟲、掃描或惡意請求。
- 資料庫查詢很慢,造成 PHP 程序長時間無法釋放。
1)先確認 PHP-FPM 是否正在執行
一般 Linux 主機可先查看 PHP-FPM 服務狀態:
systemctl status php-fpm
如果主機安裝多個 PHP 版本,服務名稱可能不同,例如:
systemctl status php72-php-fpm
systemctl status php74-php-fpm
systemctl status php81-php-fpm
systemctl status php82-php-fpm
若服務已停止或啟動失敗,可以查看最近紀錄:
journalctl -u php-fpm -n 100
不同主機環境的服務名稱與紀錄位置不一定相同。cPanel、aaPanel、1Panel 也可能使用各自管理的 PHP-FPM 服務。
2)查看 PHP-FPM 與 Web Server 錯誤紀錄
503 的真正原因通常會出現在 PHP-FPM、Apache、Nginx 或 LiteSpeed 的錯誤紀錄。
tail -100 /var/log/php-fpm/error.log
tail -100 /var/log/nginx/error.log
tail -100 /var/log/httpd/error_log
tail -100 /var/log/apache2/error.log
cPanel/WHM 主機也可查看:
tail -100 /usr/local/apache/logs/error_log
常見關鍵字包括:
server reached pm.max_children settingResource temporarily unavailableConnection reset by peerconnect() to unix socket failedupstream timed outOut of memorychild exited on signal
重點:如果紀錄出現 server reached pm.max_children setting,代表 PHP-FPM 可用程序已被占滿,新的請求只能等待或直接失敗。
3)檢查 pm.max_children 是否太低
PHP-FPM 的 pm.max_children 代表同一個 Pool 最多可以同時執行多少個 PHP 程序。
設定太低時,只要同時請求稍微增加,就可能出現程序不足;但設定過高,也可能讓 PHP 一次吃光主機記憶體。
pm = dynamic
pm.max_children = 20
pm.start_servers = 4
pm.min_spare_servers = 4
pm.max_spare_servers = 8
pm.max_requests = 500
不能只看別人的設定數字直接照抄。合理的 pm.max_children 要依主機可用記憶體、單個 PHP 程序用量、網站數量與請求執行時間一起判斷。
4)確認主機記憶體是否不足
主機記憶體不足時,Linux 可能啟動 OOM Killer,強制終止 PHP-FPM、MySQL 或其他程序,網站就可能出現 503。
free -m
top
htop
再檢查是否發生 OOM:
dmesg | grep -i "out of memory"
dmesg | grep -i "killed process"
常見原因包括:
- PHP-FPM 程序數設定過高。
- MySQL 使用大量記憶體。
- 網站產生大型報表或圖片。
- 程式發生無限迴圈。
- 多個網站同時執行排程。
- 流量突然增加。
- 主機沒有足夠 Swap。
5)檢查是否有慢程式占住 PHP 程序
PHP-FPM 程序數滿,不一定代表流量很大,也可能是少數請求執行太久,導致程序一直無法釋放。
- 資料庫查詢沒有索引。
- 一次讀取大量資料。
- 匯出 Excel 或 PDF 花太久。
- 圖片處理占用大量 CPU 與記憶體。
- 第三方 API 沒有設定 timeout。
- 程式等待寄信、金流或 LINE API 回應。
可以啟用 PHP-FPM Slow Log:
request_slowlog_timeout = 5s
slowlog = /var/log/php-fpm/www-slow.log
6)檢查 MySQL 是否拖慢整個網站
PHP 程序常常不是自己卡住,而是在等待 MySQL 查詢完成。
mysqladmin processlist
或進入 MySQL 後執行:
SHOW FULL PROCESSLIST;
如果出現大量長時間執行的查詢,應檢查索引、慢查詢、鎖表、未提交交易與一次讀取大量資料等問題。
7)檢查是否有大量爬蟲或異常流量
網站突然出現 503,也可能是短時間收到大量請求。
tail -100 /var/log/nginx/access.log
tail -100 /usr/local/apache/domlogs/example.com
查看請求最多的 IP:
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head
查看最常被存取的路徑:
awk '{print $7}' access.log | sort | uniq -c | sort -nr | head
建議排查順序
- 確認 PHP-FPM 是否正常執行。
- 查看 PHP-FPM 與 Web Server 錯誤紀錄。
- 確認是否達到 pm.max_children。
- 查看記憶體、Swap 與 OOM 紀錄。
- 檢查 PHP 慢程式與 MySQL 慢查詢。
- 檢查是否有大量爬蟲或惡意請求。
- 修正後持續觀察程序數與錯誤紀錄。
遇到 503 時不建議直接做的事
- 不要只是不斷重啟 PHP-FPM。
- 不要直接把 pm.max_children 調到很高。
- 不要只加記憶體卻不查慢程式。
- 不要忽略 MySQL 慢查詢。
- 不要把所有異常都歸咎於流量過大。
結論:503 Service Unavailable 通常代表 PHP-FPM 程序、主機記憶體、資料庫或流量已經超過目前環境能承受的範圍。正確做法不是只重啟服務,而是從錯誤紀錄、程序數、記憶體、慢查詢與存取紀錄逐項確認。
守站人可協助排查 cPanel、aaPanel、1Panel 與一般 Linux 主機的 PHP-FPM、503、記憶體、MySQL 與網站效能問題。