Manter a conexão SSL ativa entre o proxy reverso e o servidor back-end

Aug 19 2020

Eu tenho um servidor back-end (Apache) que está muito longe da maioria dos nossos usuários, então nossa ideia é implementar um proxy reverso mais próximo que funcionará como um cache.

À primeira vista, funcionou como um encanto. Os arquivos estáticos armazenados em cache são servidos extremamente rápido, mas para qualquer outra coisa, o proxy reverso (NGINX) precisa se conectar ao servidor back-end, o que leva algum tempo para o handshaking SSL, tornando essas primeiras solicitações lentas.

Eu estava procurando informações sobre isso, mas não consegui encontrar uma maneira de manter essa conexão. Existe uma maneira de fazer isso?

Eu até tentei aprender mais sobre websockets, mas todas as implementações que encontrei foram para responder a uma solicitação específica, não para manter a conexão intermediando os dois servidores web (NGINX no proxy reverso e Apache no back-end).

Algum de vocês tem alguma ideia ou dica sobre o que estudar / usar / pesquisar para conseguir isso?

Muito obrigado antecipadamente!

Respostas

MichaelHampton Aug 19 2020 at 07:54

No nginx, você só pode especificar keepaliveuma conexão upstream se a conexão for definida em um upstreambloco. Por exemplo:

upstream backend {
    server private-api.example.com:443;

    keepalive 32;
}

Aqui, keepaliveespecifica o número máximo de conexões abertas simultâneas para os servidores upstream por processo de trabalho .

Para usar o upstream, você especifica seu nome em seu, em proxy_passvez de no endereço de back-end.

Por exemplo, se você usou anteriormente:

     proxy_pass https://private-api.example.com:443;

Você mudaria para:

     proxy_pass https://backend;

Substitua literalmente o nome do upstream pelo definido server.

Você também deve definir a versão HTTP para 1.1 (porque o padrão absurdamente é 1.0) e limpar o cabeçalho de conexão:

    proxy_http_version 1.1;
    proxy_set_header Connection "";

Lembre-se de que também há um que keepalive_timeoutvocê pode definir no upstreamqual talvez precise ajustar. Por padrão, são 60 segundos; portanto, se uma conexão ficar inativa por tanto tempo, ela será fechada, mesmo que haja menos de keepaliveconexões abertas. O servidor back-end terá seu próprio tempo limite de manutenção de atividade, que você também precisará ajustar separadamente.