首頁 運維 Nginx nginx 502 Bad Gateway錯誤怎麼解決

nginx 502 Bad Gateway錯誤怎麼解決

May 20, 2023 pm 03:16 PM
nginx

nginx 502的觸發條件

  502錯誤最通常的出現情況就是後端主機當機。在upstream配置裡有這麼一項配置:proxy_next_upstream,這個配置指定了nginx在從一個後端主機取資料遇到何種錯誤時會轉到下一個後端主機,裡頭寫上的就是會出現502的所有情況拉,預設是error timeout。 error就是當機、斷線之類的,timeout就是讀取阻塞超時,比較容易理解。我通常是全寫上的:

proxy_next_upstream error timeout invalid_header http_500 http_503;  不過現在可能我要去掉http_500這一項了,http_500指定後端回傳500錯誤時會轉一個主機,後端的jsp出錯的話,本來會印一堆stacktrace的錯誤訊息,現在被502取代了。但公司的程式設計師可不這麼認為,他們認定是nginx出現了錯誤,我實在沒空跟他們解釋502的原理了…

503錯誤就可以保留,因為後端通常是apache resin,如果apache死機就是error,但resin死機,只是503,所以還是必要保留的。

解決方法

遇到502問題,可以優先考慮依照以下兩個步驟去解決。

1、查看目前的php fastcgi進程數是否夠用:

複製程式碼 程式碼如下:

netstat -anpo | grep "php-cgi" | wc -l

如果實際使用的“fastcgi進程數”接近預設的“fastcgi進程數”,那麼,說明“fastcgi進程數”不夠用,需要增加。

2、部分php程式的執行時間超過了nginx的等待時間,可以適當增加nginx.conf設定檔中fastcgi的timeout時間,例如:

複製程式碼 程式碼如下:

 http  {
  fastcgi_connect_timeout 300;
  fastcgi_send_timeout 300;
  fastcgi_read_timeout 300;
  ......
  }
#o..
##php.ini中memory_limit設低了會出錯,修改了php.ini的memory_limit為64m,重啟nginx,發現好了,原來是php的記憶體不足了。

  

如果這樣修改了還解決不了問題,可以參考下面這些方案:

##一、max-children和max-requests

#  一台伺服器上運行著nginx php(fpm) xcache,訪問量日均300w pv左右。

  最近經常會出現這樣的情況:php頁面打開很慢,cpu使用率突然降至很低,系統負載突然升至很高,查看網卡的流量,也會發現突然降到了很低。這種情況只持續數秒鐘就恢復了。

  檢查php-fpm的日誌檔案發現了一些線索。

複製程式碼 程式碼如下:

sep 30 08:32:23.289973 [notice] fpm_unix_init_main(), line 271: getrlimit(nofile): max:51200, cur:51200 sep 30 32:23.290212 [notice] fpm_sockets_init_main(), line 371: using inherited socket fd=10, “127.0.0.1:9000″  sep 30 08:32:23.2903:29903:00 ing epoll  sep 30 08:32:23.296426 [notice] fpm_init(), line 47: fpm is running, pid 30587 

#在這幾句的前面,是1000多行的關閉children和開啟children的日誌。

  原來,php-fpm有一個參數 max_requests,該參數指明了,每個children最多處理多少個請求後便會被關閉,預設的設定是500。因為php是把請求輪詢給每個 children,在大流量下,每個childre到達max_requests所用的時間都差不多,這樣就造成所有的children基本上在同一時間 被關閉。

  在這段期間,nginx無法將php檔案轉交給php-fpm處理,所以cpu會降至很低(不用處理php,更不用執行sql),而負載會升至很高(關閉和開啟children、nginx等待php-fpm),網路卡流量也降至很低(nginx無法產生資料傳送給客戶端)

  解決問題很簡單,增加children的數量,並且將max_requests 設定未0 或者一個比較大的值:

  開啟/usr/local/php/etc/php-fpm.conf調大以下兩個參數(根據伺服器實際情況,過大也不行)

複製代碼 代碼如下:

5120

600  


然後重啟php-fpm。

二、增加緩衝區容量大小

  將nginx的error log打開,發現「pstream sent too big header while reading response header from upstream」這樣的錯誤提示。查閱了一下資料,大意是nginx緩衝區有一個bug造成的,我們網站的頁面消耗佔用緩衝區可能過大。參考老外寫的修 改辦法增加了緩衝區容量大小設置,502問題徹底解決。後來系統管理員又對參數做了調整隻保留了2個設定參數:client head buffer,fastcgi buffer size。

三、request_terminate_timeout

  如果主要是在一些post或資料庫操作的時候出現502這種情況,而不是在靜態頁面操作中常見,那麼可以查看一下php-fpm.conf設定中的一項:

# request_terminate_timeout

這個值是max_execution_time,就是fast-cgi的執行腳本時間。

0s

0s為關閉,就是無限執行下去。 (當時裝的時候沒仔細看就改了一個數字)問題解決了,執行很久也不會出錯了。優化fastcgi中,還可以改改這個值5s 看看效果。

php-cgi進程數不夠用、php執行時間長、或是php-cgi進程死掉,都會出現502錯誤。

nginx 502 bad gateway錯誤的解決辦法2

今天,我的vps頻繁提示nginx 502 bad gateway錯誤了,重啟了vps解決之後又出現,很煩。有點想不通,前兩天網站達到了1290的訪問量都沒有出什麼問題,怎麼這次就出現了502 bad gateway?鬱悶啊! ! !在搜尋了很久,終於找到了不少相關的答案,希望修改之後不會再出現這個錯誤了。唉,既然在網路上找了那麼久的答案,那當然得把有用的東西記錄下,免得我下次再去谷歌~

由於我是採用了lnmp一鍵安裝包,出了問題一定要先到官方論壇去搜尋下了,真好,官方有個這樣的置頂帖,大家先瞧瞧。

lnmp一鍵安裝套件官方的:

第一種原因:目前lnmp一鍵安裝套件比較多的問題就是502 bad gateway,大部分情況下原因是在安裝php前,腳本中某些lib套件可能沒有安裝上,造成php沒有編譯安裝成功。
解決方法:可以嘗試根據lnmp一鍵安裝套件中的腳本手動安裝一下,看看是什麼錯誤導致的。

第二個原因:

在php.ini裡,eaccelerator設定項一定要放在zend optimizer設定之前,否則也可能會造成502 bad gateway

第三種原因:

在安裝好使用過程中出現502問題,一般是因為預設php-cgi進程是5個,可能因為phpcgi進程不夠用而造成502,需要修改/usr/local/php/ etc/php-fpm.conf 將其中的max_children值適當增加。

第四個原因:

php執行逾時,修改/usr/local/php/etc/php.ini 將max_execution_time 改為300

#第五個原因:

磁碟空間不足,如mysql日誌佔用大量空間

第六種原因:

查看php-cgi進程是否在運行

也有網友給出了另外的解決辦法:

nginx 502 bad gateway的含義是請求的php-cgi已經執行,但是由於某種原因(一般是讀取資源的問題)沒有執行完畢而導致php-cgi進程終止,一般來說nginx 502 bad gateway和php-fpm.conf的設定有關。

php-fpm.conf有兩個至關重要的參數,一個是max_children,另一個是request_terminate_timeout,但是這個值不是通用的,而是需要自己計算的。
在安裝好使用過程中出現502問題,一般是因為預設php-cgi進程是5個,可能因為phpcgi進程不夠用而造成502,需要修改/usr/local/php/etc/php-fpm. conf 將其中的max_children值適當增加。

計算的方式如下:

如果你的伺服器效能夠好,且寬頻資源夠充足,php腳本沒有繫循環或bug的話你可以直接將 request_terminate_timeout設定成0s。 0s的意思是讓php-cgi一直執行下去而沒有時間限制。而如果你做不到這一點,也就是說你的php-cgi可能出現某個bug,或者你的寬頻不夠充足或其他的原因導致你的php-cgi假死那麼就建議你給request_terminate_timeout賦一個值,這個值可以根據伺服器的效能進行設定。一般來說效能越好你可以設定越高,20分鐘-30分 鐘都可以。
而max_children這個值又是怎麼計算出來的呢?這個數值原則上越大越好,php-cgi的進程多了就會處理的很快,排隊的請求就會很少。設定max_children也需要依照伺服器的效能設定,一般來說一台伺服器正常情況下每一個php-cgi所耗費的內存在20m左右。

依照官方的答案,排查了相關的可能,並結合了網友的答案,得出了下面的解決辦法。

1、查看php fastcgi的進程數(max_children值)

程式碼:netstat -anpo | grep “php-cgi” | wc -l

#5(假如顯示5)

2、查看目前進程

程式碼:top
觀察fastcgi進程數,假如使用的進程數等於或高於5個,說明需要增加(根據你機器實際狀況而定)

3、調整/usr/local/php/etc/php-fpm.conf 的相關設定

1060s
max_children最多10個進程,依照每個進程20mb內存,最多200mb。
request_terminate_timeout執行的時間為60秒,也就是1分鐘。

以上是nginx 502 Bad Gateway錯誤怎麼解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1653
14
CakePHP 教程
1413
52
Laravel 教程
1306
25
PHP教程
1251
29
C# 教程
1224
24
nginx在windows中怎麼配置 nginx在windows中怎麼配置 Apr 14, 2025 pm 12:57 PM

如何在 Windows 中配置 Nginx?安裝 Nginx 並創建虛擬主機配置。修改主配置文件並包含虛擬主機配置。啟動或重新加載 Nginx。測試配置並查看網站。選擇性啟用 SSL 並配置 SSL 證書。選擇性設置防火牆允許 80 和 443 端口流量。

docker容器名稱怎麼查 docker容器名稱怎麼查 Apr 15, 2025 pm 12:21 PM

可以通過以下步驟查詢 Docker 容器名稱:列出所有容器(docker ps)。篩選容器列表(使用 grep 命令)。獲取容器名稱(位於 "NAMES" 列中)。

docker怎麼啟動容器 docker怎麼啟動容器 Apr 15, 2025 pm 12:27 PM

Docker 容器啟動步驟:拉取容器鏡像:運行 "docker pull [鏡像名稱]"。創建容器:使用 "docker create [選項] [鏡像名稱] [命令和參數]"。啟動容器:執行 "docker start [容器名稱或 ID]"。檢查容器狀態:通過 "docker ps" 驗證容器是否正在運行。

怎麼查看nginx是否啟動 怎麼查看nginx是否啟動 Apr 14, 2025 pm 01:03 PM

確認 Nginx 是否啟動的方法:1. 使用命令行:systemctl status nginx(Linux/Unix)、netstat -ano | findstr 80(Windows);2. 檢查端口 80 是否開放;3. 查看系統日誌中 Nginx 啟動消息;4. 使用第三方工具,如 Nagios、Zabbix、Icinga。

docker怎麼創建容器 docker怎麼創建容器 Apr 15, 2025 pm 12:18 PM

在 Docker 中創建容器: 1. 拉取鏡像: docker pull [鏡像名] 2. 創建容器: docker run [選項] [鏡像名] [命令] 3. 啟動容器: docker start [容器名]

nginx怎麼查版本 nginx怎麼查版本 Apr 14, 2025 am 11:57 AM

可以查詢 Nginx 版本的方法有:使用 nginx -v 命令;查看 nginx.conf 文件中的 version 指令;打開 Nginx 錯誤頁,查看頁面的標題。

nginx怎麼配置雲服務器域名 nginx怎麼配置雲服務器域名 Apr 14, 2025 pm 12:18 PM

在雲服務器上配置 Nginx 域名的方法:創建 A 記錄,指向雲服務器的公共 IP 地址。在 Nginx 配置文件中添加虛擬主機塊,指定偵聽端口、域名和網站根目錄。重啟 Nginx 以應用更改。訪問域名測試配置。其他注意事項:安裝 SSL 證書啟用 HTTPS、確保防火牆允許 80 端口流量、等待 DNS 解析生效。

nginx服務器掛了怎麼辦 nginx服務器掛了怎麼辦 Apr 14, 2025 am 11:42 AM

當 Nginx 服務器宕機時,可執行以下故障排除步驟:檢查 nginx 進程是否正在運行。查看錯誤日誌以獲取錯誤消息。檢查 nginx 配置語法正確性。確保 nginx 具有訪問文件所需的權限。檢查文件描述符打開限制。確認 nginx 正在偵聽正確的端口。添加防火牆規則以允許nginx流量。檢查反向代理設置,包括後端服務器可用性。如需進一步幫助,請聯繫技術支持。

See all articles