nginx出現(xiàn)502有很多原因,但大部分原因可以歸結(jié)為資源數(shù)量不夠用,也就是說后端php-fpm處理有問題,nginx將正確的客戶端請求發(fā)給了后端的php-fpm進(jìn)程,但是因?yàn)閜hp-fpm進(jìn)程的問題導(dǎo)致不能正確解析php代碼,最終返回給了客戶端502錯(cuò)誤。
服務(wù)器出現(xiàn)502的原因是連接超時(shí)我們向服務(wù)器發(fā)送請求由于服務(wù)器當(dāng)前鏈接太多,導(dǎo)致服務(wù)器方面無法給于正常的響應(yīng),產(chǎn)生此類報(bào)錯(cuò)。因此如果你服務(wù)器并發(fā)量非常大,那只能先增加機(jī)器,然后按以下方式優(yōu)化會(huì)取得更好效果;但如果你并發(fā)不大卻出現(xiàn)502,一般都可以歸結(jié)為配置問題,腳本超時(shí)問題。
1.??php.ini的memory_limit過小
(如果有個(gè)別php程序進(jìn)程需要占用極大內(nèi)存時(shí)這個(gè)必須注意)
2.??php-fpm.conf中max_children或者max_requests設(shè)置不合理
(設(shè)置過小會(huì)因?yàn)闆]有足夠的cgi進(jìn)程處理請求,設(shè)置過大會(huì)出現(xiàn)一會(huì)兒有響應(yīng)正常,一會(huì)兒等很久才有響應(yīng)的情況,一般情況下children按?照內(nèi)存計(jì)算,比如說1G設(shè)置64,2G128。這個(gè)根據(jù)實(shí)際情況自行調(diào)整。另外查看當(dāng)前的PHP?FastCGI進(jìn)程數(shù)是否夠用的命令為:
netstat??-anpo?|grep?php-cgi?|?wc?-l???如果實(shí)際使用的“FastCGI進(jìn)程數(shù);接近預(yù)設(shè)的;FastCGI進(jìn)程數(shù),那么,說明;FastCGI進(jìn)程數(shù);不夠用,需要增大。)
3.查看nginx錯(cuò)誤日志
發(fā)現(xiàn)pstream?sent?too?big?header?while?reading?response??headerfrom?upstream,則檢查client?head?buffer,fastcgi?buffer??size是否過小,可設(shè)置為32K。
4. ?php程序執(zhí)行時(shí)間過長而超時(shí),檢查nginx和fastcgi中各種timeout設(shè)置。
nginx:
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout300;
keepalive_timeout;
php-fpm:
request_terminate_timeout=300;
php.ini:
max_execution_time=300;
不過request_terminate_timeout參數(shù)會(huì)直接殺掉php進(jìn)程,然后重啟php進(jìn)程,這樣前端nginx就會(huì)返回104: Connection reset by peer,最好設(shè)成request_terminate_timeout=0;但最重要的是程序里要設(shè)置好超時(shí),不要使用php-fpm的request_terminate_timeout。
5.php-fpm參數(shù)max_requests
該參數(shù)指明了每個(gè)children最多處理多少個(gè)請求后便會(huì)被關(guān)閉。在大量處理請求下,如果該值設(shè)置過小會(huì)導(dǎo)致children頻繁的自殺和建立而浪費(fèi)?大量時(shí)間,若所有的children差不多都在這個(gè)時(shí)候自殺,則重建前將沒有children響應(yīng)請求,于是502??梢詫⒃撝翟O(shè)置大一些或者是0[無限]。
6.調(diào)高調(diào)高linux內(nèi)核打開文件數(shù)量
可以使用這些命令(必須是root帳號)
echo?'ulimit?-HSn?65536'>>?/etc/profile
echo?'ulimit?-HSn?65536'>>?/etc/rc.local
source?/etc/profile
7.緩存設(shè)置比較小
修改或增加配置到nginx.conf
proxy_buffer_size?64k;
proxy_buffers??512k;
proxy_busy_buffers_size?128k;
8、自己遇到502的解決辦法:
調(diào)整增大php和Nginx的backlog數(shù),且nginx和php的backlog數(shù)相同。如:backlog=1000000
以上差不多是比較常見的502的問題原因以及解決辦法,其實(shí)解決問題的最好的方式還是自己去看nginx和fastcgi的errorlog。
最后借用網(wǎng)上的萬金油說法做個(gè)總結(jié):php-cgi進(jìn)程數(shù)不夠用、php執(zhí)行時(shí)間長、或者是php-cgi進(jìn)程死掉,都會(huì)出現(xiàn)502錯(cuò)誤。
本文出自 “smile_青春” 博客?http://smileyouth.blog.51cto.com/7273768/1586237