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