我有一台 Ubuntu 服务器,需要处理大量流量和网站,偶尔 Nginx 需要很长时间才能响应(有时需要 20-30 秒,而且通常请求在此之前超时),起初我以为是因为流量激增而 Passenger 处理不好造成的,但后来我用 Puma 替换了 Passenger,并对流量进行了负载平衡,但这种情况仍然存在。
Nginx Amplify 向我发送类型nginx.upstream.response.time
过高的警报,例如 14 秒。
以下是该设置的总体概述:
- 服务器#1(偶尔响应缓慢的服务器)有 300 多个站点的 Nginx 服务器块。
- 该服务器块
proxy_pass
也位于服务器 #1 上的负载平衡器服务器块 (sites.myapp.com) - 负载均衡器将流量在服务器 #1(权重 1)和服务器 #2(权重 2)之间分配,以便两倍的流量流向服务器 #2
- 在服务器#1和#2上我都有另一个服务器块,它接收来自负载均衡器的流量,并将
proxy_pass
其传输到 Puma 用于为我的应用程序实例提供服务的 unix 套接字。
您可以在下面找到所有这些的相关配置。我不知道如何排除故障,但我想知道这些服务器块中是否有一些配置可以改进,例如关闭代理缓冲或更改代理缓冲区大小?
知道是什么原因造成的吗?如何追踪问题?因为当 Nginx 响应速度非常慢时,流量甚至不会重新路由到服务器 2。
请注意,我知道我应该将所有站点服务器块/SSL 和负载平衡器移动到单独的服务器,这样至少当服务器 1 经历缓慢响应阶段时,流量仍会传递到服务器 2,但现在我只有这两台服务器。
站点配置示例:
server {
server_name www.somesite.com;
location / {
proxy_pass https://sites.myapp.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Cookie $http_cookie;
proxy_set_header WLDOMAIN www.somesite.com;
proxy_cookie_domain .myapp.com .somesite.com;
proxy_pass_request_headers on;
rewrite ^/(.*)$ /sites/12345/$1 break;
}
}
负载均衡器简化配置:
upstream cluster {
ip_hash;
server X.X.X.X:1234 weight=1; #internal ip of server #1
server Y.Y.Y.Y:1234 weight=2; #internal ip of server #2
}
server {
server_name sites.myapp.com;
location / {
try_files $uri @app;
}
location @app {
proxy_pass http://cluster;
proxy_next_upstream error timeout invalid_header http_429 http_500 http_502 http_503 http_504;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header Host $http_host;
proxy_headers_hash_max_size 512;
proxy_headers_hash_bucket_size 128;
proxy_redirect off;
}
}
上游简化配置:
upstream puma {
server unix:///var/www/myapp/shared/sockets/puma.sock;
}
server {
listen 1234;
root /var/www/myapp/public;
location / {
try_files $uri @app;
}
location @app {
proxy_pass http://puma;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header Host $http_host;
proxy_headers_hash_max_size 512;
proxy_headers_hash_bucket_size 128;
proxy_redirect off;
}
}
请注意,当设置仅仅是各个站点的服务器块proxy_pass
将流量发往上游而不是在它们之间设置负载均衡器并且由 Passenger 而不是 Puma 提供服务的应用程序时,这个问题就已经发生了。
如果有关系的话,该应用程序是 Ruby on Rails。
答案1
因此,在 Nginx 中打开调试输出后,问题似乎出在nginx-extras
Phusion Passenger 包中的 Nchan 模块上,该模块有缺陷并且会偶尔挂起,一旦我摆脱 Passenger(用 Puma 替换)并替换nginx-extras
为,nginx
我就再也没有遇到过这个问题。