nginx报错502:connect() to unix:/var/run/php5-fpm.sock failed (2: No such file or directory)
一、背景
早上突然發(fā)現(xiàn)服務(wù)器這邊所有的請(qǐng)求都報(bào)錯(cuò):502,具體報(bào)錯(cuò)信息如下:
connect() to unix:/var/run/php5-fpm.sock failed (2: No such file or directory) while connecting to upstream, client: xxx, server: xxx, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "xxx"這個(gè)意思是無(wú)法找到php5-fpm.sock,但是原來(lái)是好好的,為什么會(huì)出現(xiàn)這種問(wèn)題呢?
二、第一種可能
1、第一種可能就是,nginx配置的問(wèn)題:
nginx配置文件中有一句是這樣的,監(jiān)聽(tīng)sock文件 fastcgi_pass unix:/var/run/php5-fpm.sock;2、解決方案
進(jìn)入 /etc/php5/fpm/pool.d/www.conf,修改配置,里面找到這樣一段代碼:
``` listen = 127.0.0.1:9000 ```在這上面代碼的下面添加一行:``` listen = /var/run/php5-fpm.sock ```保存后啟動(dòng)php5-fpm``` /etc/init.d/php5-fpm restart ```這時(shí)就可以正常訪(fǎng)問(wèn)了三、第二種可能
1、既然是報(bào)錯(cuò)502,眾所周知,這個(gè)錯(cuò)誤代表的意思就是:
???????這個(gè)錯(cuò)誤是由于服務(wù)器壓力過(guò)大,不能及時(shí)處理client的請(qǐng)求導(dǎo)致服務(wù)器響應(yīng)超時(shí)而拋出的錯(cuò)誤。通俗來(lái)講,我們向服務(wù)器發(fā)送請(qǐng)求 由于服務(wù)器當(dāng)前鏈接太多,導(dǎo)致服務(wù)器方面無(wú)法給于正常的響應(yīng),產(chǎn)生此類(lèi)報(bào)錯(cuò)。
???????那么OK,因?yàn)槲覀兪褂玫氖莗hp-fpm的系統(tǒng)服務(wù),那么極有可能是我們?cè)诮o服務(wù)器請(qǐng)求的時(shí)候,由于請(qǐng)求量比較大,php-fpm在規(guī)定的響應(yīng)時(shí)間內(nèi)沒(méi)有響應(yīng),自動(dòng)殺掉這些進(jìn)程或者卡死造成的。
2、解決方案
1)增大請(qǐng)求的持續(xù)時(shí)間,防止php腳本或者php-fpm自動(dòng)殺死進(jìn)程
//修改php.ini 中的參數(shù),可以把這個(gè)參數(shù)設(shè)置的大一些, 代表置了腳本被解析器中止之前允許的最大執(zhí)行時(shí)間 ,默認(rèn)是30s。也就是說(shuō)這個(gè)請(qǐng)求如果30s還沒(méi)得到響應(yīng)的話(huà) ,腳本會(huì)自動(dòng)殺死這個(gè)請(qǐng)求。 max_execution_time = 60s???????如果不想修改php.ini文件的話(huà),可以選擇修改php-fpm.conf文件,因?yàn)樵诜?wù)器正常運(yùn)行的時(shí)候,php-fpm.conf中的request_terminate_timeout 會(huì)覆蓋php.ini中的max_execution_time
request_terminate_timeout = 60s #表示等待60秒后,結(jié)束那些沒(méi)有自動(dòng)結(jié)束的php腳本,以釋放占用的資源。 當(dāng)PHP運(yùn)行在php-fpm模式下,php.ini配置的max_execute_time是無(wú)效的,需要在php-fpm.conf中配置另外一個(gè)配置項(xiàng):request_terminate_timeout;???????如果你的服務(wù)器性能足夠好,且寬帶資源足夠充足,PHP腳本沒(méi)有系循環(huán)或BUG的話(huà)你可以直接將”request_terminate_timeout”設(shè)置成0s。0s的含義是讓PHP-CGI一直執(zhí)行下去而沒(méi)有時(shí)間限制。而如果你做不到這一點(diǎn),也就是說(shuō)你的PHP-CGI可能出現(xiàn)某個(gè)BUG,或者你的寬帶不夠充足或者其他的原因?qū)е履愕腜HP-CGI能夠假死那么就建議你給”request_terminate_timeout”賦一個(gè)值,這個(gè)值可以根據(jù)你服務(wù)器的性能進(jìn)行設(shè)定。一般來(lái)說(shuō)性能越好你可以設(shè)置越高,20分鐘-30分鐘都可以。由于我的服務(wù)器PHP腳本需要長(zhǎng)時(shí)間運(yùn)行,有的可能會(huì)超過(guò)10分鐘因此我設(shè)置了900秒,這樣不會(huì)導(dǎo)致PHP-CGI死掉而出現(xiàn)502 Bad gateway這個(gè)錯(cuò)誤。
PS:這個(gè)部分,我的php-fpm.conf中并沒(méi)有這個(gè)參數(shù),因此我是自己加上去的。
2)修改php-fpm給子進(jìn)程分配的時(shí)間間隔
這里修改的是php-fpm.conf中的 process_control_timeout 參數(shù)
解釋:php-fpm和FastCGI的關(guān)系:
???????關(guān)于process_control_timeout項(xiàng)配置的由來(lái)及詳細(xì)介紹,依靠CGI接口,Nginx把收到的請(qǐng)求轉(zhuǎn)給PHP,并從PHP獲得返回?cái)?shù)據(jù),但CGI實(shí)現(xiàn)邏輯是一次請(qǐng)求建立一個(gè)PHP進(jìn)程,處理結(jié)束的同時(shí)關(guān)閉php進(jìn)程,而php進(jìn)程的每次啟動(dòng)銷(xiāo)毀都很耗資源,于是出現(xiàn)了FastCGI的方式,一個(gè)fastcgi進(jìn)程可以處理多個(gè)請(qǐng)求再關(guān)閉,但FastCGI依然有缺點(diǎn),因?yàn)閒astcgi是單個(gè)進(jìn)程串行,即同一時(shí)刻只能處理一個(gè)請(qǐng)求,于是php-fpm就出現(xiàn)了,它的作用就是可以管理多個(gè)fastcgi。從而實(shí)現(xiàn)同時(shí)處理多個(gè)請(qǐng)求。php-fpm就和nginx的主進(jìn)程一樣,而每一個(gè)處理請(qǐng)求的php進(jìn)程就像是nginx里的多個(gè)執(zhí)行線(xiàn)程。這就是php進(jìn)程的復(fù)用。php-fpm作為一個(gè)調(diào)度員,會(huì)自動(dòng)讓空閑的FastCGI進(jìn)程去處理請(qǐng)求,但是在分配請(qǐng)求給php進(jìn)程前,PHP-FPM需要發(fā)送一個(gè)進(jìn)程復(fù)用信號(hào)給FastCGI,以讓FastCGI準(zhǔn)備請(qǐng)求處理。但是FastCGI進(jìn)程并不總是能夠處理請(qǐng)求,也就是不能夠響應(yīng)進(jìn)程復(fù)用信號(hào),這個(gè)參數(shù)就表示了PHP-FPM留給FastCGI進(jìn)程多久時(shí)間去響應(yīng)進(jìn)程復(fù)用信號(hào),如果超時(shí)PHP-FPM會(huì)選擇其他的fastcgi去處理。這段也是從網(wǎng)上找到的,以我的理解進(jìn)行了一些修改。從英文注釋來(lái)看,這個(gè)配置是子進(jìn)程等待主進(jìn)程的超時(shí)時(shí)間。可能和上面的描述有細(xì)微的出入,但也不妨對(duì)功能進(jìn)行理解。
process_control_timeout = 20???????通過(guò)以上的描述,我們就知道了,設(shè)置這個(gè)參數(shù)相當(dāng)于給程序更多的響應(yīng)時(shí)間,以免出現(xiàn)502的情況。
3) 修改php-fpm自動(dòng)重啟的時(shí)間
這里需要修改的參數(shù)還是php-fpm.conf中的參數(shù):
#表示在emergency_restart_interval所設(shè)值內(nèi)出現(xiàn)SIGSEGV或者SIGBUS錯(cuò)誤的php-cgi進(jìn)程數(shù)如果 #超過(guò)emergency_restart_threshold個(gè)php-fpm就會(huì)優(yōu)雅重啟。這兩個(gè)選項(xiàng)一般保持默認(rèn)值emergency_restart_threshold = 60 emergency_restart_interval = 30s???????這兩個(gè)參數(shù)的意思就是在30秒內(nèi)出現(xiàn)SIGSEGV或者SIGBUS錯(cuò)誤的php-cgi進(jìn)程數(shù)超過(guò)60個(gè),則會(huì)自動(dòng)重啟php-fpm。
這里的emergency_restart_threshold是需要根據(jù)自己的服務(wù)器性能來(lái)計(jì)算的,計(jì)算方式為:
比如一個(gè)fastcgi進(jìn)程占用的內(nèi)存為30M,則1G的服務(wù)器,最大能設(shè)置的值為 1024/30 = 34 但實(shí)際上我們不可能把所有的內(nèi)存都用來(lái)出來(lái)這些東西,所以設(shè)置成30是比較合適的。end
參考鏈接:
php-fpm.conf重要參數(shù)詳解
php-fpm超時(shí)時(shí)間設(shè)置request_terminate_timeout分析
php-fpm參數(shù)調(diào)優(yōu)
總結(jié)
以上是生活随笔為你收集整理的nginx报错502:connect() to unix:/var/run/php5-fpm.sock failed (2: No such file or directory)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【Altium Designer】:关于
- 下一篇: ContactsProvider的使用