nginx與php-fpm的502 bad gateway錯誤及解決方案
本文針對Ubuntu 16.04.2系統上出現的Nginx 502 Bad gateway錯誤進行分析和解決,該錯誤源于Nginx與php-FPM(版本:php-fpm/5.6)的交互問題。
錯誤現象:
nginx錯誤日志顯示請求失敗,提示來自上游的頭部信息丟失。 PHP-FPM錯誤日志顯示子進程數量達到最大值(pm.max_children 設置為5)。 重啟PHP-FPM后,網站恢復正常。
立即學習“PHP免費學習筆記(深入)”;
錯誤原因分析:
PHP-FPM的子進程數量已達到配置文件中設定的最大值,導致無法處理新的請求,從而引發Nginx的502錯誤。
解決方案:
問題在于PHP-FPM的進程管理配置。需要調整/etc/php/5.6/fpm/php-fpm.conf 或 /etc/php/5.6/fpm/pool.d/www.conf 文件中的pm參數及其相關設置。 (5.6版本通常在www.conf中配置)。
配置文件參數詳解:
關鍵參數包括:
- pm: 進程管理模式,可選值 Static (靜態) 或 dynamic (動態)。
- pm.max_children: 靜態模式下PHP-FPM子進程的最大數量;動態模式下,表示最大子進程數。
- pm.start_servers: 動態模式下PHP-FPM啟動時的子進程數量。
- pm.min_spare_servers: 動態模式下PHP-FPM保持的最小空閑子進程數量。
- pm.max_spare_servers: 動態模式下PHP-FPM保持的最大空閑子進程數量。
pm模式區別:
- static: 固定數量的PHP-FPM進程,僅pm.max_children生效。
- dynamic: 根據系統負載動態調整PHP-FPM進程數量,pm.max_children, pm.start_servers, pm.min_spare_servers, pm.max_spare_servers 均生效。
進程數量計算:
要確定合適的進程數量,可以使用memory_get_peak_usage(true)函數獲取單個請求的峰值內存使用量,并考慮PHP-FPM進程本身的內存消耗,從而估算每個進程所需的內存。 根據服務器的可用內存,計算可以同時運行的進程數量。
通過調整以上參數,例如增加pm.max_children 或優化pm.start_servers, pm.min_spare_servers, pm.max_spare_servers的值,可以有效解決PHP-FPM進程不足的問題,避免502錯誤的再次發生。 修改配置文件后,記得重啟PHP-FPM服務使配置生效。