Nginx com Passenger atrás de HAProxy causa 503 erros

3

Durante o último mês, fui forçado a aprender muitas coisas sobre a configuração do servidor, integração, AWS, etc. Eu nunca fiz isso até esse ponto.

Eu obtive tudo e corri bem para o meu aplicativo (principalmente graças à gem link e à ajuda do # canal de IRC # rubberec2) . No entanto, estou encontrando um problema misterioso (para mim).

Pilha

Estou executando o Nginx + Passenger atrás do HAProxy. Até agora apenas um host Nginx + Passenger está sendo usado, então o HAProxy ainda não faz muito, mas adicionaremos mais servidores de aplicativos no futuro.

Problema

Estou preso a erros ocasionais de 503 que se tornam irritantes em determinados momentos do dia (durante uma carga maior?). Esses erros estão acontecendo em ativos estáticos e em URLs roteados. Eu determinei que é o HAProxy que os lança, porque a página e seus cabeçalhos são idênticos aos que estão em /etc/haproxy/errors/503.http.

Eu achei que o nginx não se importa com quantos pedidos ele recebe, ele pode lidar com todos eles, já que ele tem seu próprio enfileiramento, e o passageiro distribui as coisas corretamente. Então, por que o HAProxy afirma que não havia servidor disponível para lidar com algumas solicitações?

Minha configuração do HAProxy

global
  log 127.0.0.1 local0 warning
  maxconn 1024

defaults
  log global
  mode http
  retries 3
  balance roundrobin
  option abortonclose
  option redispatch
  option httplog
  contimeout 4000
  clitimeout 150000
  srvtimeout 30000

listen passenger_proxy x.x.x.x:x
  option forwardfor
  server web01 web01:xxxx maxconn 20 check

Nota: os IPs e as portas são substituídos por x es.

P.S. Eu não sou bom nessas coisas, aprendendo como eu vou.

Atualizar

Eu usei siege para comparar o servidor e descobri que posso reproduzir os 503s ao executar cerca de 58 sessões simultâneas. A taxa de sucesso é de apenas 54% nesse caso.

Atualização 2

Descobri que o log de acesso do nginx gera "-" 400 0 "-" "-" "-" toda vez que recebo 503.

Atualização 3

Todo mundo diz que o nginx dá erros "400 Bad Request" quando os cookies são muito grandes. No entanto, a configuração de large_client_header_buffers directive não corrigiu isso para mim.

Atualização 4

Corri siege no servidor, direcionando o nginx diretamente para sua porta de escuta e agora o nginx começou a retornar 499 erros com o mesmo padrão usado para retornar 503s antes. O cerco me diz que a conexão expirou quando isso acontece. Parece que estou chegando perto.

Atualização 5

Eu notei que o nginx estava logando em dois lugares no meu sistema, e havia um log de erro retornando esta mensagem toda vez que o cerco mostrava "Conexão esgotada":

file=ext/nginx/HelperAgent.cpp:574 time=2011-09-15 07:43:22.196 ]: Couldn't forward the HTTP response back to the HTTP client: It seems the user clicked on the 'Stop' button in his browser.

    
por Max Chernyak 15.09.2011 / 01:34

1 resposta

1

A partir do guia de configuração do HAProxy, é necessário aumentar o parâmetro maxconn no seu servidor declaração.

When a server has a "maxconn" parameter specified, it means that its number of concurrent connections will never go higher. Additionally, if it has a "minconn" parameter, it indicates a dynamic limit following the backend's load. The server will then always accept at least connections, never more than , and the limit will be on the ramp between both values when the backend has less than concurrent connections. This makes it possible to limit the load on the servers during normal loads, but push it further for important loads without overloading the servers during exceptional loads.

Eu sugiro ler todo o documento, pois há um monte de boas informações lá.

    
por 15.09.2011 / 17:48