Nginx 上游响应时间有时非常慢

Nginx 上游响应时间有时非常慢

我有一台 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-extrasPhusion Passenger 包中的 Nchan 模块上,该模块有缺陷并且会偶尔挂起,一旦我摆脱 Passenger(用 Puma 替换)并替换nginx-extras为,nginx我就再也没有遇到过这个问题。

相关内容