nginx - 负载均衡器 - 上游节点离线/关闭时相当大的延迟

Mik*_*ell 7 nginx centos load-balancing

CentOS 6.5上运行 nginx 1.0.15。我有三台上游服务器并且一切正常,但是当我模拟中断并关闭其中一台上游服务器时,我注意到响应时间有相当大的延迟(额外的 5-7 秒)。当我将宕机的服务器重新联机时,延迟就消失了。另外,我注意到的另一个奇怪的事情是,如果我只是在模拟中断服务器上停止 httpd 服务,响应时间是正常的,只有在服务器完全关闭时才会出现延迟。

这是我的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";
    }
}
Run Code Online (Sandbox Code Playgroud)

我试图像类似职位的建议。显然,我的 nginx 版本太旧,无法支持 nginx文档中概述的 health_checks 。我还尝试在上游定义上显式设置max_fails=2和,但是如果离线,这些似乎都不能避免每个请求额外的 5-7 秒延迟。fail_timeout=120app-a-3app-a-3

- 更新 -

每个请求,这是完全关闭时单个请求的输出app-a-3。我唯一能看到的与众不同的是初始事件和后续事件之间的 3 秒延迟。

-- 更新 #2 --

看起来像几年前 Nginx 决定创建 Nginx Plus,它增加了主动健康检查,但要签订年度支持合同。根据我读过的一些文章,Nginx 厌倦了让公司赚到数百万,却一无所获。

正如评论中提到的,我们正在自举,没有足够的资金来投出 1,350 美元的合约。我确实找到了这个提供功能的repo。想知道是否有人有这方面的经验?稳定的?性能?

最坏的情况我只需要咬紧牙关,每月为 Linode“节点平衡器”支付额外的 20 美元,我很确定它是基于 Nginx Plus 的。唯一的问题是除了一些通用选项之外无法控制配置,因此无法通过一个平衡器支持多个 vhost 文件,并且所有节点都必须位于同一个数据中心。

-- 更新 #3 --

以下是一些围攻结果。第二个节点似乎配置错​​误,因为它只能处理第一个和第三个节点正在处理的大约 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
Run Code Online (Sandbox Code Playgroud)

mc0*_*c0e 5

如果 nginx 向具有功能性 IP 堆栈的服务器上的关闭端口发送请求,它将立即得到否定确认。如果那里没有服务器响应(或者如果您将传入的数据包丢弃在防火墙处),那么您将不得不等待连接超时。

大多数负载平衡器具有轮询机制和/或心跳,用于抢先检查停机服务器。您可能想查看这些选项。轮询通常不会在一分钟内针对 Web 服务器运行超过一次或两次,但服务器停机情况的心跳检查可能每隔一秒左右。

Nginx 不是最复杂的负载均衡器。如果您遇到此类问题,您可能需要查看其他选项。

编辑:可能是这样的吗? http://www.howtoforge.com/setting-up-a-high-availability-load-balancer-with-haproxy-heartbeat-on-debian-lenny。对于小型安装,不需要单独的服务器,只需将其放在 Web 服务器盒上即可。这提供了负载平衡,而不是缓存。还有一些 HA 解决方案可以根据心跳控制鱿鱼或清漆。