大家好,小育來(lái)為大家解答以上問(wèn)題。502bad gateway是什么意思,502bad gateway很多人還不知道,現(xiàn)在讓我們一起來(lái)看看吧!
1、一些運(yùn)行在Nginx上的網(wǎng)站有時(shí)會(huì)出現(xiàn)“502壞網(wǎng)關(guān)”錯(cuò)誤,有時(shí)甚至?xí)l繁出現(xiàn)。以下是邊肖收集的一些Nginx 502錯(cuò)誤的排除方法,供參考:
2、NGX502錯(cuò)誤的原因有很多,這些錯(cuò)誤是由代理模式下的后端服務(wù)器問(wèn)題引起的。一般這些錯(cuò)誤都不是nginx本身的問(wèn)題,一定要從后端找原因!但是nginx把這些錯(cuò)誤都攬?jiān)谧约荷砩希@真的讓nginx的推廣者產(chǎn)生了質(zhì)疑。畢竟從單詞理解,壞網(wǎng)關(guān)?nginx不好嗎?讓不了解的人看到,會(huì)直接把責(zé)任推到nginx身上。希望nginx下一個(gè)版本把錯(cuò)誤提示寫的更友好一點(diǎn),至少不會(huì)是現(xiàn)在502壞網(wǎng)關(guān)的簡(jiǎn)單句,別忘了附上自己的名字。
3、ngx502的觸發(fā)條件
4、最常見的52錯(cuò)誤是后端主機(jī)崩潰。上游配置中有這樣一個(gè)配置:proxy_next_upstream。該配置指定nginx在從一個(gè)后端主機(jī)獲取數(shù)據(jù)時(shí)遇到任何錯(cuò)誤時(shí),將轉(zhuǎn)到下一個(gè)后端主機(jī)。里面寫的是502的所有情況都會(huì)出現(xiàn),默認(rèn)是錯(cuò)誤超時(shí)。錯(cuò)誤是崩潰、斷線等等。超時(shí)就是讀取堵塞超時(shí),很好理解。我通常都寫下來(lái):
5、proxy_next_upstream錯(cuò)誤超時(shí)invalid _ header http _ 500 http _ 503;但是現(xiàn)在可能要去掉http_500這個(gè)條目了。http_500指定當(dāng)后端返回500錯(cuò)誤時(shí),將傳輸?shù)街鳈C(jī)。如果后端jsp出錯(cuò),它本來(lái)會(huì)打印一堆stacktrace錯(cuò)誤消息,但現(xiàn)在被替換成502。但是公司的程序員不這么認(rèn)為。他們認(rèn)為nginx搞錯(cuò)了,所以我真的沒(méi)時(shí)間給他們解釋502的原理.
6、503服務(wù)不可用可以保留,因?yàn)楹蠖艘话闶莂pache resin,apache崩潰的話是錯(cuò)誤,但是resin崩潰,只有503,所以還是要保留。
7、解決辦法
8、如果遇到502問(wèn)題,可以按照以下兩步優(yōu)先解決。
9、1.檢查PHP FastCGI進(jìn)程的當(dāng)前數(shù)量是否足夠:
10、復(fù)制代碼如下:
11、netstat-anpo | grep ' PHP-CGI ' | WC-l
12、如果FastCGI進(jìn)程的實(shí)際數(shù)量接近預(yù)設(shè)的FastCGI進(jìn)程數(shù)量,說(shuō)明FastCGI進(jìn)程數(shù)量不夠,需要增加。
13、2.一些PHP程序的執(zhí)行時(shí)間超過(guò)了Nginx的等待時(shí)間??梢栽趎ginx.conf配置文件中適當(dāng)增加FastCGI的超時(shí)時(shí)間,例如:
14、復(fù)制代碼如下:
15、http { fastcgi _ connect _ time out 300;fastcgi _ send _ timeout 300fastcgi _ read _ timeout 300.} .
16、如果php.ini中的memory_limit設(shè)置得很低,就會(huì)導(dǎo)致錯(cuò)誤。將php.ini的memory_limit修改為64M后,重啟nginx,一查,原來(lái)是php內(nèi)存不足。
17、如果這個(gè)修改不能解決問(wèn)題,可以參考以下方案:
18、I最大數(shù)量-子代和最大數(shù)量-請(qǐng)求
19、一臺(tái)服務(wù)器上運(yùn)行有nginx php(fpm) xcache,日均流量300W pv左右。
20、最近經(jīng)常發(fā)生php頁(yè)面打開很慢,cpu利用率突然降到很低,系統(tǒng)負(fù)載突然升到很高的情況。如果你看一下網(wǎng)卡流量,你會(huì)發(fā)現(xiàn)它突然下降到一個(gè)很低的水平。這種情況只持續(xù)了幾秒鐘就恢復(fù)了。
21、檢查php-fpm的日志文件發(fā)現(xiàn)了一些線索。
22、復(fù)制代碼如下:
23、Sep 30 08:323:23.289973[通知] fpm_unix_init_main(),第271:行g(shù)etrlimit(nofile): max :51200,cur :51200 Sep 30 08:32:23.290212[通知] fpm_sockets_init_main(),第37133行
24、在這些句子前面,是1000多行關(guān)孩子和開孩子的日志。
25、原來(lái)php-fpm有一個(gè)參數(shù)max_requests,表示每個(gè)子進(jìn)程在關(guān)閉之前可以處理多少個(gè)請(qǐng)求。默認(rèn)設(shè)置為500。因?yàn)閜hp輪詢每個(gè)孩子的請(qǐng)求,所以在高流量下,每個(gè)孩子達(dá)到max_requests的時(shí)間幾乎相同,這使得所有孩子基本上
26、 在這期間,nginx無(wú)法將php文件轉(zhuǎn)交給php-fpm處理,所以cpu會(huì)降至很低(不用處理php,更不用執(zhí)行sql),而負(fù)載會(huì)升至很高(關(guān)閉和開啟children、nginx等待php-fpm),網(wǎng)卡流量也降至很低(nginx無(wú)法生成數(shù)據(jù)傳輸給客戶端)
27、 解決問(wèn)題很簡(jiǎn)單,增加children的數(shù)量,并且將 max_requests 設(shè)置未 0 或者一個(gè)比較大的值:
28、 打開 /usr/local/php/etc/php-fpm.conf調(diào)大以下兩個(gè)參數(shù)(根據(jù)服務(wù)器實(shí)際情況,過(guò)大也不行)
29、復(fù)制代碼代碼如下:
30、<value>5120</value><value>600</value>
31、然后重啟php-fpm。
32、二、增加緩沖區(qū)容量大小
33、 將nginx的error log打開,發(fā)現(xiàn)“pstream sent too big header while reading response header from upstream”這樣的錯(cuò)誤提示。查閱了一下資料,大意是nginx緩沖區(qū)有一個(gè)bug造成的,我們網(wǎng)站的頁(yè)面消耗占用緩沖區(qū)可能過(guò)大。參考老外寫的修 改辦法增加了緩沖區(qū)容量大小設(shè)置,502問(wèn)題徹底解決。后來(lái)系統(tǒng)管理員又對(duì)參數(shù)做了調(diào)整只保留了2個(gè)設(shè)置參數(shù):client head buffer,fastcgi buffer size。
34、三、request_terminate_timeout
35、 如果主要是在一些post或者數(shù)據(jù)庫(kù)操作的時(shí)候出現(xiàn)502這種情況,而不是在靜態(tài)頁(yè)面操作中常見,那么可以查看一下php-fpm.conf設(shè)置中的一項(xiàng):
36、request_terminate_timeout
37、這個(gè)值是max_execution_time,就是fast-cgi的執(zhí)行腳本時(shí)間。
38、0s
39、0s為關(guān)閉,就是無(wú)限執(zhí)行下去。(當(dāng)時(shí)裝的時(shí)候沒(méi)仔細(xì)看就改了一個(gè)數(shù)字)問(wèn)題解決了,執(zhí)行很長(zhǎng)時(shí)間也不會(huì)出錯(cuò)了。優(yōu)化fastcgi中,還可以改改這個(gè)值5s 看看效果。
40、php-cgi進(jìn)程數(shù)不夠用、php執(zhí)行時(shí)間長(zhǎng)、或者是php-cgi進(jìn)程死掉,都會(huì)出現(xiàn)502錯(cuò)誤。Nginx 502 Bad Gateway錯(cuò)誤的解決辦法2
41、今天,我的VPS頻繁提示Nginx 502 Bad Gateway錯(cuò)誤了,重啟了VPS解決之后又出現(xiàn),很煩。有點(diǎn)想不通,前兩天網(wǎng)站達(dá)到了1290的訪問(wèn)量都沒(méi)有出什么問(wèn)題,怎么這次就出現(xiàn)了502 Bad Gateway?郁悶?。。?!在搜索了很久,終于找到了不少相關(guān)的答案,希望修改之后不會(huì)再出現(xiàn)這個(gè)錯(cuò)誤了。唉,既然在網(wǎng)上找了那么久的答案,那當(dāng)然得把有用的東西記錄下,免得我下次再去谷歌~
42、由于我是采用了LNMP一鍵安裝包 ,出了問(wèn)題肯定要先到官方論壇去搜索下了,真好,官方有個(gè)這樣的置頂帖,大家先瞧瞧。
43、LNMP一鍵安裝包官方的:
44、第一種原因:目前l(fā)nmp一鍵安裝包比較多的問(wèn)題就是502 Bad Gateway,大部分情況下原因是在安裝php前,腳本中某些lib包可能沒(méi)有安裝上,造成php沒(méi)有編譯安裝成功。解決辦法:可以嘗試根據(jù)lnmp一鍵安裝包中的腳本手動(dòng)安裝一下,看看是什么錯(cuò)誤導(dǎo)致的。
45、第二種原因:
46、在php.ini里,eaccelerator配置項(xiàng)一定要放在Zend Optimizer配置之前,否則也可能引起502 Bad Gateway
47、第三種原因:
48、在安裝好使用過(guò)程中出現(xiàn)502問(wèn)題,一般是因?yàn)槟J(rèn)php-cgi進(jìn)程是5個(gè),可能因?yàn)閜hpcgi進(jìn)程不夠用而造成502,需要修改/usr/local/php/etc/php-fpm.conf 將其中的max_children值適當(dāng)增加。
49、第四種原因:
50、php執(zhí)行超時(shí),修改/usr/local/php/etc/php.ini 將max_execution_time 改為300
51、第五種原因:
52、磁盤空間不足,如mysql日志占用大量空間
53、第六種原因:
54、查看php-cgi進(jìn)程是否在運(yùn)行
55、也有網(wǎng)友給出了另外的解決辦法:
56、Nginx 502 Bad Gateway的含義是請(qǐng)求的PHP-CGI已經(jīng)執(zhí)行,但是由于某種原因(一般是讀取資源的問(wèn)題)沒(méi)有執(zhí)行完畢而導(dǎo)致PHP-CGI進(jìn)程終止,一般來(lái)說(shuō)Nginx 502 Bad Gateway和php-fpm.conf的設(shè)置有關(guān)。
57、php-fpm.conf有兩個(gè)至關(guān)重要的參數(shù),一個(gè)是max_children,另一個(gè)是request_terminate_timeout,但是這個(gè)值不是通用的,而是需要自己計(jì)算的。在安裝好使用過(guò)程中出現(xiàn)502問(wèn)題,一般是因?yàn)槟J(rèn)php-cgi進(jìn)程是5個(gè),可能因?yàn)閜hpcgi進(jìn)程不夠用而造成502,需要修改/usr/local/php/etc/php-fpm.conf 將其中的max_children值適當(dāng)增加。
58、計(jì)算的方式如下:
59、如果你的服務(wù)器性能足夠好,且寬帶資源足夠充足,PHP腳本沒(méi)有系循環(huán)或BUG的話你可以直接將 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分 鐘都可以。而max_children這個(gè)值又是怎么計(jì)算出來(lái)的呢?這個(gè)值原則上是越大越好,php-cgi的進(jìn)程多了就會(huì)處理的很快,排隊(duì)的請(qǐng)求就會(huì)很少。 設(shè)置max_children也需要根據(jù)服務(wù)器的性能進(jìn)行設(shè)定,一般來(lái)說(shuō)一臺(tái)服務(wù)器正常情況下每一個(gè)php-cgi所耗費(fèi)的內(nèi)存在20M左右。
60、按照官方的答案,排查了相關(guān)的可能,并結(jié)合了網(wǎng)友的答案,得出了下面的解決辦法。
61、1、查看php fastcgi的進(jìn)程數(shù)(max_children值)
62、代碼:netstat -anpo | grep “php-cgi” | wc -l
63、5(假如顯示5)
64、2、查看當(dāng)前進(jìn)程
65、代碼:top觀察fastcgi進(jìn)程數(shù),假如使用的進(jìn)程數(shù)等于或高于5個(gè),說(shuō)明需要增加(根據(jù)你機(jī)器實(shí)際狀況而定)
66、3、調(diào)整/usr/local/php/etc/php-fpm.conf 的相關(guān)設(shè)置
67、<value name=”max_children”>10</value><value name=”request_terminate_timeout”>60s</value>max_children最多10個(gè)進(jìn)程,按照每個(gè)進(jìn)程20MB內(nèi)存,最多200MB。request_terminate_timeout執(zhí)行的時(shí)間為60秒,也就是1分鐘。
本文到此結(jié)束,希望對(duì)大家有所幫助。