Eu tenho um servidor Ubuntu que lida com muito tráfego e muitos sites, ocasionalmente o Nginx demora muito para responder (20-30 segundos algumas vezes, e geralmente a solicitação expira antes disso), inicialmente pensei que era porque de picos de tráfego em combinação com o Passenger não lidando bem com isso, mas desde então substituí o Passenger pelo Puma e a carga equilibrou o tráfego e isso ainda está acontecendo.
O Nginx Amplify me envia alertas do tipo nginx.upstream.response.time
muito alto, como 14 segundos, por exemplo.
Aqui está uma visão geral da configuração:
- o servidor nº 1 (aquele com resposta lenta ocasional) possui blocos de servidor Nginx para mais de 300 sites.
- o servidor bloqueia
proxy_pass
para um bloco de servidor do balanceador de carga (sites.myapp.com) também no servidor nº 1 - o balanceador de carga divide o tráfego entre este servidor nº 1 (peso 1) e o servidor nº 2 (peso 2) para que o dobro da quantidade de tráfego vá para o servidor nº 2
- nos servidores 1 e 2, tenho outro bloco de servidor que recebe o tráfego do balanceador de carga e
proxy_pass
para um soquete unix usado pelo Puma para servir uma instância do meu aplicativo.
Você pode encontrar as configurações relevantes para tudo isso abaixo. Não sei como solucionar isso, mas estou me perguntando se talvez haja algumas configurações nesses blocos de servidor que possam ser melhoradas, como, por exemplo, desativar o buffer de proxy ou alterar os tamanhos do buffer de proxy.
Alguma ideia do que poderia estar causando isso e como rastrear o problema? Porque quando o Nginx fica muito lento para responder, o tráfego nem mesmo é redirecionado para o servidor 2.
Observe que eu sei que devo mover todos os blocos/SSLs do servidor de sites e o balanceador de carga para um servidor separado, para que pelo menos quando o servidor 1 estiver passando por essa fase de resposta lenta, o tráfego ainda seja repassado para o servidor 2, mas agora tudo que tenho são esses dois servidores.
Exemplo de configuração do site:
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;
}
}
Configuração simplificada do balanceador de carga:
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;
}
}
Configuração simplificada upstream:
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;
}
}
Observe que esse problema já estava acontecendo quando a configuração era apenas o servidor de vários sites bloqueando proxy_pass
o tráfego para um upstream em vez de ter o balanceador de carga entre eles e o aplicativo sendo servido pelo Passenger em vez do Puma.
Caso seja importante, o aplicativo é Ruby on Rails.
Responder1
Então, depois de ativar a saída de depuração no Nginx, parece que o problema estava com o módulo Nchan no nginx-extras
pacote do Phusion Passenger, aquele está com bugs e travava de vez em quando, assim que me livrei do Passenger (substituído por Puma) e substituído nginx-extras
por nginx
não tive esse problema desde então.