proxy reverso nginx retarda meu throughput pela metade

5

Atualmente, estou usando o nginx para voltar ao gunicorn com 8 trabalhadores. Estou usando uma instância extra grande da Amazon com 4 núcleos virtuais. Quando me conecto diretamente com o gunicorn, recebo cerca de 10 mil requisições / segundo. Quando eu sirvo um arquivo estático do nginx recebo cerca de 25 pedidos / seg.

Mas quando coloco o gunicorn atrás do nginx no mesmo servidor físico, recebo cerca de 5 mil requisições / segundo. Eu entendo que haverá alguma latência do nginx, mas acho que pode haver um problema, já que é uma queda de 50%. Alguém ouviu falar de algo semelhante? qualquer ajuda seria ótima!

Aqui está o conf nginx relevante:

worker_processes 4;
worker_rlimit_nofile 30000;

events {
worker_connections 5120;
}

http {

sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;

}

sites-enabled / default:

upstream backend {
server 127.0.0.1:8000;
}

server {
server_name api.domain.com ;

location / {
proxy_pass http://backend;
proxy_buffering off;
}
}
    
por Isaac A Mosquera 29.08.2012 / 17:11

1 resposta

11

Certifique-se de adicionar a diretiva multi_accept on; ao seu bloco de eventos. Isso garante que cada trabalhador aceite o máximo de conexões possível.

Não use tcp_nodelay on; se você não estiver servindo dados / streams enormes. Mesmo que você esteja, você só deve ativá-lo no bloco de localização apropriado.

Não faça proxy de tudo para o seu back-end, apenas o proxy que realmente deve ser servido no seu back-end. Você também pode querer criar um cache de proxy para acelerar tudo ainda mais. O seguinte é um exemplo de configuração que fiz de acordo com a configuração que você postou acima.

# /etc/nginx/nginx.conf

worker_processes                  4;
worker_rlimit_nofile              20480; # worker_connections * 4
events {
  multi_accept                    on;
  worker_connections              5120;
  use                             epoll;
}
http {
  charset                         utf-8;
  client_body_timeout             65;
  client_header_timeout           65;
  client_max_body_size            10m;
  default_type                    application/octet-stream;
  keepalive_timeout               20;
  reset_timedout_connection       on;
  send_timeout                    65;
  server_tokens                   off;
  sendfile                        on;
  server_names_hash_bucket_size   64;
  tcp_nodelay                     off;
  tcp_nopush                      on;
  include                         sites-enabled/*.conf;
}

E o host virtual.

# /etc/nginx/sites-available/default.conf

upstream backend {
  server 127.0.0.1:8000;
}

server {
  server_name api.domain.com;

  location / {
    try_files $uri $uri/ @backend;
  }

  location @backend {
    proxy_buffering off;
    proxy_pass http://backend;
  }
}
    
por 30.08.2012 / 14:12

Tags