Nginx upstream用起来很方便,根据配置转发请求如:
upstream your-server {
server 10.65.11.***:9090 weight=1 max_fails=3 fail_timeout=10s;
server 10.65.11.***:9090 weight=1 max_fails=3 fail_timeout=10s;
server 10.65.11.***:9090 weight=1 max_fails=3 fail_timeout=10s;
server 10.65.11.***:9090 weight=1 max_fails=3 fail_timeout=10s;
keepalive 2000;
}
通过配置上游服务器的max_fails 和fail_timeout,来指定每个上游服务器,当fail_timeout时间内失败了max_fails次请求,则认为该上游服务器不可用/不存活,然后会摘掉该上游服务器,fail_timeout时间后会再次将该服务器加入到存活上游服务器列表进行重试.
在nginx的配置文件中,proxy_next_upstream项定义了什么情况下进行重试,官网文档中给出的说明如下:
1
.Syntax: proxy_next_upstream error | timeout | invalid_header
| http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ...;
2
.Default: proxy_next_upstream error timeout;
3
.Context: http, server, location
默认情况下,当请求服务器发生错误或超时时,会尝试到下一台服务器。
proxy_connect_timeout time:与后端/上游服务器建立连接的超时时间,默认为60s
proxy_read_timeout time:设置从后端/上游服务器读取响应的超时时间,默认为60s,此超时时间指的是两次成功读操作间隔时间,而不是读取整个响应体的超时时间,如果在此超时时间内上游服务器没有发送任何响应,则Nginx关闭此连接。
proxy_send_timeout time:设置往后端/上游服务器发送请求的超时时间,默认为60s,此超时时间指的是两次成功写操作间隔时间,而不是发送 整个请求的超时时间,如果在此超时时间内上游服务器没有接收任何响应,则Nginx关闭此连接。
考虑一个场景:
proxiy_read_timeout设置5s,当请求转发到服务器A,若处理时间超过5S(比如大文件上传),此时被nginx认定失败,转发请求到服务器B,这样A、B服务器将会重复处理数据。
总结:根据不同的业务场景考虑设置不同的超时时间