最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2022年08月17日 09:26:38   作者:fox_mt  
大家在訪問網(wǎng)站的時候通常會遇到502錯誤、404錯誤等,很少會遇到504錯誤,但是在我們?nèi)ピL問大流量或者內(nèi)容數(shù)據(jù)量較多的網(wǎng)站時,打開網(wǎng)頁偶爾就會出現(xiàn)504 gateway time-out,這篇文章主要給大家介紹了關于Nginx?504?Gateway?Time-out的兩種解決方案,需要的朋友可以參考下

背景:

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

問題:

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

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返回的。結(jié)合官網(wǎng)的解釋,我們可以得出結(jié)論:

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

默認情況下proxy_read_timeout時60s。

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

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

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

兩種解決方案

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

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

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

答案是肯定的。

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

1,正常上傳文件。

2,新建一個線程。持有response的引用,含有標志位,滿足條件時循環(huán)執(zhí)行,程序開始處理數(shù)據(jù)前,啟動線程。

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

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

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

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

保持線程代碼如下:

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

其他問題:

如果你遇到異常

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

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

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

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

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

總結(jié)

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

相關文章

  • nginx修改上傳文件大小限制的方法

    nginx修改上傳文件大小限制的方法

    本篇文章主要介紹了nginx修改上傳文件大小限制的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧。
    2016-12-12
  • 在nginx中設置三級域名的方法示例

    在nginx中設置三級域名的方法示例

    這篇文章主要介紹了在nginx中設置三級域名的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • nginx之Http代理和Websocket代理詳解

    nginx之Http代理和Websocket代理詳解

    本文介紹了在Ubuntu上安裝和配置Nginx的步驟,包括啟動、停止、重新加載配置、重新打開日志文件、查看進程等常用命令,還詳細介紹了Nginx的靜態(tài)代理和負載均衡功能,包括輪詢、最少連接數(shù)、iphash和權重等策略
    2025-03-03
  • Nginx配置虛擬主機的三種方法

    Nginx配置虛擬主機的三種方法

    本文主要介紹了Nginx配置虛擬主機的三種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • nginx location語法使用介紹

    nginx location語法使用介紹

    Nginx 中的 Location 指令 是NginxHttpCoreModule中重要指令。Location 指令,是用來為匹配的 URI 進行配置,URI 即語法中的”/uri/”,可以是字符串或正則表達式。但如果要使用正則表達式,則必須指定前綴
    2015-01-01
  • nginx主動健康檢查功能實現(xiàn)

    nginx主動健康檢查功能實現(xiàn)

    nginx_upstream_check_module是一個Nginx的第三方模塊,它可以實現(xiàn) Nginx的主動健康檢查功能,本文將介紹一個基于 Nginx 的第三方模塊 nginx_upstream_check_module,它可以實現(xiàn) Nginx 的主動健康檢查功能,可以幫助我們更加有效地管理后端服務器,需要的朋友可以參考下
    2023-05-05
  • nginx之virtual host虛擬主機的配置實現(xiàn)

    nginx之virtual host虛擬主機的配置實現(xiàn)

    虛擬主機(vhost)技術允許一臺物理服務器托管多個獨立網(wǎng)站或應用,每個虛擬主機擁有獨立的域名、配置文件等,實現(xiàn)資源隔離管理,Nginx服務器通過配置文件實現(xiàn)虛擬主機設置,感興趣的可以了解一下
    2024-11-11
  • nginx反向代理配置去除前綴案例教程

    nginx反向代理配置去除前綴案例教程

    這篇文章主要介紹了nginx反向代理配置去除前綴案例教程,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • Nginx負載均衡配置實例

    Nginx負載均衡配置實例

    這篇文章主要介紹了Nginx負載均衡配置實例,隨著互聯(lián)網(wǎng)信息的爆炸性增長,負載均衡已經(jīng)不再是一個很陌生的話題,顧名思義,負載均衡即是將負載分攤到不同的服務單元,既保證服務的可用性,又保證響應足夠快,給用戶很好的體驗,需要的朋友可以參考下
    2023-07-07
  • nginx支持tcp轉(zhuǎn)發(fā)的配置分享

    nginx支持tcp轉(zhuǎn)發(fā)的配置分享

    本文給大家講解的是使用nginx實現(xiàn)TCP轉(zhuǎn)發(fā)的配置方法,非常的簡單實用,并附上了所需模塊的下載地址,有需要的小伙伴可以參考下
    2017-10-10

最新評論

奉化市| 唐河县| 登封市| 亳州市| 武功县| 溧阳市| 奉化市| 长海县| 肥城市| 谷城县| 北安市| 大洼县| 宜丰县| 治县。| 清镇市| 临颍县| 即墨市| 连山| 和平区| 靖宇县| 昔阳县| 肃宁县| 长宁县| 左权县| 饶平县| 赣榆县| 安塞县| 蒙山县| 囊谦县| 南城县| 双峰县| 通化市| 资兴市| 林西县| 平江县| 东莞市| 独山县| 南通市| 屏南县| 阿克陶县| 义马市|