运行 nginx1.0.15在CentOS 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=120
app-a-3
app-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
您可以尝试以下方法
- 从官方仓库更新到最新版本的 nginxhttp://nginx.org/en/linux_packages.html#stable
- 尝试减少 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)的上游节点发出请求。