綠(lǜ)色資源網:您身邊最放心的安全下載站! 最新軟件(jiàn)|熱(rè)門(mén)排行|軟(ruǎn)件分類|軟件專題|廠商大全

綠色資源網

技術教程
您的位置:首頁服務(wù)器類Web服務器 → nginx報(bào)的http錯誤

nginx報(bào)的http錯誤

我要評論 2012/11/29 20:49:41 來源:綠色資源網(wǎng) 編輯:www.ynaad.com [ ] 評論:0 點(diǎn)擊:335次

Nginx 502 Bad Gateway的含義是請求的PHP-CGI已(yǐ)經執行(háng),但是由於某種原因(一般是讀取資源的問題)沒有執行完畢而導致PHP-CGI進程終止。
Nginx 504 Gateway Time-out的含義是(shì)所請(qǐng)求的網關沒有請求到,簡單來說就是(shì)沒有請求到可以執行的PHP-CGI。

解決這兩個問(wèn)題其實是需要綜合思(sī)考的,一般來說Nginx 502 Bad Gateway和php-fpm.conf的設置有關,而Nginx 504 Gateway Time-out則是與nginx.conf的設置有關。

1.查看FastCGI進程是否已經啟動
NGINX 502錯誤的(de)含義是sock、端口沒被(bèi)監聽造成的。我們先檢查fastcgi是否在運行
2.檢查係統Fastcgi進程運(yùn)行情況
除(chú)了第一種情況,fastcgi進程數不夠用、php執行時間長、或者是php-cgi進程死掉也可(kě)能造成nginx的502錯誤(wù)
運行以下命令(lìng)判斷是否接近FastCGI進(jìn)程,如果fastcgi進程數接近配置文件中設置的數值,表明worker進程數設置太少
netstat -anpo | grep "php-cgi" | wc -l
3.FastCGI執行時間過長
根據實際情況調高以下參數值
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;

4.頭部太大這種情況可(kě)能是由於nginx默認的fastcgi進程響應的緩衝區太(tài)小造成的, 這將導致fastcgi進程被掛起, 如果你的fastcgi服務對這個(gè)掛起(qǐ)處理的不好, 那麽(me)最後就極有(yǒu)可能導致504 Gateway Time-out
現在的網(wǎng)站, 尤其(qí)某些論壇有大量的回複和很多內容的(de), 一個(gè)頁麵甚至有幾百K
默認的fastcgi進程響應的緩衝區是8K, 我們可(kě)以設(shè)置大點:                               
fastcgi_buffer_size 128k;
fastcgi_buffers 8 128k;
如果你使用的(de)是nginx的負載均衡Proxying,調整
proxy_buffer_size  16k;   這裏(lǐ)參數調大
proxy_buffers   4 16k;
5.https轉(zhuǎn)發配(pèi)置錯誤
正確的配置方法
server_name www.xok.la;
locations /myproj/repos {
set $fixed_destination $http_destination;
if ( $http_destination ~* ^https(.*)$ )
{
set $fixed_destination http$1;
}
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Destination $fixed_destination;
proxy_pass http://subversion_hosts;
}

下麵我(wǒ)們來仔細分析一(yī)下php-fpm.conf幾個重要的(de)參數:
php-fpm.conf有兩個至關重要的(de)參數(shù),一個是”max_children”,另(lìng)一個是”request_terminate_timeout”
我的(de)兩個設置的值一個是”40″,一個是(shì)”900″,但是這個值不是通用的,而是需要自己計算(suàn)的。
計算(suàn)的方式如下:
如果你的服務器性能(néng)足夠好,且(qiě)寬帶資源足夠充足,PHP腳本沒有係循環或(huò)BUG的話你可以直接將”request_terminate_timeout” 設置成0s。0s的含義是(shì)讓PHP-CGI一直執行下去而沒有時間限製。而如果你做不到(dào)這一點(diǎn),也就是說你的PHP-CGI可能出現某個BUG,或者你的寬帶不夠充足或者(zhě)其他的原因導(dǎo)致你的PHP-CGI能夠假死那麽就(jiù)建議你給”request_terminate_timeout”賦一個值(zhí),這個值可以根據你服務器的性能進行設定。一般來說性能越好你可以設置越高,20分鍾-30分鍾都可以。由於我的服務器PHP腳本需要長時間運行,有的可(kě)能會(huì)超(chāo)過10 分鍾(zhōng)因此我設置了900秒,這樣不會導致PHP-CGI死掉而出現502 Bad gateway這個錯誤。

而”max_children”這個(gè)值又是怎麽計算出來的呢?這個值原則上是越大越好,php-cgi的進程多了就會處理的很快,排隊的請求就會很少。設置”max_children”也需要根據服務器的性能進行設定(dìng),一般來說一台(tái)服務器正常情況下每(měi)一個php-cgi所耗費(fèi)的內存在20M左右,因此我的”max_children”我設置成40個,20M*40=800M也就是說在峰值(zhí)的時候所有PHP-CGI所耗(hào)內存在800M以內,低於我(wǒ)的有效內存1Gb。而(ér)如果我的”max_children”設置的較小(xiǎo),比如5-10個,那麽php-cgi就會“很累”,處理速度也很慢,等待的時間也較長。如果長時間沒有得到處理的請求就會出現504 Gateway Time-out這個錯誤(wù),而正(zhèng)在處理的很累的那幾個php-cgi如果遇到了問題就會出現502 Bad gateway這個錯誤。

一個實例:

http://www.levil.cn/post/29/
 

我在CentOS下配置(zhì)lnmp組合基本上用的都是同樣的配置文件,一直都沒(méi)出現過問題,可最近在一個vps上安裝同樣的環(huán)境之後,網站(zhàn)在線10多人就出現(xiàn)了打開速度非常緩(huǎn)慢的情況,有好幾次都是直接達到了nginx中設置的腳本最大超時時間300秒,結果導致nginx往客戶端瀏(liú)覽器發送了一個504 Gateway Time-out的錯誤代碼,分析了之後改動了幾處配置文件,終於避免了該情況的出現。

從錯誤代碼基本可以確定跟(gēn)nginx本(běn)身無關,主要是提交給php-fpm的請求未能正確反饋(kuì)而導致,一(yī)般情況下,提交動態請求的時(shí)候,nginx會直接把請求轉交給php-fpm,而php-fpm再分配php-cgi進程(chéng)來處理相關的請求,之後再依次返回,最後由nginx把結果反饋給客(kè)戶端瀏覽(lǎn)器,但我這個vps目前跑的是個純(chún)php應(yīng)用內容,實際上用戶所有的請求都是php請求(qiú),有的耗費時間比較久,php-cgi進程就一(yī)直都被用滿,而php- fpm本身的配置文件隻打開了10組php-cgi進程,這樣的話在線用戶稍微多的話就會導致請求無法被正常處理而出錯。

大(dà)概分析出了原因(yīn),下麵做就比較容易(yì)了,首(shǒu)先是(shì)更改php-fpm的幾處配置:

把max_children由之前(qián)的10改為現在的30,這樣就可以保證有充足的php-cgi進(jìn)程可以被使(shǐ)用;
把request_terminate_timeout由之前的0s改為60s,這樣php-cgi進程處理腳(jiǎo)本的超時時間就是60秒,可以防止進程都被掛起,提高利用(yòng)效率。

接著再更改(gǎi)nginx的幾個配置項,減少FastCGI的請求次數(shù),盡(jìn)量維持buffers不變(biàn):

fastcgi_buffers由 4 64k 改為 2 256k;
fastcgi_buffer_size由 64k 改為 128K;
fastcgi_busy_buffers_size 由 128K 改為(wéi) 256K;
fastcgi_temp_file_write_size 由(yóu) 128K 改為 256K。

好了,重新加載(zǎi)php-fpm和nginx的配置,再次測試(shì),至今兩周時間內(nèi)沒有再出(chū)現504 Gateway Time-out的情況(kuàng),算是達到效果(guǒ)了。

另一例子:

使用ie正常.其他人用FF也正(zhèng)常.但是有(yǒu)個人使用FF瀏覽報錯502
查看後台error日誌,發現一句(jù)
upstream sent too big header while reading response header from upstream
就是反饋回來的頭部(bù)信息太大
一般(bān)應該是cookie裏麵(miàn)帶的
懷疑是FF裏麵的某個插件引起返回(huí)太多的頭部信(xìn)息
一個個(gè)排查.最後發現是FireBug導致的
既然(rán)是fastcgi返回的頭部太大.應該可(kě)以配置
查找資料後發現應該是和fastcgi_buffer_*有關的
將相關配置增大.發現問題解決
這邊使用的是
fastcgi_buffer_size 32k;
fastcgi_buffers 8 32k;
比原來(lái)的默認4k/8k要大許多

http400錯:
nginx的(de)HTTP400錯誤(wù),而且這個HTTP400錯誤並不是(shì)每次都會出現的,查了(le)一下發現nginx 400錯誤是由於request header過大,通常是由於cookie中寫入了較長的字符(fú)串所引起的。解決方法是不要(yào)在cookie裏記錄過(guò)多數據,如果實在需要的(de)話可以考慮調整在nginx.conf中的client_header_buffer_size(默認1k)
若cookie太大,可(kě)能還需要調整large_client_header_buffers(默認4k),該參數說明如下:
請求行如果超過buffer,就會報HTTP 414錯誤(URI Too Long)
nginx接受最長的(de)HTTP頭部大小必須比其中一個buffer大,否則就會報400的HTTP錯誤(Bad Request)。
 
http413錯:
在上傳時nginx返回了413錯誤,查看log文件,顯(xiǎn)示的錯誤信息是:”413 Request Entity Too Large”, 於是在網上找了下“nginx 413錯誤”發現需要做以下設置:
在nginx.conf增加client_max_body_size的設置, 這個值默認是1m,可以增加到8m

關鍵詞:nginx,http錯誤

閱讀本文後您有什麽感想? 已有 人給(gěi)出評價!

  • 0 歡迎喜歡
  • 0 白癡
  • 0 拜托
  • 0 哇
  • 0 加油
  • 0 鄙視
免费人欧美成又黄又爽的视频丨一本色道久久88综合日韩精品丨国产专区日韩精品欧美色丨午夜无遮挡男女啪啪视频丨国产欧美日韩综合精品一区二区丨亚洲精品无码不卡在线播HE丨亚洲精品国产精品国自产观看丨日韩国产高清av不卡