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