什么是 keepalive?

什么是 keepalive?

我有以下负载平衡配置:

upstream upstream {
  ip_hash;
  keepalive 1000;
  server 10.10.10.1;
  server 10.10.10.2;
  server 10.10.10.3;
}

server {
  listen                  443;
  server_name             example.com;
  ssl_certificate         /etc/nginx/certs/cert.crt;
  ssl_certificate_key     /etc/nginx/certs/cert.key;

  ssl on;
  ssl_session_cache  builtin:1000  shared:SSL:10m;
  ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
  ssl_prefer_server_ciphers on;

  location / {
      client_max_body_size        80m;
      proxy_http_version          1.1;
      proxy_set_header Connection "";
      proxy_set_header            Host $host;
      proxy_set_header            X-Real-IP $remote_addr;
      proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header            X-Forwarded-Proto $scheme;
      proxy_read_timeout          90;
      proxy_pass                  http://upstream;
  }
}

当我的后端节点稳定时,一切都运行良好。但是,当我关闭其中一个节点(例如 10.10.10.2)时,NGINX 将继续向其发送流量,即使请求不断超时(因为服务器已关闭)。我已经尝试设置和max_fails参数fail_timeout,但行为仍然相同。

NGINX 是否能够自动检测服务器是否已关闭并且不向其发送流量?我缺少什么配置?

答案1

什么是 keepalive?

Keepalive 的理念是解决在高延迟网络上建立 TCP 连接的延迟问题。建立 TCP 连接需要三次握手,因此,当客户端和服务器之间存在可察觉的延迟时,keepalive 会通过重用现有连接来大大加快速度。

为什么人们把 nginx 放在后端前面?

Nginx 在处理数千个连接时非常高效,而许多后端却并非如此,因此,为了加快速度,人们经常将 nginx 放在他们真正的 Web 服务器前面以加快速度,以便云和用户之间的连接将被缓存以供后续重用。

upstream keepalive请注意,nginx直到 1.1.4 版本才支持,http://nginx.org/r/keepalive,因为如上所述,假设您所有主机之间(例如,nginx 和上游服务器之间)的延迟都是亚毫秒级的,那么它更有可能使用上游的更多资源而不是加快任何处理速度。

你知道它要去哪儿吗?

通过在 LAN 上使用过多的保持活动连接(每个上游服务器几百个),即使您没有遇到所描述的问题,也可能只会使速度变慢,而不是变快。

当服务或端口关闭时会发生什么?

通常情况下,当主机上某个端口不可用时,主机会立即返回TCP 重置数据包,称为RST,它会立即告诉客户端(例如 nginx)发生了什么,让其迅速采取适当的措施。(除 之外的数据包RST也可以用于达到相同的效果,例如,当到主机的路由不可用时。)

如果我们停止后端的服务,nginx 会正确处理。只有停止整个虚拟机时才会重现此问题。– Ramiro Berrelleza 10 月 27 日 22:48

您的上述评论可能表明,正是由于缺乏及时的连接拒绝数据包,nginx 才会感到困惑 — 您的设置似乎只是丢弃了 nginx 发送的数据包。而且,如果没有任何对请求的响应,那么人们怎么可能知道您的后端服务是否不可用,而不是仅仅表现出企业级行为?

我们应该做什么?

  • 首先,正如前面提到的,即使您没有遇到所描述的问题,使用upstream keepaliveLAN 上的功能也只会使速度变慢,尤其是在数量如此之多的情况下。

  • 否则,你可能需要配置你的设置(防火墙、路由器、虚拟化环境等),以便为不可用的主机返回适当的数据包,这肯定会使 nginx 按预期工作,因为你已经自己测试过当TCP 恢复数据包实际上是由主机返回的。

  • 另一个选择是调整 nginx 内的各种超时,以解决上游消失得无影无踪的可能性,并弥补网络无法生成适当控制数据包的情况。

    这可能包括connect(2)超时,用于建立新的 TCP 连接,通过http://nginx.org/r/proxy_connect_timeout在毫秒范围内(例如,如果你的所有服务器都在本地网络上,并且你没有运行具有企业级多秒延迟的企业级软件),以及正在进行的超时read(2)send(2)操作,通过http://nginx.org/r/proxy_read_timeouthttp://nginx.org/r/proxy_send_timeout,这取决于后端应用程序响应请求的速度。您可能还想增加上下文中指令fail_timeout的参数,如下所示serverupstreamhttp://nginx.org/en/docs/http/ngx_http_upstream_module.html#server

答案2

尝试设置keepalive 16并再次测试。对于您的情况来说,每个工作者 1k 个缓存连接可能太多了。

相关内容