NGINX不断向上游发送请求

我有以下的负载平衡configuration:

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; } } 

虽然我的后端节点是稳定的,一切正常。 但是,当我closures其中一个节点(例如10.10.10.2)时,即使请求保持超时(因为服务器closures),NGINX也会继续向它发送stream量。 我已经尝试设置max_failsfail_timeout参数,但行为仍然是相同的。

NGINX能够自动检测服务器是否closures,而不是在那里发送stream量? 我错过了什么configuration?

什么是Keepalive?

Keepalive背后的想法是解决在高延迟networking上build立TCP连接的延迟。 build立一个TCP连接需要3次握手,所以当客户端和服务器之间存在可感知的延迟时,keepalive会通过重用现有的连接大大加快速度。

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

Nginx在处理数以千计的连接时效率非常高,而许多后端不会加快速度,所以人们常常把nginx放在真正的Web服务器前面,以加速云端和用户之间的连接cachingKeepalive以供后续重用。

请注意,根据http://nginx.org/r/keepalive,nginx甚至不支持upstream keepalive直到1.1.4,因为按照上面的说法,更有可能使用更多的上游资源来加速处理,只要你在你所有的主机之间(例如nginx和上游服务器之间)有亚毫秒的延迟。

你看到它在哪里?

通过在局域网上使用过多的keepalive连接,每个上游服务器只需要几百个keepalive连接,即使您没有遇到如您所描述的问题,您也可能只会使速度变慢,速度不会变快。

服务/端口closures时会发生什么?

通常情况下,当一个给定的端口在主机上不可用时,主机会立即返回一个TCP重置数据包,即RST ,它立即告诉客户端(例如nginx)什么情况,让它立即采取适当的行动。 ( RST以外的分组也可以用于相同的效果,例如,当到达主机的路由不可用时)。

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

你的上面的评论可能表明,这是缺乏及时的连接被拒绝的数据包,肯定混淆了nginx – 看来你的设置可能只是丢弃nginx发送的数据包。 如果没有对这些请求作出任何回应,那么人们怎么能够知道你的后端服务是否不可用,而不是简单地展示企业级的行为呢?

应该怎么做?

尝试设置keepalive 16并再次testing。 每个工作人员1kcaching的连接可能对您的情况太多了。