本文主要是介绍Nginx: 负载均衡场景下上游服务器异常时的容错机制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
容错机制
- 当负载均衡网络上的应用程序服务器,由于内部的某一些原因或者是网络原因导致的
- 请求迟迟没有处理完,那这个时候我们是否可以做一些容错措施
- 比如说可以将这个失败的请求继续由Nginx转发给另外一台服务器
- 如果说有了这样一些容错机制的话,也是大大提高了我们整个系统的一个健壮性
- 在反向代理场景中也有一些指令,用来定义这样一些功能的
1 )proxy_next_upstream 指令
-
语法:
proxy_next_upstream error| timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | noidempotent | off
-
默认值: proxy_next_upstream error timeout;
-
上下文:http、server、location
-
可选值如下
可选参数 含义 error 向上游服务器传输请求或读取响应头发生错误 timeout 向上游服务器传输请求或读取响应头发生超时 invalid header 上游服务器返回无效的响应 http_500 HTTP响应状态码为500时 http_502 HTTP响应状态码为502时 http_503 HTTP响应状态码为503时 http_504 HTTP响应状态码为504时 http_403 HTTP响应状态码为403时 http_404 HTTP响应状态码为404时 http_429 HTTP响应状态码为429时 non_idempotent 非幂等请求失败时是否需要转发下一台上游服务器 off 禁用请求失败转发功能,上游返回啥,nginx 返回啥给客户端 -
所谓幂等的请求, 是指这个请求发出去之后,无论请求多少次,得到的结果通常是一致的
-
非幂等与之相反,请求发出去后,可能在服务器上每次都会引起不同的结果
-
Post请求,它就是一个非幂等的 http 请求方法,因为可能会在后端服务器上创建一些资源
-
非幂等请求,可能对服务器造成不可预见的一些错误,在某些场景下是很危险的
- 比如说,一个支付性的网站,充值,支付的动作
- 可能由于内部一些原因没有及时将响应返回给Nginx
- Nginx 在一定的时间内,他会将这个请求再次转发给下一台应用服务器
- 这个时候,又执行了一次充值动作,从而造成了这种重复充值
- 所以说,在某些场景下,proxy_next_upstream 功能是比较危险的
- 可能会造成一些意想不到的后果,所以这个 non_idempotent
- 就是用来决定是不是需要开启针对这些非幂等的HTTP请求方法是否转发
-
关于上面的off
- 默认情况下一台服务器挂掉,nginx不会再给它转发
- 如果设置了 off, 则可能会出现访问不通 502 的问题
2 )proxy_next_upstream_timeout 指令
- 某一应用程序服务器未响应的超时时间
- 语法: proxy_next_upstream_timeout times;
- 默认值:proxy_next_upstream_timeout 0;
- 0 表示可以无限制的等待
- 上下文:http、server、location
- 这种,如果有三台都不行,都每个重试一遍肯定是问题,看下面指令
3 )proxy_next_upstream_tries 指令
- 某一应用程序服务器未响应尝试转发几次
- 语法: proxy_next_upstream_tries number;
- 默认值:proxy_next_upstream_tries 0;
- 0 不限制转发几次
- 上下文:http、server、location
4 )proxy_intercept_errors 指令
- 上游返回响应码大于300时,是直接将上游响应返回客户端还是按照 error_page 处理
- 这个不同于错误之后将请求分发给其他应用服务了
- 语法:proxy_intercept_errors on | off ;
- 默认值:proxy_intercept_errors on;
- 上下文:http、server、location
5 )配置测试
5.1 上游应用服务器 (使用Nginx模拟)
server {listen 4040;location / {return 200 'Return Result For Server 4040\n';}
}server {listen 4050;location / {return 503 'Return Result For Server 4050\n';}
}
5.2 Nginx 代理服务器
upstream test_tolerant_server {server 192.168.184.20:4040;server 192.168.184.20:4050;
}server {listen 80;root /opt/nginx/html;location /503.html {}location /test/ {proxy_pass http://test_tolerant_server;# proxy_next_upstream http_503;error_page 503 /503.html;proxy_intercept_errors on;# proxy_read_timeout 5;}
}
- $
touch /opt/nginx/html/503.html
test 503 page
- 基于以上可自行设置,测试,不再赘述
这篇关于Nginx: 负载均衡场景下上游服务器异常时的容错机制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!