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-extrasnginx從那時起我就再沒有遇到這個問題。

相關內容