나는 많은 트래픽과 많은 사이트를 처리하는 Ubuntu 서버를 가지고 있습니다. 때때로 Nginx가 응답하는 데 매우 오랜 시간이 걸립니다(때때로 20-30초, 일반적으로 그 전에 요청 시간이 초과됨). Passenger와 결합하여 트래픽 급증이 잘 처리되지 않았지만 이후 Passenger를 Puma로 교체하고 트래픽 부하를 분산시켰는데 여전히 발생합니다.
nginx.upstream.response.time
Nginx Amplify는 예를 들어 14초와 같이 너무 높은 유형의 경고를 보냅니다 .
설정에 대한 일반적인 개요는 다음과 같습니다.
- 서버 #1(가끔 느린 응답을 보이는 서버)에는 300개 이상의 사이트에 대한 Nginx 서버 블록이 있습니다.
- 서버는
proxy_pass
서버 #1에서도 로드 밸런서 서버 블록(sites.myapp.com)으로 차단됩니다. - 로드 밸런서는 이 서버 #1(가중치 1)과 서버 #2(가중치 2) 간에 트래픽을 분할하여 두 배의 트래픽 양이 서버 #2로 이동하도록 합니다.
- 서버 #1과 #2 모두에 로드 밸런서로부터 트래픽을 수신하고
proxy_pass
Puma가 내 앱의 인스턴스를 제공하는 데 사용하는 Unix 소켓으로 트래픽을 수신하는 또 다른 서버 블록이 있습니다.
아래에서 모든 관련 구성을 찾을 수 있습니다. 이 문제를 해결하는 방법을 모르지만 해당 서버 블록에 프록시 버퍼링을 끄거나 프록시 버퍼 크기를 변경하는 등 개선할 수 있는 일부 구성이 있는지 궁금합니다.
이 문제의 원인과 문제를 추적하는 방법을 아시나요? Nginx의 응답 속도가 매우 느려지면 트래픽이 서버 2로 다시 라우팅되지도 않기 때문입니다.
적어도 서버 1이 느린 응답 단계를 거칠 때 트래픽이 여전히 서버 2로 전달되도록 하려면 모든 사이트 서버 블록/SSL 및 로드 밸런서를 별도의 서버로 이동해야 한다는 것을 알고 있습니다. 내가 가진 건 이 두 서버뿐이에요.
사이트 구성 예시:
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
이 문제는 다양한 사이트 서버가 Puma 대신 Passenger가 제공하는 앱과 로드 밸런서를 사이에 두는 대신 업스트림으로의 트래픽을 차단하는 설정일 때 이미 발생하고 있었습니다 .
중요한 경우 앱은 Ruby on Rails입니다.
답변1
따라서 Nginx에서 디버그 출력을 켠 후 Phusion Passenger 패키지의 Nchan 모듈에 문제가 있는 것 같습니다 . 그 중 하나는 버그가 있어서 Passenger(Puma로 교체)를 제거하고 다음 으로 nginx-extras
교체하면 가끔씩 중단되는 것 같습니다. 그 이후로는 그런 문제가 없었어요.nginx-extras
nginx