常見的Nginx 502 Bad Gateway解決辦法如下:
Nginx 502錯誤情況1:
網(wǎng)站的訪問量大,而php-cgi的進(jìn)程數(shù)偏少。
針對這種情況的502錯誤,只需增加php-cgi的進(jìn)程數(shù)。具體就是修改/usr/local/php/etc/php-fpm.conf 文件,將其中的max_children值適當(dāng)增加。這個數(shù)據(jù)要依據(jù)你的VPS或獨立服務(wù)器的配置進(jìn)行設(shè)置。一般一個php-cgi進(jìn)程占20M內(nèi)存,你可以自己計算下,適量增多。
/usr/local/php/sbin/php-fpm restart 然后重啟一下.
Nginx 502錯誤情況2:
CPU占用率、內(nèi)存占用率非常高,遭到CC攻擊.
解決方法請參考:LinuxVPS簡單解決CC攻擊
Nginx 502錯誤情況3:
CPU占用率不高,內(nèi)存溢出。
檢查一下網(wǎng)站程序有沒有問題?一般小偷站點常常會出現(xiàn)內(nèi)存溢出。
檢查一下/var/log/目錄下的日志,看看是不是有人**SSH和FTP端口?
SSH、FTP遭到窮舉也會占用大量內(nèi)存。是的話改掉SSH端口和FTP端口即可
將網(wǎng)上找到的一些和502 Bad Gateway錯誤有關(guān)的問題和排查方法列一下,先從FastCGI配置入手:
1.查看FastCGI進(jìn)程是否已經(jīng)啟動
NGINX 502錯誤的含義是sock、端口沒被監(jiān)聽造成的。我們先檢查fastcgi是否在運行
2.檢查系統(tǒng)Fastcgi進(jìn)程運行情況
除了第一種情況,fastcgi進(jìn)程數(shù)不夠用、php執(zhí)行時間長、或者是php-cgi進(jìn)程死掉也可能造成nginx的502錯誤
運行以下命令判斷是否接近FastCGI進(jìn)程,如果fastcgi進(jìn)程數(shù)接近配置文件中設(shè)置的數(shù)值,表明worker進(jìn)程數(shù)設(shè)置太少
netstat -anpo | grep "php-cgi" | wc -l
3.FastCGI執(zhí)行時間過長
根據(jù)實際情況調(diào)高以下參數(shù)值
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
4.頭部太大
nginx和apache一樣,有前端緩沖限制,可以調(diào)整緩沖參數(shù)
fastcgi_buffer_size 32k;
fastcgi_buffers 8 32k;
如果你使用的是nginx的負(fù)載均衡Proxying,調(diào)整
proxy_buffer_size 16k;
proxy_buffers 4 16k;
5.https轉(zhuǎn)發(fā)配置錯誤
正確的配置方法
server_name www.jb51.net; location /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;
}
6 max-children和max-requests
一臺服務(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)了一些線索:
Sep3008:32:23.289973[NOTICE] fpm_unix_init_main(), line 271: getrlimit(nofile): max:51200,cur:51200
Sep3008:32:23.290212[NOTICE] fpm_sockets_init_main(), line 371:using inherited socket fd=10,“127.0.0.1:9000″
Sep3008:32:23.290342[NOTICE] fpm_event_init_main(), line 109: libevent:using epoll
Sep3008: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 或者一個比較大的值:
打開 /usr/local/php/etc/php-fpm.conf
調(diào)大以下兩個參數(shù)(根據(jù)服務(wù)器實際情況,過大也不行)
<valuename=”max_children”>5120</value>
<valuename=”max_requests”>600</value>
然后重啟php-fpm。
7、增加緩沖區(qū)容量大小
將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。
8、request_terminate_timeout
如果主要是在一些post或者數(shù)據(jù)庫操作的時候出現(xiàn)502這種情況,而不是在靜態(tài)頁面操作中常見,那么可以查看一下php-fpm.conf設(shè)置中的一項:request_terminate_timeout
這個值是max_execution_time,就是fast-cgi的執(zhí)行腳本時間。
0s為關(guān)閉,就是無限執(zhí)行下去。
發(fā)現(xiàn)問題解決了,執(zhí)行很長時間也不會出錯了。
優(yōu)化fastcgi中,還可以改改這個值為5s 看看效果。
php-cgi進(jìn)程數(shù)不夠用、php執(zhí)行時間長、或者是php-cgi進(jìn)程死掉,都會出現(xiàn)502錯誤。
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。