Load-Balancing

負載均衡器以靜默方式處理伺服器錯誤

  • June 17, 2021

我正在尋找一個可以靜默處理伺服器錯誤的 HTTP 負載平衡器。我想要的是對每個請求進行負載平衡,以便在最壞的情況下有一點超時。

  • 如果工作 Web 節點返回 HTTP 500 伺服器錯誤,負載均衡器將不得不重試另一個 Web 節點的請求。如果第二個節點確實返回另一個 500 錯誤,則對最後一個節點執行相同操作(我假設有 3 個節點)。如果最後一個節點返回 500 錯誤,則將其顯示給最終使用者。
  • 如果伺服器節點超時(響應時間超過 1 或 2 秒),則必須將請求路由到另一台伺服器,客戶端應在 2 秒內收到良好的響應。

您可以使用HttpProxyModule(它是非常標準的模組,通常在 nginx 內部)來實現這樣的負載均衡器。

Nginx 是輕量級的、快速的並且有很多功能(你甚至可以在其中嵌入 lua 程式碼)。

您的案例的範例配置是

upstream backend { 
server 10.0.0.1; 
server 10.0.0.2;
server 10.0.0.3;
}
server {
  listen      80;
  server_name _;

  location / {
       proxy_pass  http://backend;
       proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
       proxy_redirect off;
       proxy_buffering off;
       proxy_set_header        X-Real-IP       $remote_addr;
       proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
   }
}

秘訣是proxy_next_upstream指令,它決定在什麼情況下請求將被傳輸到下一個伺服器。可能的值為:

  • error — 在連接到伺服器、向其發送請求或讀取其響應時發生錯誤;
  • timeout — 在與伺服器連接、傳輸請求或從伺服器讀取響應期間發生超時;
  • invalid_header — 伺服器返回一個空的或不正確的答案;
  • http_500 — 伺服器返回程式碼為 500 的答案
  • http_502 — 伺服器返回程式碼為 502 的答案
  • http_503 — 伺服器返回程式碼為 503 的答案
  • http_504 — 伺服器返回程式碼為 504 的答案
  • http_404 — 伺服器返回程式碼為 404 的答案
  • off — 它禁止將請求傳輸到下一個伺服器

引用自:https://serverfault.com/questions/481454