Usar nginx como proxy inverso HTTP para Apache con backend PHP (necesito flexibilidad .htaccess para webmasters). Ver http/1.0 usado en los registros de Apache me hizo buscar cómo habilitar la conexión Keep-Alive.
Tras mi búsqueda encontré esta publicación de blog de Nginxhttps://www.nginx.com/blog/avoiding-top-10-nginx-configuration-mistakes/#no-keepalives
De forma predeterminada, NGINX abre una nueva conexión a un servidor ascendente (backend) para cada nueva solicitud entrante. Esto es seguro pero ineficiente,[...]
Si el comportamiento predeterminado es seguro, ¿cuáles son los riesgos de habilitar keepalive en sentido ascendente?
Respuesta1
Proxy una conexión con keepalive se considera un riesgo debido a los ataques de desincronización HTTP/contrabando de solicitudes. Esto ocurre cuando el backend no divide las diferentes solicitudes de los clientes exactamente de la misma manera que el frontend. Cerrar la conexión después de cada solicitud es la opción "segura", ya que esto delimita claramente cuándo finalizó la solicitud actual.
Verhttps://book.hacktricks.xyz/pentesting-web/http-request-smugglingpara más información.
Respuesta2
Como ya dije, KeepAlive es una optimización para almacenar en caché la conexión. Es para soportar tráfico de alto rendimiento. No veo ningún riesgo al habilitarlo, de hecho tendría mejores resultados en cualquier caso.
Respuesta3
El comportamiento predeterminado, la creación de una conexión con el flujo ascendente para cada solicitud no es seguro para cargas pesadas. Por las siguientes razones:
- Una vez que llega una solicitud al servidor nginx desde el mismo cliente, también creará una nueva conexión con el servidor ascendente, para lo cual utilizará el nuevo puerto local disponible.
- Una vez que se completa la solicitud, la conexión proporcionada en ese puerto local pasará de establecida a TIME_WAIT durante 120 segundos, esto significa que durante 120 segundos, ese puerto local no se puede reutilizar para ninguna solicitud nueva.
- Ahora la segunda solicitud proviene del mismo cliente, se repetirá el paso 1.
- de esta manera para cargas pesadas,
- puede terminar usando todos los puertos locales disponibles en nginx (65k)
- La creación y terminación de la conexión en cada solicitud es una operación muy costosa
Entonces, para evitar eso, lo mejor que puede hacer es almacenar en caché la conexión, de modo que cuando llegue la solicitud, pueda reutilizar la misma conexión con el servidor ascendente (en el mismo puerto local, como lo hizo para la última solicitud).
Saludos Vj