1. 程式人生 > >Nginx報504 gateway timeout錯誤的解決方法

Nginx報504 gateway timeout錯誤的解決方法

轉載文章來源:http://www.111cn.net/sys/nginx/90669.htm(若侵刪)
Nginx報504 gateway timeout錯誤引起,一個是檔案配置問題,另一個是相關處理時長了,最後也有可能是資源不足導致了,下面我們一起來看看。

解釋如下:

最近在工作中,需要做Excel匯入的功能,由於Excel的資料比較多,而且我們的服務端程式需要對資料的內容做校驗,會呼叫很多的外部服務介面,所以毫無懸念的匯入Excel介面呼叫超過了一分鐘,並且報錯:504 gateway timeout。以下是兩種解決思路:

  1. 優化業務程式碼

一個介面呼叫超過一分鐘,一定有可以優化的地方,看看資料庫或者介面的呼叫是否合理,是否可以合併請求。

  1. 修改Nginx的伺服器配置

如果實在是優化不了了,可以把Nginx的超時時間上調。
看看時間是否符合要求,在nginx.config裡面的三個引數:

fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;

以上的單位是秒。

如果使用了Nginx的代理,可以在塊里加上:

proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;

變成:

location /foo {
proxy_pass

http://xxx.xxx.xxx.xxx:8080/foo;
proxy_set_header Host host;proxysetheaderXRealIPremote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
access_log /var/log/nginx/access.foo.log main;
error_log /var/log/nginx/error.foo.log;
}

如果沒有解決我們再來看看

從錯誤程式碼基本可以確定跟nginx本身無關,主要是提交給php-fpm的請求未能正確反饋而導致,一般情況下,提交動態請求的時候,nginx會直接把 請求轉交給php-fpm,而php-fpm再分配php-cgi程序來處理相關的請求,之後再依次返回,最後由nginx把結果反饋給客戶端瀏覽器,但 我這個vps目前跑的是個純php應用內容,實際上使用者所有的請求都是php請求,有的耗費時間比較久,php-cgi程序就一直都被用滿,而php- fpm本身的配置檔案只打開了10組php-cgi程序,這樣的話線上使用者稍微多的話就會導致請求無法被正常處理而出錯。

大概分析出了原 因,下面做就比較容易了,首先是更改php-fpm的幾處配置:

把max_children由之前的10改為現在的30,這樣就可以保證 有充足的php-cgi程序可以被使用;
把request_terminate_timeout由之前的0s改為60s,這樣php-cgi程序 處理指令碼的超時時間就是60秒,可以防止程序都被掛起,提高利用效率。

接著再更改nginx的幾個配置項,減少FastCGI的請求次 數,儘量維持buffers不變:

fastcgi_buffers由 4 64k 改為 2 256k;
fastcgi_buffer_size 由 64k 改為 128K;
fastcgi_busy_buffers_size 由 128K 改為 256K;
fastcgi_temp_file_write_size 由 128K 改為 256K。

好了,重新載入php-fpm和nginx的配置,再次測試,至今兩週時間內沒有再出現504 Gateway Time-out的情況,算是達到效果了。

另外,php-fpm的預設靜態處理方式會使得php-cgi的程序長期佔用記憶體而無法釋放,這也是導致nginx出錯的原因之一,因此可以將php-fpm的處理方式改成apache模式。
apache-like

從更改完畢到現在的測試表明上述方式的效果還是很明顯的,並沒有發現一次Nginx502 bad gateway或504 Gateway Time-out錯誤。當然,如果你的VPS或者伺服器的效能足夠好可以根據具體情況不必做無謂的改動。

例項

以我目前的伺服器為例子CPU是奔四1.5G的,記憶體1GB,CENTOS的系統,訪客大概是50人左右同時線上。

但是線上的人大都需要請求PHP-CGI進行大量的資訊處理,因此我將nginx.conf設定為:
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;
這裡最主要的設定是前三條,即
fastcgi_connect_timeout 300s;
fastcgi_send_timeout 300s;
fastcgi_read_timeout 300s;
這裡規定了PHP-CGI的連線、傳送和讀取的時間,300秒足夠用了,因此我的伺服器很少出現504 Gateway Time-out這個錯誤。最關鍵的是php-fpm.conf的設定,這個會直接導致502 Bad Gateway和504 Gateway Time-out。

下面我們來仔細分析一下php-fpm.conf幾個重要的引數:
php-fpm.conf有兩個至關重要的引數,一個是”max_children”,另一個是”request_terminate_timeout”
我的兩個設定的值一個是”40″,一個是”900″,但是這個值不是通用的,而是需要自己計算的。
計算的方式如下:
如果你的伺服器效能足夠好,且寬頻資源足夠充足,PHP指令碼沒有系迴圈或BUG的話你可以直接將”request_terminate_timeout”設定成0s。0s的含義是讓PHP-CGI一直執行下去而沒有時間限制。而如果你做不到這一點,也就是說你的PHP-CGI可能出現某個BUG,或者你的寬頻不夠充足或者其他的原因導致你的PHP-CGI能夠假死那麼就建議你給”request_terminate_timeout”賦一個值,這個值可以根據你伺服器的效能進行設定。一般來說效能越好你可以設定越高,20分鐘-30分鐘都可以。由於我的伺服器PHP指令碼需要長時間執行,有的可能會超過10分鐘因此我設定了900秒,這樣不會導致PHP-CGI死掉而出現502 Bad gateway這個錯誤。
而”max_children”這個值又是怎麼計算出來的呢?這個值原則上是越大越好,php-cgi的程序多了就會處理的很快,排隊的請求就會很少。設定”max_children”也需要根據伺服器的效能進行設定,一般來說一臺伺服器正常情況下每一個php-cgi所耗費的記憶體在20M左右,因此我的”max_children”我設定成40個,20M*40=800M也就是說在峰值的時候所有PHP-CGI所耗記憶體在800M以內,低於我的有效記憶體1Gb。而如果我的”max_children”設定的較小,比如5-10個,那麼php-cgi就會“很累”,處理速度也很慢,等待的時間也較長。如果長時間沒有得到處理的請求就會出現504 Gateway Time-out這個錯誤,而正在處理的很累的那幾個php-cgi如果遇到了問題就會出現502 Bad gateway這個錯誤。
fastcgi的設定加在 server {}內.
改完後如果啟動nginx後提示:
nginx: [emerg] unknown directive ” fastcgi_connect_timeout” in /home/chen/workspace/jamy/nginx.conf:2
類似這樣的錯誤,可能是沒有把前面的全形空格去掉。

相關推薦

Nginx504 gateway timeout錯誤解決方法

轉載文章來源:http://www.111cn.net/sys/nginx/90669.htm(若侵刪) Nginx報504 gateway timeout錯誤引起,一個是檔案配置問題,另一個是相關處理時長了,最後也有可能是資源不足導致了,下面我們一起來看看。

Nginx 502 bad gateway問題的解決方法

Nginx 502 Bad Gateway的含義是請求的PHP-CGI已經執行,但是由於某種原因(一般是讀取資源的問題)沒有執行完畢而導致PHP-CGI程序終止,一般來說Nginx 502 Bad Gateway和php-fpm.conf的設定有關。 常見的原因可能是

TP5框架在nginx環境下路由404錯誤解決方法 親測可用

前段時間給客戶寫了個TP5框架的後臺,主要是API呼叫,上傳到客戶伺服器後發現首頁可用,但所有內頁報404錯誤,網上一搜發現天多一樣的問題,但找了很多都是不可用的,而且都是過時的,但最終還是自己試出來了,今天貼下,親測可用。 寶塔面板windows-5.4.0+Ngin

解決nginx 504 Gateway Time-out的方法

我解決nginx 504 Gateway Time-out的方法 我的應用是nginx+tomcat7  根據這個錯誤,是因為tomcat沒有及時迴應nginx,導致錯誤. 先使用 fiddler 將頁面的請求抓出來. 找到504的請求.然後查詢原因. 因為這個請

wdcp php執行90秒後504 Gateway Time-out 的解決方法

修改/www/wdlinux/nginx-1.0.15/conf/naproxy.conf前3項,重啟nginx和apache就好了。 proxy_connect_timeout 30s; proxy_send_timeout   90; proxy_read_timeou

錯from 子句語法錯誤 解決方法

nbsp -1 alt http 1-1 解決 語法 ges cnblogs 解決方法: 報錯from 子句語法錯誤 解決方法

mysql1236錯誤解決方法

mysql主從復制 mysql主從同步 mysql slave狀態如下,發現IO線程為NO狀態,並且報1236錯誤代碼mysql> show slave status\G *************************** 1. row ***************************

JSP 使用<%@include%>Duplicate local variable path 錯誤 解決方法

錯誤提示 cat not 情況 cal quest epon bsp multi 錯誤提示:Multiple annotations found at this line:- Duplicate local variable path- Duplicate local va

SpringMVC提交數據遭遇基礎類型和日期類型400錯誤解決方法

筆記 運行 inpu 遭遇 imp public 增加 試用 too 使用SpringMVC開發的時候,頁面如果有日期格式的數據,後臺接受也是java.util.Date,則報告400錯誤 。下面是解決方案的演示示例: 這個是實體類,裏面createDate就是ja

nginx出現504 Gateway Time-out的解決思路

str pst bus conn OS head agent cti 時間限制 http://www.xbc.me/nginx-fix-504-gateway-timeout/ 在安裝完Nginx+PHP-fpm+Mysql後 (如何安裝LNMP環境,請參考快速配置LN

gatling壓力測試工具啟動gatling.bat命令行窗口Error occurred during initialization of VM Could not reserve enough space for 1048576KB object heap錯誤解決方法

大於 spa ava color default class -xms 查看系統 測試 原因是:Java虛擬機(JVM)分配的內存大於系統可用內存數,所以沒有足夠的空間分配給JVM來創建Object 解決方法:編輯gatling.bat文件,查看系統剩余內存大小,修改分配的

微信小程序訪問豆瓣api403錯誤解決方法

src 數據信息 right json 地址 https display gin 微信小程序   通過豆瓣API可以獲取很多電影、書籍的數據信息,今天在調用豆瓣正在上映電影接口的時候報403錯誤,原因是豆瓣設置了小程序的訪問權限。如下:   解決方法是使用代理,將豆瓣AP

Nginx 提示host not found in upstream 錯誤解決方法

dns設置 1.7 bsp 步驟 訪問 size 實例 n-n 每次 Nginx DNS resolver配置實例,本文講解在proxy_pass 和 upstream server 通信的時候需要手動指定 resolver,本文就給出了配置實例

Windows10系統 藍屏UNEXPECTED_STORE_EXCEPTION錯誤解決方法

電腦環境:Windows10 64位系統、NVME固態硬碟 錯誤現象 1、系統啟動時藍屏並且報UNEXPECTED_STORE_EXCEPTION錯誤。 2、系統多次出現:突然卡住,不能進行任何操作,只能重啟電腦。 原因 固態硬碟驅動與當前固態硬碟驅動程式不相容或是當前

nginx中遇到 [alert] kill(25903, 1) failed (3: No such process)錯誤解決方法

當nginx出現如下類似錯誤的時候,不要驚慌,首先看報錯日誌,為什麼報錯,再尋求解決辦法。 nginx: [alert] kill(25903, 1) failed (3: No such process) 通過在nginx/sbin,目錄下 執行命令 ./nginx ,

maven 引入本地項目jar紅線錯誤解決方法

解決方法 enc The .com 問題: gin cti maven not 問題:本地創建了2個項目,A和B,A引入B,A的pom如下: <dependency> <groupId>com.ebc</groupId

Xshell“The remote SSH server rejected X11 forwarding request.”錯誤解決方法

1.首先修改配置檔案 1.1遠端主機是 OpenSSH vi /etc/ssh/sshd_config, 設定 X11Forwarding yes 1.2遠端主機是 SSH.COM vi /etc/ssh2/sshd2_config, 設定 AllowX11Forwar

eclipse錯:[Click the icon to add star.] Internal Error: java.lang.NullPointerException -----錯誤解決方法

linux系統下,eclipse出現以下報錯 [Click the icon to add star.] Internal Error: java.lang.NullPointerException的解決辦法 1、首先關閉MyEclipse工作空間。 2、然後刪除工作空間下的

高版本JDK的專案在低版本執行 a jni error has occurred 錯誤解決方法

這個問題確實是由較高版本的JDK編譯的java class檔案試圖在較低版本的JVM上執行產生的錯誤。     1、解決措施就是保證jvm(java命令)和jdk(javac命令)版本一致。如果是linux版本,則在命令列中分別輸入java -version和javac -

NginX錯之10060錯誤upstream timed out (10060: A connection attempt...——解決方案

由於介面呼叫頻率較高,故選用NginX配置負載均衡,均衡伺服器壓力,原始nginx.conf配置如下 原始nginx.conf檔案 #user nobody; worker_processes 1; #error_log logs/error.log; #er