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