0%

[Nginx] Nginx proxy 處理特定 HTTP 錯誤

前言

使用 Nginx 當作 proxy 時,可以設定 Nginx 作為 failover 機制,但是 Nginx 判斷 node 失敗預設是以 connection refuse 和 timeout 為主,而不是以 HTTP 錯誤狀態來做判斷,因為 HTTP 只要可以回傳狀態,代表該 node 可以正常連接,因此 Nginx 會判斷該 node 是正常的。如果想要針對特定的 HTTP 錯誤來做處理,可以使用 proxy_next_upstream 參數來設定。

設定

proxy_next_upstream

Syntax: proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | non_idempotent | off ...;
Default: proxy_next_upstream error timeout;

設定範例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
upstream api {
server server1.com:8000 fail_timeout=60s max_fails=1;
server server2.com:8080 backup;
keepalive 256;
}

server {
listen 6000;
server_name localhost;

location / {
proxy_pass http://api;
proxy_http_version 1.1;
proxy_connect_timeout 15s;
proxy_read_timeout 15s;
proxy_next_upstream error timeout http_500 http_502 http_503 http_504 non_idempotent;

proxy_set_header Connection "";
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

主要處理 connection refuse, timeout, 500, 502, 503 和 504 的錯誤,而加上 non_idempotent 則是因為 Nginx 預設是不會重試 non-idempotent method (POST, LOCK, PATCH), 如果要重試就需要加上此設定。

最後重新啟動 Nginx 就可以囉!

參考資料