nginx作为反向代理服务器,后端RS有多台服务器,上层通过一定机制保证容错和负载均衡。
nginx的重试机制就是容错的一种
官方链接:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_next_upstream
语法:
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;
Context: http, server, location
指定应将请求传递到下一个服务器的情况:
error # 与服务器建立连接,向其传递请求或读取响应头时发生错误;
timeout # 在与服务器建立连接,向其传递请求或读取响应头时发生超时;
invalid_header # 服务器返回空的或无效的响应;
http_500 # 服务器返回代码为500的响应;
http_502 # 服务器返回代码为502的响应;
http_503 # 服务器返回代码为503的响应;
http_504 # 服务器返回代码504的响应;
http_403 # 服务器返回代码为403的响应;
http_404 # 服务器返回代码为404的响应;
http_429 # 服务器返回代码为429的响应(1.11.13);
non_idempotent # 通常,请求与 非幂等 方法(POST,LOCK,PATCH)不传递到请求是否已被发送到上游服务器(1.9.13)的下一个服务器; 启用此选项显式允许重试此类请求;
off # 禁用将请求传递给下一个服务器。
下面还有一个参数影响重试次数,0表示不限制:
Syntax: proxy_next_upstream_tries number;
Default: proxy_next_upstream_tries 0;
Context: http, server, location
举例如下:
upstream app-proxy {
server 192.168.5.100:8080;
server 192.168.5.101:8080;
check interval=2000 rise=1 fall=3 timeout=3000 type=http;
check_keepalive_requests 1;
check_http_send “GET /status/status.html HTTP/1.1\r\nConnection: close\r\nHost: localhost\r\n\r\n”;
check_http_expect_alive http_2xx http_3xx;
}
location / {
proxy_pass http://app-proxy;
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
proxy_next_upstream_tries 3;
proxy_connect_timeout 60s;
proxy_read_timeout 60s;
proxy_send_timeout 60s;
proxy_pass_request_headers on;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
set $domain default;
}