Configurando o proxy reverso nginx para enviar TCP para manter os pacotes ativos no servidor

2

Temos servidores IIS no Azure atrás do balanceador de carga. O balanceador de carga tem um tempo limite não configurável de 4 minutos após o qual a conexão inativa é interrompida.

Estamos tentando configurar o nginx como um proxy reverso para o cluster do IIS descrito acima. Tudo funciona bem, exceto que o nginx não envia mensagens keep alive para o servidor ao qual ele abriu a conexão. Portanto, se o servidor levar mais de 4 minutos para responder, a conexão será eliminada pelo balanceador de carga.

Se um cliente (navegador) se conectar diretamente ao balanceador de carga, ele enviará mensagens de manutenção de TCP e tudo ficará bom. Se o cliente se conecta ao nginx, ele envia keep alive para o nginx e tudo fica bem com a conexão ao nginx. Mas sem manter mensagens vivas entre o nginx e o balanceador de carga, então, eventualmente, a conexão morre.

A opção so_keepalive parece estar relacionada ao TCP manter-se ativo para conexões abertas para o nginx a partir do cliente (navegador).

Nós tentamos outros proxies reversos (proxy ARR do IIS, haproxy) e sempre nos deparamos com o mesmo problema.

Não podemos configurar o balanceador de carga (fora do nosso controle). Como poderíamos configurar o Linux com nginx, nginx ou IIS por trás do balanceador de carga (ao qual o nginx se conecta) para fazer com que enviassem mensagens para manter a conexão aberta?

    
por Sumrak 24.05.2016 / 04:49

1 resposta

1

Tanto no Linux quanto no Windows, o programa que abre a conexão deve configurar a opção keep alive no soquete para manter os pacotes ativos a serem enviados.

Acabamos de atualizar o código nginx para ativar a manutenção de todos os sockets abertos. Arquivo para atualizar: src/event/ngx_event_connect.c

Código para ativar o keep alive (testado apenas no Linux):

    /* Set the option active */
    int tcp_keepalive = 1;
    if(setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, (const void *) &tcp_keepalive, sizeof(int)) < 0) {
        return NGX_ERROR;
    }

Coloque em ngx_event_connect_peer logo após o soquete ser criado e a conexão ser recuperada ( ngx_get_connection ).

Você precisará também diminuir o tempo de vida útil (das 2 horas padrão) e talvez manter o intervalo de vida. Consulte o link para obter mais detalhes.

    
por 24.05.2016 / 21:12