Nginx 업스트림 응답 시간이 때때로 매우 느림

Nginx 업스트림 응답 시간이 때때로 매우 느림

나는 많은 트래픽과 많은 사이트를 처리하는 Ubuntu 서버를 가지고 있습니다. 때때로 Nginx가 응답하는 데 매우 오랜 시간이 걸립니다(때때로 20-30초, 일반적으로 그 전에 요청 시간이 초과됨). Passenger와 결합하여 트래픽 급증이 잘 처리되지 않았지만 이후 Passenger를 Puma로 교체하고 트래픽 부하를 분산시켰는데 여전히 발생합니다.

nginx.upstream.response.timeNginx Amplify는 예를 들어 14초와 같이 너무 높은 유형의 경고를 보냅니다 .

설정에 대한 일반적인 개요는 다음과 같습니다.

  • 서버 #1(가끔 느린 응답을 보이는 서버)에는 300개 이상의 사이트에 대한 Nginx 서버 블록이 있습니다.
  • 서버는 proxy_pass서버 #1에서도 로드 밸런서 서버 블록(sites.myapp.com)으로 차단됩니다.
  • 로드 밸런서는 이 서버 #1(가중치 1)과 서버 #2(가중치 2) 간에 트래픽을 분할하여 두 배의 트래픽 양이 서버 #2로 이동하도록 합니다.
  • 서버 #1과 #2 모두에 로드 밸런서로부터 트래픽을 수신하고 proxy_passPuma가 내 앱의 인스턴스를 제공하는 데 사용하는 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-extrasnginx

관련 정보