netstat -anpot | grep "php" | wc -l
Nginx的502錯誤
重啟服務器后發現Nginx在我的WordPress報502 Bad Gateway錯誤。
查了好久,以為是nginx.conf或者php-fpm.conf的錯,突然想起來,好像哪里看到說php.ini中memory_limit設低了會出錯,
修改了php.ini的memory_limit為64M,重啟nginx,發現真好了~
原來是PHP的內存不足了。
360M內存的服務器,扛這點應用應該OK~
------------------------------------------------------------------------------------------
nginx+php 502 bad gateway解決方法
打開 /usr/local/php/etc/php-fpm.conf
調大以下兩個參數(根據服務器實際情況,過大也不行)
<value name=”max_children”>5120</value>
<value name=”max_requests”>600</value>
修改后速度快了,好象mysql占用cpu也下降了
-----------------------------------------------------------------------------------------
nginx 502 bad故障原因及解決方法收集
如題,最近網站頻繁出現502錯誤,簡直無法正常運轉,出現這種情況大多是php-cgi超時沒有返回信息,或進程僵死等情況造成的,參考張宴的這篇關于502錯誤的解決辦法(http://blog.s135.com/read.php?361),并咨詢系統管理員高手,我們的nginx已經配置到極致這些都已經老早做過修改了,但現在又出然出現。
經過分析將nginx的error log打開,發現”pstream sent too big header while reading response header from upstream”這樣的錯誤提示,查閱了一下資料,大意是nginx緩沖區有一個bug造成的,我們網站的頁面消耗占用緩沖區可能過大。參考老外寫的修改辦法增加了緩沖區容量大小設置,502問題徹底解決,后來系統管理員又對參數做了調整只保留了2個設置參數:client head buffer,fastcgi buffer size。
參考:
http://www.sudone.com/nginx/nginx_400_bad_request.html
http://blog.rackcorp.com/?p=14
二、昨天裝上nginx后在高負載的時候,論壇上傳圖片或者執行較長時間腳本的時候就不停的出現502 Bad Gateway ,網上搜了,大多數都是張大師的那篇解決方案,他的解決方案是
http
{
……
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
……
}
增加了fastcgi的相應請求時間。但是我在實際中碰到了這個問題,設置到500,還是會出現,只是比我設置120的時候要少一些。后來發現主要是在一些post或者數據庫操作的時候出現這種情況,靜態頁面是不會出現的。
反復的查問題,調試,也加大了CGI的進程數。
128
256再加上去可能會變得很慢。占用內存大了。
在php-fpm.conf設置中還有一項,可能當時沒注意到,無意中改了這個值。
request_terminate_timeout
這個值是max_execution_time,就是fast-cgi的執行腳本時間。
0s
0s為關閉,就是無限執行下去。(當時裝的時候沒仔細看就改了一個數字)
發現,問題解決了,執行很長時間也不會出錯了。
優化fastcgi中,還可以改改這個值5s 。看看效果
終于發現502的錯誤其實不是nginx的問題,哈哈
php-cgi進程數不夠用、php執行時間長、或者是php-cgi進程死掉,都會出現502錯誤
三、
一臺服務器上運行著nginx php(fpm) xcache,訪問量日均 300W pv左右
最近經常會出現這樣的情況: php頁面打開很慢,cpu使用率突然降至很低,系統負載突然升至很高,查看網卡的流量,也會發現突然降到了很低。這種情況只持續數秒鐘就恢復了
檢查php-fpm的日志文件發現了一些線索
Sep 30 08:32:23.289973 [NOTICE] fpm_unix_init_main(), line 271: getrlimit(nofile): max:51200, cur:51200
Sep 30 08:32:23.290212 [NOTICE] fpm_sockets_init_main(), line 371: using inherited socket fd=10, “127.0.0.1:9000″
Sep 30 08:32:23.290342 [NOTICE] fpm_event_init_main(), line 109: libevent: using epoll
Sep 30 08:32:23.296426 [NOTICE] fpm_init(), line 47: fpm is running, pid 30587
在這幾句的前面,是1000多行的關閉children和開啟children的日志
原來,php-fpm有一個參數 max_requests ,該參數指明了,每個children最多處理多少個請求后便會被關閉,默認的設置是500。因為php是把請求輪詢給每個children,在大流量下,每個childre到達max_requests所用的時間都差不多,這樣就造成所有的children基本上在同一時間被關閉。
在這期間,nginx無法將php文件轉交給php-fpm處理,所以cpu會降至很低(不用處理php,更不用執行sql),而負載會升至很高(關閉和開啟children、nginx等待php-fpm),網卡流量也降至很低(nginx無法生成數據傳輸給客戶端)
解決問題很簡單,增加children的數量,并且將 max_requests 設置未 0 或者一個比較大的值,重啟php-fpm
四、
nginx 502錯誤的原因比較多,是因為在代理模式下后端服務器出現問題引起的。這些錯誤一般都不是nginx本身的問題,一定要從后端找原因!但nginx把這些出錯都攬在自己身上了,著實讓nginx的推廣者備受置疑,畢竟從字眼上理解,bad gateway?不就是bad nginx嗎?讓不了解的人看到,會直接把責任推在nginx身上,希望nginx下一個版本會把出錯提示寫稍微友好一些,至少不會是現在簡單的一句 502 Bad Gateway,另外還不忘附上自己的大名。
502錯誤最通常的出現情況就是后端主機當機,當然還有。在upstream配置里有這么一項配置:proxy_next_upstream,這個配置指定了nginx在從一個后端主機取數據遇到何種錯誤時會轉到下一個后端主機,里頭寫上的就是會出現502的所有情況拉,默認是error timeout,error就是當機、斷線之類的,timeout就是讀取堵塞超時,比較容易理解。我一般是全寫上的:
proxy_next_upstream error timeout invalid_header http_500 http_503;
不過現在可能我要去掉http_500這一項了,http_500指定后端返回500錯誤時會轉一個主機,后端的jsp出錯的話,本來會打印一堆 stacktrace的錯誤信息,現在被502取代了。但公司的程序員可不這么認為,他們認定是nginx出現了錯誤,我實在沒空跟他們解釋502的原理了……
invalid_header我也沒認真查清到底指的什么,我也很想先把它弄下來。
503錯誤就可以保留,因為后端通常是apache resin,如果apache死機就是error,但resin死機,僅僅是503,所以還是有必要保留的。
對nginx fastcgi使用的情況,我現在用得不多,不熟就不亂說了。