Table of Contents
Configurar Nginx como servidor proxy usando conexiones keepalive
Conexiones KeepAlive són aquellas que se mantienen abiertas (por norma 60 segundos) tras recibir una petición y servirla, de esta forma la siguiente petición reaprovecha la conexión. Su finalidad es la de reutilizar conexiones TCP abiertas y no crear nuevas conexiones para cada elemento requerido (ficheros js, css, imágenes, etc).
Al usar Nginx como proxy reverso, si este no se configura correctamente, no creará conexiones keepalive con el servidor final que debe responder la petición. Creando una conexión TCP nueva para cada recurso requerido, con el costo que eso supone tanto de procesamiento como de uso de puertos efímeros.
Si en el host destino, el que recibe las peticiones de nginx, se detecta que unas pocas visitas producen un gran número de conexiones en estado de espera “time wait”, posiblemente el problema esté en la configuración del proxy reverso que se encarga de contactar con dicho servidor. Comandos útiles para observar las conexiones serían “netstat” o “ss”.
Conexiones keepalive en Nginx como proxy HTTP / HTTPS
keepalive XX proxy_http_version 1.1; proxy_set_header Connection "";
Ejemplo: Nginx proxy HTTP con conexiones keepalive.
upstream http_backend { server 127.0.0.1:8080; keepalive 16; } server { ... location / { proxy_pass http://http_backend; proxy_http_version 1.1; proxy_set_header Connection ""; ... } }
NOTA: Las conexiones keepalive son por worker configurado. Si tenemos 4 workers y una configuración de 20 conexiones keepalive, se usarán 80 conexiones keepalive en total. Si se supera el número de conexiones, Nginx simplemente empezará a abrir conexiones TCP por cada petición, pero estas no se reutilizarían.
Conexiones keepalive en Nginx como proxy NO HTTP / HTTPS
Si se usa Nginx para redirigir tráfico que no es HTTP, solo es necesaria la opción keepalive.
Ejemplo: Nginx proxy no HTTP con conexiones keepalive.
upstream memcached_backend { server 127.0.0.1:11211; keepalive 32; } server { ... location /memcached/ { set $memcached_key $uri; memcached_pass memcached_backend; } }
Enlaces de interés.
- Detectar puertos efímeros en uso: https://github.com/Busindre/Detecting-ephemeral-port-exhaustion