---
title: "Cómo activar HTTP/3 y QUIC en Nginx y Caddy en Ubuntu 24.04"
description: "Activa HTTP/3 sobre QUIC en Ubuntu 24.04 con Nginx desde el repositorio oficial o con Caddy, abre el puerto UDP 443 y comprueba que los navegadores usan h3."
category: "Rendimiento Web"
language: es
source: https://cubepath.com/es/docs/rendimiento-web/guia-de-configuracion-http3-y-quic
updated: 2026-09-25
---
# Cómo activar HTTP/3 y QUIC en Nginx y Caddy en Ubuntu 24.04
HTTP/3 es la versión de HTTP que funciona sobre QUIC, un transporte basado en UDP que establece la conexión cifrada en menos viajes de ida y vuelta y evita que un paquete perdido bloquee todas las peticiones de la conexión. La mejora se nota sobre todo en redes móviles y con pérdida de paquetes. En este tutorial activarás HTTP/3 en Ubuntu 24.04 con Nginx desde el repositorio oficial de nginx.org, verás la alternativa con Caddy y comprobarás que los clientes lo usan de verdad.
## Requisitos previos
- Un servidor con Ubuntu 24.04 LTS, por ejemplo un VPS de CubePath.
- Un usuario no root con privilegios `sudo`.
- Un dominio (`tudominio.com`) con registros A (y AAAA si usas IPv6) apuntando al servidor.
- Los puertos 80/tcp, 443/tcp y 443/udp accesibles desde Internet.
## Cómo funciona la negociación de HTTP/3
El navegador no puede saber de antemano si un servidor habla QUIC. La primera visita se hace por TCP con HTTP/2 o HTTP/1.1, y el servidor responde con la cabecera `Alt-Svc: h3=":443"`. A partir de ahí el navegador intenta QUIC por UDP 443 y, si el puerto está bloqueado, sigue usando TCP sin que el usuario note nada. Por eso HTTP/3 siempre se configura junto a HTTP/2, nunca en su lugar.
## Paso 1: Instalar Nginx desde el repositorio oficial
El paquete `nginx` de Ubuntu 24.04 es la versión 1.24, que no incluye QUIC: el soporte llegó en Nginx 1.25. Los paquetes de nginx.org sí se compilan con el módulo `http_v3`.
> Advertencia: si ya tienes instalado el Nginx de Ubuntu, haz una copia de `/etc/nginx` antes de continuar y elimínalo con `sudo apt remove nginx nginx-common`. Los paquetes de nginx.org usan una estructura distinta: los sitios van en `/etc/nginx/conf.d/*.conf` y no existe `sites-enabled`.
Instala las dependencias y la clave de firma del repositorio:
```bash
sudo apt update
sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo gpg --dearmor -o /etc/apt/keyrings/nginx.gpg
```
Añade el repositorio de la rama estable y dale prioridad sobre el paquete de Ubuntu:
```bash
echo "deb [signed-by=/etc/apt/keyrings/nginx.gpg] https://nginx.org/packages/ubuntu $(lsb_release -cs) nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
printf "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
| sudo tee /etc/apt/preferences.d/99nginx
```
Instala Nginx y comprueba que incluye el módulo:
```bash
sudo apt update
sudo apt install nginx
nginx -V 2>&1 | grep -o with-http_v3_module
```
```output
with-http_v3_module
```
Arranca el servicio:
```bash
sudo systemctl enable --now nginx
```
## Paso 2: Abrir los puertos en el firewall
QUIC usa UDP, así que no basta con el 443/tcp habitual. Con UFW:
```bash
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 443/udp
sudo ufw enable
sudo ufw status
```
```output
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
80/tcp ALLOW Anywhere
443/tcp ALLOW Anywhere
443/udp ALLOW Anywhere
```
Si tu proveedor aplica un firewall externo o grupos de seguridad, abre también allí el 443/udp.
## Paso 3: Obtener el certificado TLS
HTTP/3 exige TLS 1.3, que Nginx negocia automáticamente con un certificado válido. Crea el directorio del sitio y un bloque HTTP mínimo que Certbot pueda usar para validar el dominio:
```bash
sudo mkdir -p /var/www/tudominio.com
echo '
HTTP/3 funciona
' | sudo tee /var/www/tudominio.com/index.html
sudo mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.disabled
sudo nano /etc/nginx/conf.d/tudominio.com.conf
```
```nginx
server {
listen 80;
listen [::]:80;
server_name tudominio.com www.tudominio.com;
root /var/www/tudominio.com;
}
```
Recarga Nginx, instala Certbot con el plugin de Nginx y pide solo el certificado, sin que Certbot modifique la configuración:
```bash
sudo nginx -t && sudo systemctl reload nginx
sudo apt install certbot python3-certbot-nginx
sudo certbot certonly --nginx -d tudominio.com -d www.tudominio.com
```
```output
Certificate is saved at: /etc/letsencrypt/live/tudominio.com/fullchain.pem
Key is saved at: /etc/letsencrypt/live/tudominio.com/privkey.pem
```
## Paso 4: Configurar HTTP/3 en Nginx
Sustituye el contenido de `/etc/nginx/conf.d/tudominio.com.conf` por la configuración completa:
```bash
sudo nano /etc/nginx/conf.d/tudominio.com.conf
```
```nginx
server {
listen 80;
listen [::]:80;
server_name tudominio.com www.tudominio.com;
return 301 https://$host$request_uri;
}
server {
# HTTP/1.1 y HTTP/2 sobre TCP
listen 443 ssl;
listen [::]:443 ssl;
# HTTP/3 sobre QUIC (UDP)
listen 443 quic reuseport;
listen [::]:443 quic reuseport;
http2 on;
http3 on;
server_name tudominio.com www.tudominio.com;
root /var/www/tudominio.com;
index index.html;
ssl_certificate /etc/letsencrypt/live/tudominio.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/tudominio.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
# Anuncia HTTP/3 a los navegadores durante 24 horas
add_header Alt-Svc 'h3=":443"; ma=86400' always;
location / {
try_files $uri $uri/ =404;
}
}
```
Puntos importantes:
- `reuseport` solo puede aparecer una vez por dirección y puerto en toda la configuración. Si alojas más sitios, pon `listen 443 quic;` sin `reuseport` en los demás bloques `server`.
- La cabecera `Alt-Svc` es la que hace que el navegador pruebe HTTP/3. Si algún `location` define sus propios `add_header`, repite ahí también `Alt-Svc`, porque Nginx no hereda las cabeceras del nivel superior en ese caso.
- No actives `ssl_early_data` (0-RTT) salvo que tu aplicación sea inmune a peticiones repetidas: permite ataques de repetición.
Comprueba y recarga:
```bash
sudo nginx -t
sudo systemctl reload nginx
```
Verifica que Nginx escucha también en UDP:
```bash
sudo ss -ulnp | grep ':443'
```
```output
UNCONN 0 0 0.0.0.0:443 0.0.0.0:* users:(("nginx",pid=2231,fd=8),...)
UNCONN 0 0 [::]:443 [::]:* users:(("nginx",pid=2231,fd=9),...)
```
## Paso 5: Comprobar que los clientes usan HTTP/3
Primero confirma que el servidor anuncia HTTP/3:
```bash
curl -sI https://tudominio.com/ | grep -i alt-svc
```
```output
alt-svc: h3=":443"; ma=86400
```
El `curl` de Ubuntu 24.04 no está compilado con soporte QUIC. Compruébalo con `curl -V | grep HTTP3`; si tu equipo local tiene un curl con HTTP3 (por ejemplo el de Homebrew en macOS), puedes forzar la conexión por QUIC:
```bash
curl --http3-only -sI https://tudominio.com/ | head -n 1
```
```output
HTTP/3 200
```
En el navegador, abre las herramientas de desarrollo, pestaña Red, activa la columna Protocolo y recarga la página dos veces: la primera petición llega por `h2` y las siguientes por `h3`. En el servidor, el log de acceso muestra el protocolo en cada petición:
```bash
sudo tail -n 5 /var/log/nginx/access.log
```
```output
203.0.113.25 - - [25/Sep/2026:10:12:03 +0000] "GET / HTTP/3.0" 200 24 "-" "Mozilla/5.0 ..."
```
## Alternativa: HTTP/3 con Caddy
Caddy activa HTTP/3 por defecto, junto con el certificado automático de Let's Encrypt. Si prefieres Caddy a Nginx en un servidor nuevo, instálalo desde su repositorio oficial:
```bash
sudo apt install debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' \
| sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' \
| sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy
```
Edita el Caddyfile:
```bash
sudo nano /etc/caddy/Caddyfile
```
```text
tudominio.com, www.tudominio.com {
root * /var/www/tudominio.com
file_server
encode zstd gzip
}
```
No hace falta ninguna directiva para HTTP/3. Recarga y comprueba el puerto UDP:
```bash
sudo systemctl reload caddy
sudo ss -ulnp | grep caddy
```
Con los mismos puertos abiertos del paso 2, la verificación del paso 5 funciona igual.
## Solución de problemas
**La cabecera `Alt-Svc` aparece, pero el navegador sigue en `h2`.** Casi siempre es el UDP 443 bloqueado en un firewall externo o en la red del cliente (algunas redes corporativas filtran QUIC). Prueba desde otra red y revisa el firewall del proveedor.
**`nginx: [emerg] duplicate listen options for 0.0.0.0:443`.** Has puesto `reuseport` en más de un bloque `server`. Déjalo solo en uno.
**`unknown directive "http3"`.** Sigues usando el Nginx de Ubuntu 1.24. Comprueba el origen con `apt policy nginx` y revisa el archivo de preferencias del paso 1.
**Caddy avisa de `failed to sufficiently increase receive buffer size`.** El kernel limita el buffer UDP que necesita QUIC. Auméntalo:
```bash
printf "net.core.rmem_max=7500000\nnet.core.wmem_max=7500000\n" | sudo tee /etc/sysctl.d/60-quic.conf
sudo sysctl --system
sudo systemctl restart caddy
```
## Conclusión
Tu servidor sirve ahora HTTP/3 sobre QUIC con respaldo automático a HTTP/2, lo que reduce la latencia de conexión en redes móviles sin afectar a los clientes antiguos. Como siguientes pasos, activa la compresión Brotli, configura cabeceras de caché largas para los estáticos y mide el TTFB antes y después con PageSpeed Insights.