av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

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

瀏覽:193日期:2023-03-13 15:37:39
目錄
  • 背景:
  • 問(wèn)題:
  • 504從哪來(lái):本文的場(chǎng)景下504是nginx返回的。
  • 兩種解決方案
  • 其他問(wèn)題:
  • 總結(jié)

背景:

Nginx做反向代理,springboot為后端服務(wù)。

問(wèn)題:

通過(guò)瀏覽器向后臺(tái)發(fā)起請(qǐng)求夠,由于后臺(tái)處理時(shí)間長(zhǎng),出現(xiàn)504 Gateway Time-out,實(shí)際后臺(tái)程序依然在執(zhí)行。如何解決?

504從哪來(lái):本文的場(chǎng)景下504是nginx返回的。

nginx配置中控制該超時(shí)時(shí)間的屬性:

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.

一個(gè)請(qǐng)求有三方參與:瀏覽器,nginx,后臺(tái)服務(wù)器。

504的錯(cuò)誤碼是有nginx返回的。結(jié)合官網(wǎng)的解釋?zhuān)覀兛梢缘贸鼋Y(jié)論:

當(dāng)nginx與后臺(tái)的鏈接兩次讀取有效數(shù)據(jù)之間超過(guò)配置的時(shí)間時(shí),就會(huì)產(chǎn)生504超時(shí)。nginx會(huì)主動(dòng)關(guān)閉與后臺(tái)服務(wù)器的鏈接。注意是兩次成功讀取的間隔,不是整個(gè)reponse的時(shí)間。

默認(rèn)情況下proxy_read_timeout時(shí)60s。

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

增大方法很簡(jiǎn)單,proxy_read_timeout  [你期望的時(shí)間]。

But,后臺(tái)效率提升總是有極限的。而proxy_read_timeout是固定值。總會(huì)有些正常業(yè)務(wù)場(chǎng)景,超過(guò)了設(shè)置的timeout值。

兩種解決方案

本人解決的問(wèn)題:上傳excel文件后,由于文件大小無(wú)法預(yù)計(jì),所以后臺(tái)處理時(shí)間也無(wú)法預(yù)計(jì)。同時(shí)還要支持大文件的上傳。上傳后由后臺(tái)解析處理。post請(qǐng)求,返回的是json。

一,關(guān)閉read-timout,可以實(shí)現(xiàn),但是生產(chǎn)環(huán)境下你敢不設(shè)置超時(shí)時(shí)間么?所以不建議。

二,既然nginx只要從reponse成功讀取數(shù)據(jù)兩次的間隔在proxy_read_timeout設(shè)置的時(shí)間內(nèi),就不會(huì)超時(shí)。那么我們是不是可以通過(guò)持續(xù)的向response中寫(xiě)入數(shù)據(jù)來(lái)保證不超時(shí)呢。

答案是肯定的。

想通了這一點(diǎn),實(shí)現(xiàn)就十分簡(jiǎn)單。

1,正常上傳文件。

2,新建一個(gè)線(xiàn)程。持有response的引用,含有標(biāo)志位,滿(mǎn)足條件時(shí)循環(huán)執(zhí)行,程序開(kāi)始處理數(shù)據(jù)前,啟動(dòng)線(xiàn)程。

3,線(xiàn)程的功能只有一個(gè),以固定間隔向response中寫(xiě)入數(shù)據(jù)。使nginx與后臺(tái)鏈接不超時(shí)。

4,這里就需要注意,我的方法是返回json,同時(shí)要持續(xù)向response寫(xiě)入數(shù)據(jù),所以我手動(dòng)拼裝json字符串。相當(dāng)于在之前返回的json中增加一個(gè)屬性,名稱(chēng)隨意,我的叫pending,值隨意,非空即可。我是用英文半角的句號(hào)" . "。

5,數(shù)據(jù)處理完后,回調(diào)線(xiàn)程的stop方法,終止線(xiàn)程中的循環(huán)。

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

保持線(xiàn)程代碼如下:

#上下文代碼
//獲取鮮橙池executor,具體方式看個(gè)人。不會(huì)的直接百度,有很多
response.setContentType(ContentType.APPLICATION_JSON.getMimeType());
ResponseKeeper responseKeeper = new ResponseKeeper(response);
executorService.execute(responseKeeper);
#上下文代碼
 
 
public class ResponseKeeper implements Runnable {
 
/**
* 循環(huán)標(biāo)志:true時(shí)停止循環(huán),終止線(xiàn)程
*/
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();
    }
}
    }

其他問(wèn)題:

如果你遇到異常

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

那就說(shuō)明你的程序中有地方調(diào)用過(guò)了,response.getOutputStream();

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

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

原因簡(jiǎn)單來(lái)講就是這兩個(gè)方法互斥。調(diào)用了一個(gè)就不能調(diào)用另一個(gè)。

總結(jié)

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

標(biāo)簽: Nginx
主站蜘蛛池模板: 欧美一区二区免费电影 | 精品一区二区三区91 | 天天色官网 | 国产精品久久久久久二区 | 国产一级一级毛片 | 精品粉嫩aⅴ一区二区三区四区 | 日本三级做a全过程在线观看 | 亚洲高清在线视频 | 538在线精品 | 久久伊人精品一区二区三区 | 一区二区视频 | 午夜视频一区二区三区 | 国产毛片久久久久久久久春天 | 国产欧美在线一区二区 | 日韩国产精品一区二区三区 | 免费不卡av | 自拍偷拍第一页 | 日韩亚洲视频 | 2一3sex性hd| 欧美黄色一级毛片 | 婷婷综合| 亚洲乱码一区二区三区在线观看 | 色综合色综合色综合 | 一区二区三区不卡视频 | 夜夜夜夜夜夜曰天天天 | 国产精品久久久久久久久久免费 | 亚洲欧美一区二区在线观看 | 精品99在线| 亚洲午夜av久久乱码 | 视频一区二区三区中文字幕 | 欧美精品一二三 | 日日骚av| 亚洲狠狠爱一区二区三区 | 男人天堂国产 | 99re6热在线精品视频播放 | 久久成人免费 | 午夜丁香视频在线观看 | 色爱综合网 | 91精品在线播放 | 91麻豆久久久 | 欧美成年网站 |