Nginx作反向代理時超時重試配置

来源:https://www.cnblogs.com/kongieg/archive/2022/07/19/16495335.html
-Advertisement-
Play Games

這裡只討論作反向代理時,當上游服務發生如介面超時、返回指定狀態碼等狀況時而導致nginx超時重試。 這裡使用的nginx版本為1.16.1,可通過nginx -V查看版本。 超時重試主要通過配置ngx_http_upstream_module和ngx_http_proxy_module模塊中欄位實現 ...


這裡只討論作反向代理時,當上游服務發生如介面超時、返回指定狀態碼等狀況時而導致nginx超時重試。

這裡使用的nginx版本為1.16.1,可通過nginx -V查看版本。

超時重試主要通過配置ngx_http_upstream_modulengx_http_proxy_module模塊中欄位實現的。

這兩個模塊的官方文檔:

準備的工作:

  1. 準備一個後臺服務,向外暴露訪問地址,服務收到請求後,處理的時間為5s(當然你可以設置為其它大小),隨後返回結果。這是用來模擬nginx訪問上游服務介面時超時場景。
  2. 運行兩個這樣相同的後臺服務實例,對外暴露的埠分別為9090和9091,用來模擬nginx作負載均衡的場景。
  3. nginx配置一個server,暴露埠9000,用於接收請求,並把請求分發到9090和9091的兩台實例上。

具體配置:

upstream RETRY_TEST_SERVER {
        server 127.0.0.1:9090;
        server 127.0.0.1:9091;
}

server {
        listen 9000;
        server_name localhost;
        location / {
                proxy_pass http://RETRY_TEST_SERVER;
                proxy_next_upstream timeout;
                proxy_read_timeout 3;
        }
}

配置欄位解釋:

  • proxy_pass

    即分發到哪個upstream上

  • proxy_next_upstream

    用來配置哪些情景下會重試。當nginx收到請求,並把請求轉發到RETRY_TEST_SERVER,upstream預設的負載均衡策略為輪詢,第一次請求轉到9090埠,若9090服務實例響應超時,那麼將會將請求轉到9091,這個“響應超時”,就是這個欄位配置的觸發場景。可配置的欄位有:

    • timeout
    • error
    • http_500

    預設的配置為 proxy_next_upstream error timeout

    所有的配置列表及含義:https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_next_upstream

  • proxy_read_timeout

    配置從上游服務讀取的超時時間。

    官方解釋為:

    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.

運行

由於設置了proxy_read_timeout為3秒,實例的響應時間為5秒,所以當訪問地址curl localhost:9000/test/delay(這是實例的介面測試地址)時:

  1. 請求路由到9090埠,9090接收到請求,3秒後請求超時
  2. 由於配置了proxy_next_upstream timeout,即在發生超時時,會路由到下一節點,這時請求會路由到9091
  3. 3秒過後請求再次超時,nginx返回給客戶端錯誤信息:Gateway Timeout;

註意

  1. 由於作測試用,為方便會將多個相同的實例部署到本機通過埠作負載均衡測試,如:

    upstream RETRY_TEST_SERVER {
            server 127.0.0.1:9090;
            server 127.0.0.1:9091;
    }
    

    我在測試時,server 後的 127.0.0.1 一開始是寫成localhost,測試9090發生超時時,沒有路由到9091,而是又在9090執行了一次,改成127.0.0.1後正常。

  2. upstream 的 server 模塊後還可以添加其它屬性欄位:

    upstream RETRY_TEST_SERVER {
            server 127.0.0.1:9090 max_fails=2 fail_timeout=10s;
            server 127.0.0.1:9091 max_fails=2 fail_timeout=10s;
    }
    

    官方文檔:https://nginx.org/en/docs/http/ngx_http_upstream_module.html#server

    • max_failsfail_timeout

      max_failsfail_timeout須結合使用,意為“在多長時間內訪問server多少次不可用”時,標記這個server節點不可用,若不可用則在此周期內當該server收到請求後直接返回錯誤,即nginx會直接返回給客戶端 "Bad Gateway",等到下一個 "fail_timeout"周期,才會再次嘗試該server是否可用。(至於"如何判斷是否可用",則根據欄位proxy_next_upstream的配置。)

      這一點相當重要。如實例有兩個請求地址,一個耗時較長 /test/slow,一個耗時較短 /test/fast;當介面/test/slow超時時,指定時間(fail_timeout)超過最大嘗試次數(max_fails)時,此時9090標記為不可用,此時請求/tset/fast路由到9090上時,nginx 會直接返回錯誤(Bad Gateway),即超時介面影響了正常介面的調用。

      我建議有兩種方式:

      1. 提高檢測是否可用的頻率

        即使 fail_timeout/max_fails變小。如max_fails=5 fail_timeout=10 要比 max_fails=2 fail_timeout=10可靠

      2. 為耗時長的介面單獨配置upstream和server(推薦)



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在Vue中,方法體里用this調用vue實例的數據,有時會指向window,導致調用失敗報錯。 ...
  • 運行自己的vue文件,發現F12開發者模式下有安裝vue開發者工具的提示 方案一:直接提供 安裝鏈接 方案二:手動搜索 搜索即可 安裝好後就讓它顯示 那麼如何關閉這不中看的提示信息呢? 先根據API文檔的config內容,在控制台輸入如下的信息 再看看官方文檔的提示,也就是說明我可以在代碼調節為fa ...
  • 這篇文章就是一篇實戰文章,我把自己創建項目,發佈到npm,以及遇到的問題和解決方案全都記錄了下來,如果你也想創建一個自己的js工具庫,可以根據這篇文章一步一步的嘗試一下 ...
  • 這是一篇關於居中對齊方式的總結 開篇之前,先問一下大家都知道幾種居中的實現方式? 面試時答出來兩三個就不錯了,就怕面試官還讓你繼續說。今天就來總結一下這些居中的方式 使用flex佈局設置居中。 使用flex 時也能通過給子項設置margin: auto實現居中。 使用絕對定位的方式實現水平垂直居中。 ...
  • 視頻鏈接(P1-P2): 尚矽谷Vue2.0+Vue3.0全套教程丨vuejs從入門到精通 Vue是什麼? 介紹 原生JS實現(命令式編碼) 就一個命名一個命令嚴格執行 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <m ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 1、安裝 vue-video-player npm install vue-video-player --save npm install videojs-contrib-hls --save //播放直播 //在main.js中引入 / ...
  • 前言 演算法是什麼?演算法就是數學規律.怎麼去總結和發現這個規律,就是理解演算法的過程. KMP演算法的本質是窮舉法,而並不是去創造新的匹配邏輯. 以下將搜尋的字元串稱為子串(part),以P表示.被搜尋的字元串稱為總串(total),以T表示. start代表P串在T串中開始匹配的位置,end代表P串與T ...
  • 視頻鏈接(p1~p8): golang入門到項目實戰 [2022最新Go語言教程,沒有廢話,純乾貨!] 參考鏈接: 用vscode開發go的時候,安裝go包報錯:connectex: A connection attempt failed because the connected party di ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...