netstat -anpot | grep "php" | wc -l
Nginx的(de)502錯(cuò)誤
重啓服務器(qì)後發現(xiàn)Nginx在我的¥≤™(de)WordPress報(bào)5§σλ02 Bad Gateway錯(cuò)誤。
查了(le)好(hǎo)久,以為(wèi)是(shì☆← )nginx.conf或者php-fpm.conf的(de)錯(cuò♠¶),突然想起來(lái),好(hǎo)像哪裡("÷lǐ)看(kàn)到(dào)說(shuō)ph÷±<p.ini中memory_limit設低(dī)了(le)會(huì)出錯(cu©©ò),
修改了(le)php.ini的(de)memory_limit為(wèi)64M,重啓nginx <σ,發現(xiàn)真好(hǎo)了(le)~
原來(lái)是(shì)PHP的(de)內(nèi)存不(bù)足了(le)。
360M內(nèi)存的(de)服務器(q δ ì),扛這(zhè)點應用(yòng)應該OK~
------------------------------------------------§ ----------------------------------------♠--
nginx+php 502 bad gateway解決方法
打開(kāi) /usr/local/php/etc/php-fpm.conf
調☆←✘大(dà)以下(xià)兩個(gè)參數(shù)(根據服務器(∞"★qì)實際情況,過大(dà)也(yě)不(bù)行(xí↕δng))
<value name=”max_childr¶ en”>5120</value&g♥>t;
<value name=”∑₽>max_requests”>600</value>
修改後速度快(kuài)了(le),好(≠"hǎo)象mysql占用(yòng)cpu也(yě∏↑↑)下(xià)降了(le)
------------------------♣®-------------------------------------------©↑'↓----------------------
nginx 502 bad故障原因及解決方法收集
如(rú)題,最近(jìn)網站(zhàn)頻(pín)繁出現(x&≤φiàn)502錯(cuò)誤,簡直無法正常運轉,出現(xiàn♦δ≠)這(zhè)種情況大(dà)多(duō)是(shì)php-cgi超時(shí)沒有☆₽¶'(yǒu)返回信息,或進程僵死等情況造成的(de),參考張宴的(de)這(zhè)篇關于502Ω®£錯(cuò)誤的(de)解決辦法(http://blog.s135.com/read.php≤±£✘?361),并咨詢系統管理(lǐ)員(yuán)高(gāo)手,我δ∏®們的(de)nginx已經配置到(dào)極緻這(zhè)些(xiē)都(dōu)÷επ≤已經老(lǎo)早做(zuò)過修改了(le),但(dàn)現(xiàn)在又(yòu)出¶÷∞↑然出現(xiàn)。
經過分(fēn)析将nginx的(de)er∑♦ror log打開(kāi),發現(xi©↑©δàn)”pstream sent too big header while readin∑×☆g response header from upstrea±☆≠$m”這(zhè)樣的(de)錯(cuò)誤提示,查≠€$<閱了(le)一(yī)下(xià)資料,大(dà)意λλ↓是(shì)nginx緩沖區(qū)有(yǒu)一(yī)個(gè)bug造成的(de≈↕π),我們網站(zhàn)的(de)頁面消耗占用(yòng)緩沖區(qūλ>$)可(kě)能(néng)過大(dà)。參考老(lǎo)外(w₽≥ài)寫的(de)修改辦法增加了(le)緩沖區(qū)容量大(dà)小>'¶(xiǎo)設置,502問(wèn)題徹底解決,後來(lái)系統管理> (lǐ)員(yuán)又(yòu)對(duì)參數(→¶δshù)做(zuò)了(le)調整隻保留了(le)2個(gè)設置參數(shù):cli"÷ent head buffer,fastcgi buff∏δ↓er size。
參考:
http://www.sudone.com/ng¥'inx/nginx_400_bad_request.html
http://blog.rackcorp.com/?p=14÷β
二、昨天裝上(shàng)nginx後在高(gāo)負載的(de)時(shí)候,論壇上(λ'γ<shàng)傳圖片或者執行(xíng)較長(ch∑₩áng)時(shí)間(jiān)腳本的(de)時(→↑shí)候就(jiù)不(bù)停的(de)出現™↓©÷(xiàn)502 Bad Gateway ,網上(✔≠Ωshàng)搜了(le),大(dà)多(duō)數(shù)都(dō®∏u)是(shì)張大(dà)師(shī)的(de)那(nà)篇解決γ✔方案,他(tā)的(de)解決方案是(shì)
http
{
……
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300♠ ';
fastcgi_read_timeout 300↔®∑;
……
}
增加了(le)fastcgi的(de)相(xiàn★✘♦φg)應請(qǐng)求時(shí)間(jα"≥®iān)。但(dàn)是(shì)我在實際中碰₽$÷到(dào)了(le)這(zhè)個(gè)問(wèn)題,設置到(dào)500,還(há₽≈i)是(shì)會(huì)出現(xiàn),隻是(shì)比我設置120<∏¥的(de)時(shí)候要(yào)少(shǎo)一(yīπ )些(xiē)。後來(lái)發現(xiàn)主要(yào)是(shì)£δ在一(yī)些(xiē)post或者數(shù)據庫操作(zuò)的(de₽)時(shí)候出現(xiàn)這(zhè)種情況,靜↕ π(jìng)态頁面是(shì)不(bù)會(huì)出現(xiàn)的(de)。
反複的(de)查問(wèn)題,調試,也(yě)加大(dà)了(le)CGI的₽↔§£(de)進程數(shù)。
128
256再加上(shàng)去(qù)可(k>∏✔ě)能(néng)會(huì)變得(de)很(hěn)慢(≤β™màn)。占用(yòng)內(nèi)存大(dà)了(le)。
在php-fpm.conf設置中還(hái)有(yǒu)一(yī)項,δ¥可(kě)能(néng)當時(shí)沒注意到(dào),無意中改了(le)這(zhè)個(g✘•↑è)值。
request_terminate_timeout
這(zhè)個(gè)值是(shì)max_execut→£←☆ion_time,就(jiù)是(shì)fast-cgi的(de)執行(xí×∑ng)腳本時(shí)間(jiān)。
0s
0s為(wèi)關閉,就(jiù)是(shì)無限執行(xíng)下(xià)去♦λ≥♥(qù)。(當時(shí)裝的(de)時(shí)候沒仔細看(kàn)就(j♥©iù)改了(le)一(yī)個(gè)數(shù)字)
發現(xiàn),問(wèn)題解決了(le),執行(xíng "δ)很(hěn)長(cháng)時(shí)間(jiān)也(yě)不(bù)會(huì)≠>₽出錯(cuò)了(le)。
優化(huà)fastcgi中,還(hái)可(kě)以改改這(zhè)個(gè)值↔≤αα5s 。看(kàn)看(kàn)效果
終于發現(xiàn)502的(de)錯(cuò)誤其實不(bù)是(shì☆↓♥')nginx的(de)問(wèn)題,哈哈
php-cgi進程數(shù)不(bù)夠用(yòng)、php執行(xíng)時(shí)間£ &(jiān)長(cháng)、或者是(shì)php-cgi進程死掉,都•≠ ♠(dōu)會(huì)出現(xiàn)502錯(cuò)誤
三、
一(yī)台服務器(qì)上(shàng)運行(xíng)著(zhe)nginx php(fp♦'σm) xcache,訪問(wèn)量日(rì)均 300W pv左右
最近(jìn)經常會(huì)出現(xiàn)這(zhè)樣的(de)情況: ph ™<p頁面打開(kāi)很(hěn)慢(màn),cpu使用(yòng)率突然降至很(hěn)低(₩±dī),系統負載突然升至很(hěn)高(gāo),查看(kàn×§±σ)網卡的(de)流量,也(yě)會(huì)發現(xi>àn)突然降到(dào)了(le)很(hěn)低(dī)。這(zhè)種情況隻持續數(shù∑$)秒(miǎo)鐘(zhōng)就(jiù)恢複了(le)
檢查php-fpm的(de)日(rì)志(zhì)文(wén)件(jiànφ♠)發現(xiàn)了(le)一(yī)些(xiē)線φφ™£索
Sep 30 08:32:23.289973 [NOTICE] fpm_unix_i¥★©nit_main(), line 271: getrlimδ©≥it(nofile): max:51200, cur:51200
Sep 30 08:32:23.290212 [NOT©©✔ICE] fpm_sockets_init_main(), line 371: usi♣≤₩✔ng inherited socket fd=10, “127.0.0.1:900♥'0″
Sep 30 08:32:23.290342 [NOTICE] fpm_event_✘€λinit_main(), line 109: libevent: using epolσεl
Sep 30 08:32:23.296426 [NOTICE] fpm_init(), lineφπ 47: fpm is running, pid 30587
在這(zhè)幾句的(de)前面,是(shì)₽φ1000多(duō)行(xíng)的(de)關閉""•φchildren和(hé)開(kāi)啓childreβ★♠&n的(de)日(rì)志(zhì)
原來(lái),php-fpm有(yǒu)一(yī∞↑)個(gè)參數(shù) max_reques↓<ts ,該參數(shù)指明(míng)了(lφ₹↕e),每個(gè)children最多(duō)處理(lǐ)多(duō)少σ€★(shǎo)個(gè)請(qǐng)求後便會(huì)被關閉,默認的(de)設置>☆≠是(shì)500。因為(wèi)php是(shì)把請(qǐng)求輪詢給每個(gè)c♠≥hildren,在大(dà)流量下(xià),每個(Ω×gè)childre到(dào)達max_requests所用(yòng)的(de)時(shí)↓λ↔間(jiān)都(dōu)差不(bù)多(duō),這←δσΩ(zhè)樣就(jiù)造成所有(yǒu)的(de)children基本上(sh π¶àng)在同一(yī)時(shí)間(jiān)被關閉。
在這(zhè)期間(jiān),nginx無法将p∑<€∑hp文(wén)件(jiàn)轉交給php-fp'πm處理(lǐ),所以cpu會(huì)降®π•至很(hěn)低(dī)(不(bù)用(yòng)處理★π<π(lǐ)php,更不(bù)用(yòng)執行(xíng)sql),而負載會(huì)升至很(hě₹$★n)高(gāo)(關閉和(hé)開(kāi)啓children、nginx等 σ待php-fpm),網卡流量也(yě)降至很(hěn)低(dī)(nginxε✔&無法生(shēng)成數(shù)據傳輸給客戶端)±←
解決問(wèn)題很(hěn)簡單,增加α∏×children的(de)數(shù)量,并且将 max_requests 設置未 0 或者一(↓&yī)個(gè)比較大(dà)的(de)值,重啓php-fpm
四、
nginx 502錯(cuò)誤的(de)原因比較多(duō),是(shì)因為(♦§wèi)在代理(lǐ)模式下(xià)後端服務器(qì)出現(xiàn)問(wèn)題引起€ 的(de)。這(zhè)些(xiē)錯(cuò)誤一(yī)般都(dōu)不(bù♠♥✔)是(shì)nginx本身(shēn)的(de)問(↓δwèn)題,一(yī)定要(yào)從(cóng)後端♥♥≥找原因!但(dàn)nginx把這(zhè)些(xiē)出錯(cuò)都(dōu)攬在自®₽™(zì)己身(shēn)上(shàng)了(le),著(zhe)→實讓nginx的(de)推廣者備受置疑,畢竟從(cóng)字眼上(s™$¥↑hàng)理(lǐ)解,bad gate✔©α•way?不(bù)就(jiù)是(shì)bσ¥ad nginx嗎(ma)?讓不(bù)了(le)解的(₩ de)人(rén)看(kàn)到(dào),會(huì)直接把責任推在nginx身•& (shēn)上(shàng),希望nginx下(xià)一(yī)個(gè)λ ε≠版本會(huì)把出錯(cuò)提示寫稍微(wē≈©i)友(yǒu)好(hǎo)一(yī)些(xi$® ♥ē),至少(shǎo)不(bù)會(huì)是σ™γ♥(shì)現(xiàn)在簡單的(de)一(yī)句 5✔§02 Bad Gateway,另外(wài)還(hái)不(bù)忘附上(shàng)自(zì₩ε♣)己的(de)大(dà)名。
502錯(cuò)誤最通(tōng)常的(de) <出現(xiàn)情況就(jiù)是(shì)後端主機(jī)當機(jī),當然還 &(hái)有(yǒu)。在upstream配置裡(lǐ)有(yǒu)這(zhè)麽一γ (yī)項配置:proxy_next_upstream,這(z ¶ ∏hè)個(gè)配置指定了(le)nginx在從(cóng)一(yī)個(✔÷↓gè)後端主機(jī)取數(shù)據遇到(dào)何種錯(cuò)$→∑誤時(shí)會(huì)轉到(dào)下(xià)一(yī)個(gè)後端主機(jī),裡(λ¶∏¶lǐ)頭寫上(shàng)的(de)就(jiù♠×)是(shì)會(huì)出現(xiàn)502的(de)所有(yǒu)™♥☆情況拉,默認是(shì)error timeout,error就(jiù≈¶αα)是(shì)當機(jī)、斷線之類的(de),α←timeout就(jiù)是(shì)讀(dú)取堵塞超時(sh¥δ$¥í),比較容易理(lǐ)解。我一(yī)般是(shì)全寫上(shàng)的(deαΩ€):
proxy_next_upstream eσ®§rror timeout invalid_heaεδder http_500 http_503;
不(bù)過現(xiàn)在可(kě)能(néng)我要(yào)去(qù)掉htΩσ×✔tp_500這(zhè)一(yī)項了(le),http_500指定後端返≤'∑¶回500錯(cuò)誤時(shí)會(huì)轉一(yī)個(gè ↑©Ω)主機(jī),後端的(de)jsp出錯(cuò)的(de)話(huà),本來(lái)會(h™←∑uì)打印一(yī)堆 stacktrace的(de)錯(cuò)誤信息,現(xiàn¥∏∑Ω)在被502取代了(le)。但(dàn)公σ↔ 司的(de)程序員(yuán)可(kě)不(bù)這(zhè)麽認為(wèi×≥λ),他(tā)們認定是(shì)nginx出現π✘(xiàn)了(le)錯(cuò)誤,我實在沒空(kōng)跟他(t£¥★ā)們解釋502的(de)原理(lǐ)了(le)……
invalid_header我也(yě)沒Ω$認真查清到(dào)底指的(de)什(shén)麽,我也(y₹'ě)很(hěn)想先把它弄下(xià)來(lá<i)。
503錯(cuò)誤就(jiù)可(kě)以保留,因為(wèi)後端γ≠ 通(tōng)常是(shì)apache res•∑←in,如(rú)果apache死機(jī)就(<λjiù)是(shì)error,但(dàn)resin死機(jī),僅僅是(sh'♥ì)503,所以還(hái)是(shì)有(yǒu)必 &÷要(yào)保留的(de)。
對(duì)nginx fastcgi使用(yòng)的(d≠±₹₽e)情況,我現(xiàn)在用(yòng)得(d' €e)不(bù)多(duō),不(bù)熟就(jiù)不(bù)亂說(§™ ÷shuō)了(le)。