服務器(qì)技(jì)術(shù):nginx≤  php 超時(shí) 解決辦法

2015-07-30       ÷; 閱讀(dú)數(shù):3313


最近(jìn)網站(zhàn)在處理(lǐ)大(dà)數(sh₽β✘ ù)據時(shí)總是(shì)出現(xiàn) 504 Ga©↑β teway Time-out,于是(shì)在網上(shàng)找了(‍←le)一(yī)些(xiē)資料

Nginx 502 Bad Gateway的(de)含義是(₽±£↑shì)請(qǐng)求的(de)PHP-CGI已經執行(xíng),但(dàn≥'≤)是(shì)由于某種原因(一(yī)般是(shì)讀(dú)取資'₽源的(de)問(wèn)題)沒有(yǒu)執行(xíng)完畢而導緻PHP-CGI進§✔Ω&程終止。

Nginx 504 Gateway Time-out的(de)含義是(shì)>←€±所請(qǐng)求的(de)網關沒有(yǒu)請(qǐng)求到(dào),簡單來(lái)說☆☆™φ(shuō)就(jiù)是(shì)沒有(yǒu)請(qǐng)求到(dào)可(kě)以執☆‌<‌行(xíng)的(de)PHP-CGI。

解決這(zhè)兩個(gè)問(wèn)題其實是(shì)需§✔≈要(yào)綜合思考的(de),一(yī)般來(lái)說(shuō)Nginx 50‌≈∑2 Bad Gateway和(hé)php-fpδ±☆m.conf的(de)設置有(yǒu)關₹δ$,而Nginx 504 Gateway Time-ou≥§∏t則是(shì)與nginx.conf的(de)設置有(yǒ ↑φu)關。

而正确的(de)設置需要(yào)考慮服務器(®↔'qì)自(zì)身(shēn)的(de)性能(néng)和(hé)訪客∞πε§的(de)數(shù)量等多(duō)重因素。

以我目前的(de)服務器(qì)為(wèi)例子(zǐ)CPU是≥£₽♣(shì)奔四1.5G的(de),內(nèi)存1GB,CENTOS的(de)系統,訪★​♥客大(dà)概是(shì)50人(rén)左右同時(shí)在線。

但(dàn)是(shì)在線的(de)人(rén)大(dà)都(dōu)需要(yào)請(q♦‌¶€ǐng)求PHP-CGI進行(xíng)大(dà)量的(de↔☆<)信息處理(lǐ),因此我将nginx.conf設置為(wèi):

fastcgi_connect_timeout 300s;

fastcgi_send_timeout 300s;

fastcgi_read_timeout 300s;

fastcgi_buffer_size 128k;

fastcgi_buffers 8 128k;#8 128

fastcgi_busy_buffers_size 256k;

fastcgi_temp_file_write_size 256k;

fastcgi_intercept_errors on;

這(zhè)裡(lǐ)最主要(yào)的(d®₩e)設置是(shì)前三條,即

fastcgi_connect_timeout 300s;

fastcgi_send_timeout Ω×300s;

fastcgi_read_timeout 300s;

這(zhè)裡(lǐ)規定了(le)PHP-CGI的(de)連接、發送和(hε​≥é)讀(dú)取的(de)時(shí)間(jiān),300秒(miǎo)足夠用(≠₽≠yòng)了(le),因此我的(de)服務器(qì)很(hěn)少(shǎo)出現(ββγxiàn)504 Gateway Time-out這(zhè)個(gè)錯(c‍φuò)誤。最關鍵的(de)是(shì)php±₩-fpm.conf的(de)設置,這(zhè)個(gè)會(huì)直接導緻502 Bad←  ‍ Gateway和(hé)504 Gatewa •¶ y Time-out。

下(xià)面我們來(lái)仔細分(fēn)析一(yī)下(xià)php-fpm.conf幾個♥φ×(gè)重要(yào)的(de)參數(shù):

php-fpm.conf有(yǒu)兩個(gè‍←↔)至關重要(yào)的(de)參數(shù),一(yī)個(₩®gè)是(shì)”max_children”,另一(yī)個(gè)是(↔∞•shì)”request_terminate_tim∑☆÷ eout”

我的(de)兩個(gè)設置的(de)值一(yī)個(g≥$∞≈è)是(shì)”40″,一(yī)個(gè)是(shì)”900″,但(dàn)∑$♦是(shì)這(zhè)個(gè)值不(bù)是(shì)通(tōng)用(‌ε∏©yòng)的(de),而是(shì)需要(yào)自(zì)己計(jì)算(suàn)的(de)♣✔< 。

計(jì)算(suàn)的(de)方式如(rú)下(xià):

如(rú)果你(nǐ)的(de)服務器(qì)性能(néng)足夠好(hǎoλ©),且寬帶資源足夠充足,PHP腳本沒有(yǒu)系循環或BUG的(de)話(huà)你(nǐ)可(₹​kě)以直接将”request_terminate_ti☆γ‌®meout”設置成0s。0s的(de)含義是(shì)讓PHP-CGI一(yī)直執行(δ≥​xíng)下(xià)去(qù)而沒有(yǒu)時(shí)間(jiān)限β✔制(zhì)。而如(rú)果你(nǐ)做(zuò)不(bù)到(d≠♦ào)這(zhè)一(yī)點,也(yě)就(jiù)是(shì)說(sh€‍uō)你(nǐ)的(de)PHP-CGI可(kě)能(néng)出π♠÷☆現(xiàn)某個(gè)BUG,或者你(nǐ)的(de)寬帶不(bù)​→£夠充足或者其他(tā)的(de)原因導緻你(nǐ)的(de)PHP-CGφφπI能(néng)夠假死那(nà)麽就(jiù)建議(yì)你(nǐ)給”request_±®terminate_timeout”賦一(yī)個(gè)值,這(z&÷✘¶hè)個(gè)值可(kě)以根據你(nǐ)服務器(qì)的≤"π<(de)性能(néng)進行(xíng)設定。一(yī)般來(lái)說(shuō)性能(nén÷σ≠g)越好(hǎo)你(nǐ)可(kě)以設置越高← ♣(gāo),20分(fēn)鐘(zhōn↕¶₽←g)-30分(fēn)鐘(zhōng)都(dōu)可(kě)以。由于¶≈λ 我的(de)服務器(qì)PHP腳本需要(yào)長(cháng)時(shí)間(ji★€"ān)運行(xíng),有(yǒu)的(de)可(kě)能λ" (néng)會(huì)超過10分(fēn)鐘(zhōng)因此我設置了(le)900秒→★(miǎo),這(zhè)樣不(bù)會(huì)導緻PHP-$↓CGI死掉而出現(xiàn)502 Bad gateway這(zhè)個(gè)錯☆≤♠&(cuò)誤。

而”max_children”這(zhè)個(gè)值又(yòu)是(shì)怎麽γ‌φ✘計(jì)算(suàn)出來(lái)的(de)呢(ne)βδ?這(zhè)個(gè)值原則上(shàng)是(shì)越大(dà)越好(hǎo),php-c¶®>&gi的(de)進程多(duō)了(le)就(jiù)會(huì)λ•£≥處理(lǐ)的(de)很(hěn)快(kuài),排隊的(de)請(q÷£ǐng)求就(jiù)會(huì)很(hěn)少(shǎo)。設置”m♣‌‍∑ax_children”也(yě)需要(yào)根據服務器(qì)的(de)性能(néng)進€∑Ω行(xíng)設定,一(yī)般來(lái)說(shuō)一(yī)台€≈服務器(qì)正常情況下(xià)每一(yī§±®¶)個(gè)php-cgi所耗費(fèi)的(de)內(nèi)存在20φ≤←M左右,因此我的(de)”max_childre₽  ≤n”我設置成40個(gè),20M*40=800M也(yě)就(jiù)是(shì)說(₹≈‍shuō)在峰值的(de)時(shí)候所有(yǒu)PHP-C₹&→GI所耗內(nèi)存在800M以內(nèi),低(dī)于我的(de)有(yǒu)效§★↕內(nèi)存1Gb。而如(rú)果我的(de)”max_chil‍↓£λdren”設置的(de)較小(xiǎo),比如(rú)5-1♣§0個(gè),那(nà)麽php-cgi就(j↔₽'™iù)會(huì)“很(hěn)累”,處理(lǐ¥↕γ)速度也(yě)很(hěn)慢(màn),等待的(de)時(shí)間(jiān)也(yě)較長π÷(cháng)。如(rú)果長(cháng)時(shí)間(jiān)沒有(yǒ©∞u)得(de)到(dào)處理(lǐ)的(de)請(qǐng)求就(jiù)會(hu↕←ì)出現(xiàn)504 Gateway Time-out這(zhè)個(gè)錯(cuò)§§∞✔誤,而正在處理(lǐ)的(de)很(hěn)累的(de)那(nà)幾個(gè)ph​±¥p-cgi如(rú)果遇到(dào)了(le)問π♥♠(wèn)題就(jiù)會(huì)出現(xiàn)502 Bad §π gateway這(zhè)個(gè)錯(cuò)誤。

fastcgi_read_timeout 300s;