DedeCMS 欄目超 2000 篇文章,生成列表頁出現 504 Gateway Time-out。伺服器 Nginx,維護人員隨意改緩存設定無效。本地複現:Nginx 能全量生成但報 504;Apache 更誇張,生成 83 頁即卡死。最終找到有效方案,記錄備查。
| 錯誤 | 含義 | 核心成因 | 關鍵配置層 |
|---|---|---|---|
| 502 Bad Gateway | PHP-CGI 已執行但未完成 (讀取資源問題) 導致進程終止 | php-fpm.conf 設定問題 | php-fpm.conf |
| 504 Gateway Time-out | 請求的網關無響應,即無可用 PHP-CGI 進程 | nginx.conf 設定問題 | nginx.conf |
實戰鐵律:需綜合考慮伺服器性能與訪客量,雙配置同調。
fastcgi_connect_timeout 300s;
fastcgi_send_timeout 300s;
fastcgi_read_timeout 300s;
fastcgi_buffer_size 128k;
fastcgi_buffers 8 128k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;
前三條是核心:規定 PHP-CGI 連接/發送/讀取最長 300 秒,足夠覆蓋長時間腳本執行,極大降低 504 發生率。
0s (無時間限制,PHP-CGI 永不超時)。netstat -an | grep :9000 觀察 PHP-FPM 連接數;pm.status_path 監控進程池狀態。ab -n 1000 -c 50 模擬併發,觀察 502/504 率、響應時間分佈。max_children 導致 OOM Killer 殺進程 → 更災難性後果。request_terminate_timeout 0 卻有 BUG 代碼 → 掛死進程佔滿槽位 → 服務癱瘓。fastcgi_buffer 參數 → 大響應體導致臨時檔頻繁讀寫 → 性能抖動。Nginx 504 本質是「等不到 PHP-CGI」。雙軌調優:Nginx 端給足等待時間 (300s)、緩衝區優化;PHP-FPM 端給足進程池 (max_children 依記憶體算)、給足單進程執行上限 (request_terminate_timeout 依業務最長耗時算)。在有限硬體上跑重業務,核心是精準計算資源上限、留足安全邊際、建立觀測閉環。