Usando nginx como proxy reverso HTTP para Apache com back-end PHP (preciso de flexibilidade .htaccess para webmasters). Ver o http/1.0 usado nos logs do Apache me fez pesquisar como ativar a conexão keep-alive.
Após minha pesquisa, encontrei esta postagem do blog do Nginxhttps://www.nginx.com/blog/avoiding-top-10-nginx-configuration-mistakes/#no-keepalives
Por padrão, o NGINX abre uma nova conexão com um servidor upstream (backend) para cada nova solicitação recebida. Isso é seguro, mas ineficiente, [...]
Se o comportamento padrão for seguro, quais são os riscos de ativar o keepalive upstream?
Responder1
Proxy de uma conexão com keepalive é considerado um risco devido a ataques de dessincronização HTTP/contrabando de solicitações. Isso ocorre quando o back-end não divide diferentes solicitações de clientes exatamente da mesma maneira que o front-end. Fechar a conexão após cada solicitação é a opção "segura", pois delineia claramente quando a solicitação atual terminou.
Verhttps://book.hacktricks.xyz/pentesting-web/http-request-smugglingPara maiores informações.
Responder2
Como já afirmei, KeepAlive é uma otimização para armazenar em cache a conexão. É para suportar tráfego de alto rendimento. Não vejo riscos em habilitá-lo, na verdade teria melhores resultados em qualquer caso.
Responder3
Comportamento padrão, a criação de conexão com o upstream para cada solicitação não é segura para carga pesada. Pelos seguintes motivos:
- assim que uma solicitação chegar ao servidor nginx do mesmo cliente, ele criará uma nova conexão com o servidor upstream, para a qual usará a nova porta local disponível.
- Depois de concluir a solicitação, a conexão fornecida naquela porta local passará de estabelecida para TIME_WAIT por 120 segundos, ou seja, por 120 segundos, essa porta local não poderá ser reutilizada para nenhuma nova solicitação
- agora a segunda solicitação vem do mesmo cliente, ele repetirá a etapa 1.
- desta forma para cargas pesadas,
- você pode acabar usando todas as portas locais disponíveis no nginx (65k)
- A criação e encerramento da conexão em cada solicitação é uma operação muito cara
Então, para evitar isso, o melhor que você pode fazer é armazenar em cache a conexão, para que, quando a solicitação chegar, você possa reutilizar a mesma conexão com o servidor upstream (na mesma porta local, como fez na última solicitação)
Atenciosamente Vj