nginx反向代理对后端某个节点优雅下线的问题

上次雪球的SRE同学过来交流的时候,一同聊到过关于后端节点优雅下线的一种情况:nginx将请求给了一个后端节点,这个请求在后端耗时较长,在请求还没处理完的时候后端恰好要做发布,发布时先将该节点对nginx的健康检测标记为不可用,这样nginx就将该节点从后端集群里摘掉了,若在这之后这个请求才处理完毕,是否还会正常的经过nginx返回给客户端,还是当nginx通过健康检测发现该后端节点已经不可用时,其建立的连接也已经不可用了呢?

当时问他们说也不太确定,后来忙忘了去验证一下,今晚写个小程序在tomcat端sleep 20秒才返回,然后通过nginx配置健康检测为1秒X2,测试结果表明,即使nginx发现后端节点已经不可用,只要该请求连接还保持,并不会被nginx端主动中止,20秒之后客户端仍会得到处理结果。

这样对于用nginx做负载,在后端发布时,对健康检测标记不可用之后只要再留出一定的时间让之前的请求都已响应完毕即可。

nginx反向代理对后端某个节点优雅下线的问题》上有2条评论

  1. hongjiang 文章作者

    更严格一些,应该检测到backend节点的网络连接都已释放(等待那些EST, TIME_WAIT等连接都结束掉)。

    回复
  2. hongjiang 文章作者

    我现在记不清楚当时反向代理使用的是tengine还是原生的nginx,但后端健康监测模块是tengine提供的。

    回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注