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