HTTP/3 y QUIC representan la evolución del protocolo web para mejorar la velocidad, la eficiencia y la resiliencia de las conexiones. HTTP/3 se basa en QUIC, un protocolo de transporte sobre UDP, que reemplaza el tradicional TCP utilizado por HTTP/1.1 y HTTP/2. Entre sus principales ventajas se incluyen:
- Reducción de la latencia mediante 0-RTT y multiplexación de streams.
- Recuperación más rápida frente a pérdida de paquetes.
- Movilidad y migración de conexiones sin interrumpir la sesión.
Nginx ha incorporado soporte para HTTP/3 y QUIC en su línea principal (mainline), aunque algunas funcionalidades requieren builds específicos o parches adicionales.
Contexto y directivas de configuración
La configuración de HTTP/3 y QUIC en Nginx se organiza en distintos contextos, que determinan dónde se puede ubicar cada directiva:
Directiva | Contexto | Función |
---|---|---|
http3 on/off | http, server | Habilita la negociación del protocolo HTTP/3. |
http3_hq on/off | http, server | Habilita HTTP/0.9 para pruebas de interoperabilidad QUIC. |
http3_max_concurrent_streams number | http, server | Máximo de streams HTTP/3 concurrentes por conexión. |
http3_stream_buffer_size size | http, server | Tamaño del buffer para lectura/escritura de streams QUIC. |
quic_active_connection_id_limit number | http, server | Límite de IDs de conexión activas en el servidor. |
quic_bpf on/off | main | Permite la migración de conexiones QUIC mediante eBPF (Linux ≥5.7). |
quic_gso on/off | http, server | Optimiza el envío en lotes usando UDP_SEGMENT. |
quic_host_key file | http, server | Clave secreta para tokens de validación y resets sin estado. |
quic_retry on/off | http, server | Habilita retry de QUIC para validación de dirección. |
ssl_early_data on/off | http, server, location | Habilita 0-RTT en TLS 1.3. |
Configuración general
A continuación, se presenta un ejemplo completo de configuración mínima de Nginx con soporte HTTP/3 y QUIC:
# --- MAIN CONTEXT ---
worker_processes auto;
error_log /var/log/nginx/error.log notice;
quic_bpf off; # requiere Linux ≥5.7
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format quic '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" "$http3"';
access_log /var/log/nginx/access.log quic;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# --- HTTP/3 & QUIC ---
http3 on;
http3_hq off;
http3_max_concurrent_streams 128;
http3_stream_buffer_size 64k;
quic_active_connection_id_limit 2;
quic_gso off;
quic_retry off;
ssl_protocols TLSv1.3;
ssl_prefer_server_ciphers off;
server {
listen 443 ssl http2;
listen 443 quic reuseport;
server_name ejemplo.com;
ssl_certificate /etc/nginx/certs/fullchain.pem;
ssl_certificate_key /etc/nginx/certs/privkey.pem;
quic_host_key /etc/nginx/quic_host.key;
ssl_early_data on; # habilita 0-RTT
add_header Alt-Svc 'h3=":443"; ma=86400; persist=1';
add_header QUIC-Status $quic;
root /var/www/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
location /static/ {
ssl_early_data on; # solo en recursos estáticos
}
location /login {
ssl_early_data off; # no permitir 0-RTT en rutas sensibles
}
}
}
Generación de la clave QUIC
QUIC requiere una clave secreta para tokens de validación y resets sin estado (quic_host_key
). Se puede generar con OpenSSL:
openssl genpkey -algorithm X25519 -out /etc/nginx/quic_host.key
chown root:root /etc/nginx/quic_host.key
chmod 600 /etc/nginx/quic_host.key
Nota: La clave debe permanecer secreta y persistente. Si se cambia, los tokens generados con la clave anterior serán inválidos.
Pruebas y verificación
Para comprobar que el servidor soporta HTTP/3 y QUIC:
# Usando curl compilado con soporte HTTP/3
curl -I --http3 https://ejemplo.com/
Se puede verificar la cabecera Alt-Svc
para confirmar que el navegador detecta HTTP/3:
curl -sI https://ejemplo.com | grep Alt-Svc
Consideraciones de seguridad
- Early Data (0-RTT): permite enviar peticiones antes de completar el handshake TLS. Esto incrementa el riesgo de ataques de repetición (replay attacks). Solo debe habilitarse en peticiones idempotentes, como recursos estáticos. Nunca en rutas de login o transacciones.
- QUIC y firewalls: QUIC utiliza UDP; asegúrate de abrir los puertos correspondientes (por defecto UDP/443).
- Compatibilidad kernel: Directivas como
quic_bpf
yquic_gso
dependen de características del kernel Linux moderno (≥5.7 y soporte UDP_SEGMENT). - Tokens y claves: La gestión de
quic_host_key
es crítica. Cambiarla invalida tokens activos; se recomienda rotación controlada solo si es necesario.
Conclusión
Integrar HTTP/3 y QUIC en Nginx permite mejorar significativamente el rendimiento de sitios web modernos, especialmente en entornos con alta latencia o clientes móviles. La correcta configuración de directivas, junto con TLS 1.3 y early data controlado, garantiza un equilibrio entre rendimiento y seguridad.
Este artículo proporciona una guía completa y un ejemplo de configuración listo para producción, que puede adaptarse según necesidades de virtualhosts, certificados y rutas específicas.