Nginx upstream 失效转移机制研究

本文深入研究了Nginx的upstream故障转移机制,通过多个案例分析了GET和POST请求在不同场景下的行为。在服务器宕机或超时时,Nginx会进行请求转发,对于GET请求,会尝试其他服务器,而POST请求为避免重复提交,仅在超时后返回错误。总结指出,Nginx的失效转移策略考虑了请求类型和幂等性,确保了服务的稳定性。
摘要由CSDN通过智能技术生成

Nginx upstream 失效转移机制研究

结论

经过多次模拟线上的环境测试,Nginx 负载均衡技术默认情况下已经对于 connect refused(状态码表现为 502)和 time out(状态码表现为 504)做了失效转移,使用的是 upstream 模块的 proxy_next_upstream 指令(这个选项默认是启动的)来实现。

对于 http GET 请求,当这个请求转发到上游服务器发生断路,或者读取响应超时则会将同样的请求转发到其他上游服务器来处理,如果所有服务器都超时或者断路,则会返回 502 或者 504 错误。

对于http POST 请求,当这个请求转发到上游服务器发生断路,则会将请求转发到其他上游服务器来处理,但是如果这个请求发生了读取超时,则不会做失效转移,会返回 504 错误,Nginx 之所以这么做应该是为了防止同一个请求发送两次,比如涉及到银行的充值等操作就会发生很严重的 bug。以下是模拟线上的场景测试得出的结论:

  1. 上游服务器有两台,一台处于 down 状态,另一台处于正常服务状态,那么来自客户端的 GETPOST 请求都会通过 Nginx 的失效转移机制路由到正常状态的机器,返回 200 状态码,并不会返回给客户端 502 错误;
  2. 上游服务器有两台,两台都 down 了,那么会不管是 GET 还是 POST 请求都会直接返回给客户端 502 错误;
  3. 上游服务器有两台,一台机器的 http GETPOST 接口都正常 return,另一台相同的接口死循环,模拟超时。
    这种情况下如果客户端的请求路由到了正常机器,那么直接返回 200
    如果请求路由到了死循环的接口,并且是 GET 请求,那么会等待 Nginx 设置的超时时间过后,然后将请求转发到另一台机器的正常接口。
    如果请求路由到了死循环的接口,并且是 POST 请求,那么等待 nginx 设置的超时时间过后直接返回 504,没有进行失效转移,防止请求的重复发送;
  4. 上游服务器有两台,两台机器的 http GETPOST 接口都死循环,模拟超时,那么对于 GET 请求会进行请求转发到另一台尝试,对于 POST 请求直接返回 504,不会进行进一步尝试;

论证环境及工具

  • 一台前端 Nginx 服务器;
  • 两台上游服务器;
  • Nginx 配置:
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值