亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

Nginx 504 Gateway Time-out的兩種最新解決方案

瀏覽:198日期:2023-03-13 15:37:39
目錄
  • 背景:
  • 問題:
  • 504從哪來:本文的場景下504是nginx返回的。
  • 兩種解決方案
  • 其他問題:
  • 總結

背景:

Nginx做反向代理,springboot為后端服務。

問題:

通過瀏覽器向后臺發起請求夠,由于后臺處理時間長,出現504 Gateway Time-out,實際后臺程序依然在執行。如何解決?

504從哪來:本文的場景下504是nginx返回的。

nginx配置中控制該超時時間的屬性:

Syntax:proxy_read_timeout time;Default:
proxy_read_timeout 60s;
Context:http, server, location

官方地址:Module ngx_http_proxy_module (nginx.org)

官方描述如下:Defines a timeout for reading a response from the proxied server. The timeout is set only between two successive read operations, not for the transmission of the whole response. If the proxied server does not transmit anything within this time, the connection is closed.

一個請求有三方參與:瀏覽器,nginx,后臺服務器。

504的錯誤碼是有nginx返回的。結合官網的解釋,我們可以得出結論:

當nginx與后臺的鏈接兩次讀取有效數據之間超過配置的時間時,就會產生504超時。nginx會主動關閉與后臺服務器的鏈接。注意是兩次成功讀取的間隔,不是整個reponse的時間。

默認情況下proxy_read_timeout時60s。

如果你百度或google,通常解決方式有兩種:提高后臺處理效率增大proxy_read_timeout。

增大方法很簡單,proxy_read_timeout  [你期望的時間]。

But,后臺效率提升總是有極限的。而proxy_read_timeout是固定值??倳行┱I務場景,超過了設置的timeout值。

兩種解決方案

本人解決的問題:上傳excel文件后,由于文件大小無法預計,所以后臺處理時間也無法預計。同時還要支持大文件的上傳。上傳后由后臺解析處理。post請求,返回的是json。

一,關閉read-timout,可以實現,但是生產環境下你敢不設置超時時間么?所以不建議。

二,既然nginx只要從reponse成功讀取數據兩次的間隔在proxy_read_timeout設置的時間內,就不會超時。那么我們是不是可以通過持續的向response中寫入數據來保證不超時呢。

答案是肯定的。

想通了這一點,實現就十分簡單。

1,正常上傳文件。

2,新建一個線程。持有response的引用,含有標志位,滿足條件時循環執行,程序開始處理數據前,啟動線程。

3,線程的功能只有一個,以固定間隔向response中寫入數據。使nginx與后臺鏈接不超時。

4,這里就需要注意,我的方法是返回json,同時要持續向response寫入數據,所以我手動拼裝json字符串。相當于在之前返回的json中增加一個屬性,名稱隨意,我的叫pending,值隨意,非空即可。我是用英文半角的句號" . "。

5,數據處理完后,回調線程的stop方法,終止線程中的循環。

注意:如有雷同純屬巧合。如果已經有大佬講過這種解決方式,請艾特我,我立即刪除本文。

保持線程代碼如下:

#上下文代碼
//獲取鮮橙池executor,具體方式看個人。不會的直接百度,有很多
response.setContentType(ContentType.APPLICATION_JSON.getMimeType());
ResponseKeeper responseKeeper = new ResponseKeeper(response);
executorService.execute(responseKeeper);
#上下文代碼
 
 
public class ResponseKeeper implements Runnable {
 
/**
* 循環標志:true時停止循環,終止線程
*/
private boolean done = false;

private HttpServletResponse response;
 
public void stop(){
    done = true;
}
 
public ResponseKeeper(HttpServletResponse response) {
    this.response = response;
}
 
@Override
public void run() {
    try {
response.getWriter().write("{\"pending\":\"");
while(!done){
    response.getWriter().write(".");
    response.getWriter().flush();
    LOGGER.error("flush-{}", System.currentTimeMillis());
    Thread.sleep(1000);
}
response.getWriter().write("\", \"status\": \"0\", \"msg\":\"success\"}");
    } catch (Exception e) {
e.printStackTrace();
    }
}
    }

其他問題:

如果你遇到異常

IllegalStateException – if the getOutputStream method has already been called for this response object

那就說明你的程序中有地方調用過了,response.getOutputStream();

只需要與已有程序保持一致使用outputStream即可。

即將response.getWriter() 提換成 response.getOutputStream();

原因簡單來講就是這兩個方法互斥。調用了一個就不能調用另一個。

總結

到此這篇關于Nginx 504 Gateway Time-out的兩種解決方案的文章就介紹到這了,更多相關Nginx 504 Gateway Time-out內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

標簽: Nginx
主站蜘蛛池模板: 曰批美女免费视频播放 | 黄色小视频免费在线观看 | 亚洲国产高清在线精品一区 | 福利午夜国产网站在线不卡 | 国内小情侣一二三区在线视频 | 狠狠色欧美亚洲狠狠色五 | 啪啪网免费视频 | 黄色网免费看 | 国产精品一二区 | 三级欧美在线 | 网友自拍一区 | 国产片一区二区三区 | 国产欧美日韩在线观看 | 色婷婷亚洲精品综合影院 | 国产麻豆网 | 欧美一级毛片片aa视频 | 永久免费看www色视频 | 免费尤物视频 | 国产精品国产三级国产普通话对白 | 久久六月丁香婷婷婷 | 国产a级男女性高爱潮片 | 国产白领丝袜办公室在线视频 | 中国一级特黄毛片 | 色综合合久久天天给综看 | 国产成人精品微拍视频 | 中文字幕亚洲一区二区v@在线 | 日本aaaa级 | 黄色片在线免费观看视频 | 粉嫩极品国产在线播放 | 欧美精品一区二区在线观看播放 | 免费国产不卡午夜福在线 | 久久久久国产精品免费网站 | 国产在线拍小情侣国产拍拍偷 | 国产在线麻豆精品 | 国产一区在线免费观看 | 国产亚洲美女精品久久久久狼 | 国产在线永久视频 | 超级成人97碰碰碰免费 | 伊人久久99亚洲精品久久频 | 亚洲精品影院一区二区 | 日本免费看片在线播放 |