nginx – 负载平衡器 – 上游节点离线/closures时相当大的滞后

CentOS 6.5上运行nginx 1.0.15 。 我有三个上游服务器,一切正常,但是当我模拟一个中断,并采取上游服务器之一,我注意到相当滞后的响应时间(额外的5-7秒)。 第二个我把服务器重新联机,延迟消失。 另外,我注意到另一个奇怪的事情,如果我简单地停止模拟中断服务器上的httpd服务,响应时间是正常的,只有服务器完全closures才会发生滞后。

这是我的conf:

upstream prod_example_com { server app-a-1:51000; server app-a-2:51000; server app-a-3:51000; } server { # link: http://wiki.nginx.org/MailCoreModule#server_name server_name example.com www.example.com *.example.com; #----- # Upstream logic #----- set $upstream_type prod_example_com; #----- include include.d/common.conf; # Configure logging access_log /var/log/nginx/example/access/access.log access; error_log /var/log/nginx/example/error.log error; location / { # link: http://wiki.nginx.org/HttpProxyModule#proxy_pass proxy_pass http://$upstream_type$request_uri; # link: http://wiki.nginx.org/HttpProxyModule#proxy_set_header proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ { # link: http://wiki.nginx.org/HttpProxyModule#proxy_pass proxy_pass http://$upstream_type$request_uri; # link: http://wiki.nginx.org/HttpProxyModule#proxy_set_header 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_hide_header expires; proxy_hide_header Cache-Control # Even tho this reads like the older syntax, it is handled internally by nginx to set max age to now + 1 year expires max; # Allow intermediary caches the ability to cache the asset add_header Cache-Control "public"; } } 

我曾尝试类似这样的职位上的build议。 显然,我的nginx版本太旧了,无法支持nginx 文档中列出的health_checks。 我也尝试在app-a-3上游定义中显式设置max_fails=2fail_timeout=120 ,但是如果app-a-3是每个请求,这些都不会避免额外的5-7秒延迟离线。

– 更新 –

根据请求,这是app-a-3完全closures时的单个请求的输出 。 我能看到的唯一不寻常的事情就是最初事件和后续事件之间的3秒延迟。

– 更新#2 –

看起来像几年前Nginx决定创buildNginx Plus,它增加了主动的健康检查,但每年支持合同。 根据我读过的一些文章,Nginx已经厌倦了让公司成千上万,并没有得到任何回报。

正如在评论中提到的那样,我们正在引导,并没有$ $ $ 1,350的合约。 我确实find了这个提供function的回购 。 想知道是否有人有任何经验呢? 稳定? 高性能?

最糟糕的情况下,我只需要点点滴滴,为Linode“节点平衡器”支付额外的20美元/月的费用,我非常确定它是基于Nginx Plus。 唯一的问题是除了一些通用选项之外,没有其他configuration的控制,所以没有办法通过一个平衡器来支持多个虚拟主机文件,并且所有的节点都必须在同一个数据中心。

– 更新#3 –

这是一些围攻结果 。 看起来第二个节点configuration错误,因为它只能处理大约75%的第一个和第三个节点正在处理的请求。 另外我觉得奇怪的是,当我把第二个节点脱机时,性能跟我把第三个(性能更好的)节点脱机一样糟糕。 逻辑将决定,如果我删除了弱链接(第二个节点),我会得到更好的性能,因为剩下的两个节点单独执行比弱链接好。

简而言之:

 node 1, 2, 3 + my nginx = 2037 requests node 1, 2 + my nginx = 733 requests node 1, 3 + my nginx = 639 requests (huh? these two perform better individually so together should be somewhere around ~1500 requests, based on 2000 requests when all nodes are up) node 1, 3 + Linode Load Balancer = 790 requests node 1, 2, 3 + Linode Load Balancer = 1,988 requests 

如果nginx发送一个请求到一个带有functionIP栈的服务器上的一个封闭的端口,它会立即得到否定的确认。 如果没有服务器可以响应(或者如果您将传入的数据包放在防火墙中),则必须等待连接超时。

大多数负载均衡器具有轮询机制和/或心跳,以抢先检查停机服务器。 你可能想看看这些选项。 轮询通常不是每分钟运行一次或两次以上,而是每隔一秒左右进行一次服务器停机的心跳检查。

Nginx并不是最先进的负载均衡器。 如果你遇到这样的问题,你可能想看看其他的select。

编辑:这样的事情可能? http://www.howtoforge.com/setting-up-a-high-availability-load-balancer-with-haproxy-heartbeat-on-debian-lenny 。 对于一个小巧的安装,不需要单独的服务器,只要把它放在networking服务器上。 这可以实现负载平衡,但不能caching。 还有HA解决scheme可以控制鱿鱼或清漆响应心跳。

几件事你可以尝试

  1. 从官方回购http://nginx.org/en/linux_packages.html#stable更新到最新版本的nginx
  2. 尝试减lessproxy_connect_timeout设置将其设置为非常低的testing,说1秒。 http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_connect_timeout

在过去的几个星期里,我一直在与NGINX售前工程团队合作,试图在购买支持合同之前解决这个问题。 经过大量的修补和协作之后,我们可以推断,单个节点完全黑暗时增加的滞后的唯一结论就是所讨论的服务器都运行了更老的Apache 2.2。

NGINX的工程师不能使用Apache 2.4.x来重新创build这个问题,所以如果有其他人遇到相同的情况,那就是我的build议。 但是,对于我们的项目,我正在从Apache完全转移,并用php-fpm实现NGINX。

最后,我们的环境将使用NGINX +(需要支持合同)作为负载平衡器,因为它能够对上游节点发出健康检查,并通过循环向运行NGINX(FOSS)的上游节点发出请求。