我们的设置如下:
客户端 -> AWS ELB(tcp 负载平衡)-> NGINX(ssl 终止)-> 应用程序服务器。
我们希望从容地将应用服务器从负载均衡器中移除。为此,我们进行了健康检查,当节点即将关闭时,会以 503 响应,同时允许任何待处理的请求完成。
但是,由于 nginx 配置为使用 keep-alive,即使节点已脱离负载均衡器,已经建立连接的客户端仍可能继续发送新的请求。
在应用程序服务器的所有响应中设置Connection: close
标头没有帮助,因为 nginx(根据 RFC,这是正确的)不会将其传递给客户端。
除了完全禁用保持活动功能之外,还有其他方法吗?
答案1
我们通过更新 nginx 配置来解决这个问题,以禁用 keep-alive(通过将 keepalive_requests 和 keepalive_timeout 都设置为 0),然后在应用程序关闭过程的一部分重新加载 nginx。
只需重新加载配置就足够了,因为 nginx 在重新加载时会启动一个新的工作进程,并且只保留旧的工作进程,直到它们完成正在进行的请求。