nginx - 负载均衡器 - 上游节点离线/关闭时会出现相当大的滞后

nginx - 负载均衡器 - 上游节点离线/关闭时会出现相当大的滞后

运行 nginx1.0.15CentOS 6.5。我有三个上游服务器,一切运行正常,但是当我模拟中断并关闭其中一个上游服务器时,我注意到响应时间明显滞后(额外 5-7 秒)。当我将停机的服务器重新上线时,滞后现象消失。此外,我注意到另一件奇怪的事情是,如果我只是停止模拟中断服务器上的 httpd 服务,响应时间就会正常,只有服务器完全停机时才会出现滞后现象。

这是我的配置:

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

我已经尝试过类似帖子中的建议。显然我的 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 美元的合同。我确实找到了这个回购它提供了功能。想知道是否有人用过它?稳定吗?性能好吗?

最糟糕的情况是,我只能硬着头皮每月多花 20 美元购买 Linode“节点平衡器”,我确信它是基于 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

答案1

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

大多数负载平衡器都具有轮询机制和/或心跳,用于预先检查停机服务器。您可能需要研究这些选项。对 Web 服务器的轮询通常不会每分钟运行一次或两次以上,但对服务器停机情况的心跳检查可能每秒一次左右。

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

编辑:也许是这样的? http://www.howtoforge.com/setting-up-a-high-availability-load-balancer-with-haproxy-heartbeat-on-debian-lenny。对于小型安装,无需单独的服务器,只需将其放在 Web 服务器框上即可。这提供了负载平衡,但没有缓存。还有 HA 解决方案,可根据心跳控制 squid 或 varnish。

答案2

您可以尝试以下方法

  1. 从官方仓库更新到最新版本的 nginxhttp://nginx.org/en/linux_packages.html#stable
  2. 尝试减少 proxy_connect_timeout 设置,将其设置为非常低的设置,以进行测试,比如 1 秒。http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_connect_timeout

答案3

过去几周,我一直在与 NGINX 售前工程团队合作,试图在购买支持合同之前解决这个问题。经过大量的调整和协作,我们唯一能推断出当单个节点完全关闭时延迟增加的原因是,有问题的服务器都在运行更老的 Apache 2.2。

NGINX 工程师无法使用 Apache 2.4.x 重现此问题,因此如果其他人遇到相同情况,我建议采用此方法修复。但是,对于我们的项目,我正在努力完全放弃 Apache,并使用 php-fpm 实现 NGINX。

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

相关内容