Nginx Repetição de Pedidos (combinação Nginx - Haproxy)

2

Gostaria de perguntar sobre o Nginx Retry of Requests. Eu tenho um Nginx em execução no backend que, em seguida, envia as solicitações para HaProxy que, em seguida, passa no servidor web e a solicitação é processada. Estou recarregando minha configuração do Haproxy dinamicamente para fornecer elasticidade. O problema é que as solicitações são descartadas quando eu recarregar o Haproxy. Então, eu queria ter uma solução em que eu pudesse repetir isso do Nginx. Eu olhei através do proxy_connect_timeout, proxy_next_upstream no módulo http e max_fails e fail_timeout no módulo do servidor. Eu inicialmente tinha apenas 1 servidor nas conexões upstream, então eu apenas que até duas vezes agora e menos pedidos estão sendo descartados (apenas quando) dizer o mesmo servidor duas vezes no upstream, se eu tiver mesmo servidor 3-4 vezes aumenta gotas). / p>

Então, primeiro eu queria agora, que quando um pedido não é capaz de estabelecer conexão do Nginx para o Haproxy, então, ao recarregar, parece que a conexão é vista como erro e imediatamente o pedido é descartado.

Então, como eu posso especificar o tempo após a falha Eu quero repetir a solicitação do Nginx para o envio de dados ou o tempo antes do qual o Nginx a trata como uma solicitação com falha.

(Eu tentei usar o proxy_connect_timeout - não ajudei, mail_retires, fail_timeout e também coloquei o mesmo servidor upstream duas vezes (isso deu os melhores resultados até agora)

Arquivo conf Nginx

gae_sleep a montante {

server 128.111.55.219:10000;

}

servidor {

listen 8080;
server_name 128.111.55.219;
root /var/apps/sleep/app;
# Uncomment these lines to enable logging, and comment out the following two
#access_log  /var/log/nginx/sleep.access.log upstream;
error_log  /var/log/nginx/sleep.error.log;
access_log off;
#error_log /dev/null crit;

rewrite_log off;
error_page 404 = /404.html;
set $cache_dir /var/apps/sleep/cache;



location / {
  proxy_set_header  X-Real-IP  $remote_addr;
  proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header Host $http_host;
  proxy_redirect off;
  proxy_pass http://gae_sleep;
  client_max_body_size 2G;
  proxy_connect_timeout 30;
  client_body_timeout 30;
  proxy_read_timeout 30;
}

location /404.html {
  root /var/apps/sleep;
}

location /reserved-channel-appscale-path {
  proxy_buffering off;
  tcp_nodelay on;
  keepalive_timeout 55;
  proxy_pass http://128.111.55.219:5280/http-bind;
}

}

    
por vaibhav 12.03.2012 / 00:34

2 respostas

2

Então, depois de tentar encontrar a resposta para tentar novamente solicitações no nginx, não encontrei uma maneira limpa de tentar novamente solicitações, mas descobri uma maneira hacky para isso. Portanto, dentro da seção upstream no conf nginx, você deve colocar várias cópias do mesmo servidor upstream, pois tentar novamente no nginx é no nível do servidor upstream. Se um servidor upstream falhar, o nginx tentará o pedido em outro servidor upstream. Se você tem apenas 1 servidor upstream como eu tenho, não vai repetir o pedido. Então, para superar isso, coloquei várias cópias do mesmo servidor upstream, de modo que, no momento em que o nginx passasse pela lista de servidores e enviasse solicitações, o servidor upstream (haproxy, neste caso) teria recarregado e o pedido iria para. Também é essencial passar pelos vários tempos de espera que o nginx fornece no módulo http e no módulo do servidor. "fail_timeout" - diz que se um servidor upstream não estiver disponível descomissioná-lo por x segundos, mas se todos eles não estiverem disponíveis, ele não será descomissionado (estou mencionando isso, pois no momento em que o nginx passa pela lista inteira, o haproxy pode PS: esta é uma solução hacky e eu tive que ter uns 100 - 150 entradas de upstream no meu arquivo nginx para reduzir erros em significativo  número. Melhores soluções são bem vindas :)

    
por 01.04.2012 / 04:58
0

Não é exatamente o que você está perguntando, mas talvez mais importante: como você está reiniciando o HAProxy? Com a opção SF você deve ser capaz de reiniciar o HAProxy sem descartar quaisquer solicitações de conexão. Eu não acredito que o nginx possa repetir pedidos, mas se você realmente quisesse, poderia ter um front end do HAProxy para outra instância do HAProxy. Em seguida, o HAProxy tentaria novamente solicitações para a segunda instância. Mas isso parece muito bobo. Confira a opção SF primeiro.

Reinicie o script HAProxy (dos comentários) Os greps são apenas para os meus sentimentos calorosos:

#!/bin/sh

ps -ef | grep haproxy
haproxy -f haproxy.cfg -sf $(cat /var/run/haproxy.pid)
ps -ef | grep haproxy
    
por 12.03.2012 / 05:26

Tags