Nginx 504 Gateway Time-out問題的解(jiě)決經曆
在CentOS下配置(zhì)lnmp組合(hé)基(jī)本上用的都是同(tóng)樣的配置文件,一直都沒出(chū)現(xiàn)過問題,可最(zuì)近在一個(gè)vps上(shàng)安裝同樣的環境之後,網站在線10多人就出 現(xiàn)了打開速度非常緩慢的情況,有好幾次都是直接(jiē)達到了nginx中設置的腳(jiǎo)本最大超時時間300秒,結果導致nginx往客戶端瀏覽器發送了一(yī)個504 Gateway Time-out的錯(cuò)誤(wù)代碼,分析了之(zhī)後改動了幾處配置文件,終於避免了該情況的出現。
從錯(cuò)誤代碼基(jī)本可以確定跟nginx本身無關,主要是提交給php-fpm的請(qǐng)求未能正確反(fǎn)饋而導致,一般情況(kuàng)下,提交(jiāo)動態請求(qiú)的時候,nginx會直接把 請求轉交(jiāo)給php-fpm,而php-fpm再分配php-cgi進程來(lái)處理相關的(de)請求,之後再依次(cì)返回,最後由nginx把結(jié)果反饋給客戶端(duān)瀏覽器,但 我這個vps目前跑的是個(gè)純php應用內容,實際上用(yòng)戶(hù)所有的(de)請求都是php請求,有(yǒu)的耗費時間比較久,php-cgi進程(chéng)就(jiù)一(yī)直都被用滿,而php- fpm本身(shēn)的配置文(wén)件(jiàn)隻打開了10組php-cgi進程(chéng),這樣的話在線用戶稍微多的話就會導致請求(qiú)無法被正常處理而出錯。
大概分析出(chū)了(le)原 因,下麵(miàn)做(zuò)就(jiù)比較(jiào)容易了(le),首先是更(gèng)改php-fpm的幾處配(pèi)置:
把max_children由之前的(de)10改為現在的30,這樣(yàng)就可以保(bǎo)證 有充足的php-cgi進程可以被使(shǐ)用;
把request_terminate_timeout由之(zhī)前(qián)的(de)0s改為60s,這樣php-cgi進(jìn)程 處理腳本的超時時(shí)間就是60秒,可以防止進(jìn)程都(dōu)被掛起,提高利用效率。
接著再更改nginx的幾個配(pèi)置項,減少FastCGI的請求次 數,盡量維(wéi)持buffers不變:
fastcgi_buffers由 4 64k 改為 2 256k;
fastcgi_buffer_size 由 64k 改為 128K;
fastcgi_busy_buffers_size 由 128K 改(gǎi)為 256K;
fastcgi_temp_file_write_size 由(yóu) 128K 改為 256K。
好了(le),重新加(jiā)載(zǎi)php-fpm和(hé)nginx的配置(zhì),再次測(cè)試,至今兩周時間內沒有(yǒu)再出現504 Gateway Time-out的情(qíng)況,算是達到效果了。
另外,php-fpm的默(mò)認靜態處(chù)理方式會使(shǐ)得(dé)php-cgi的進程長期占(zhàn)用(yòng)內存(cún)而無法釋放,這也(yě)是導致(zhì)nginx出(chū)錯(cuò)的原因之一,因此可以將php-fpm的處理方(fāng)式改成apache模式。
<value name=”style”>apache-like</value>
從更改完畢到現在的測試表明上述方式的效果還是很明顯的,並沒有發現一次Nginx502 bad gateway或504 Gateway Time-out錯誤。當然,如果(guǒ)你的VPS或者服務器的性能足夠好可以根據具體情況不(bú)必做無謂的(de)改動。
關鍵詞:Nginx
閱讀本文後您有什麽感想? 已有 人給出評(píng)價(jià)!
- 0
- 0
- 0
- 0
- 0
- 0