Guía detallada

Http2 Http3 Migration Guide

Ver contenido

Guía Completa de Migración a HTTP/2 y HTTP/3 para Rendimiento Web

Introducción

Migrar a HTTP/2 y HTTP/3 es una de las mejoras de rendimiento de mayor impacto que puedes hacer. Los protocolos modernos ofrecen mejoras de velocidad significativas con una implementación relativamente directa. Esta guía proporciona estrategias de migración completas para diferentes entornos de servidor.

¿Nuevo en HTTP/2 y HTTP/3? Comienza con nuestra guía para principiantes: 📖 Leer: HTTP/2 y HTTP/3 Explicado

Estrategia 1: Configuración de Nginx HTTP/2 y HTTP/3

Configuración HTTP/2

# /etc/nginx/sites-available/default

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name ejemplo.com www.ejemplo.com;

    # Certificado SSL (requerido para HTTP/2)
    ssl_certificate /etc/letsencrypt/live/ejemplo.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ejemplo.com/privkey.pem;

    # Configuración TLS moderna
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
    ssl_prefer_server_ciphers off;

    # Configuraciones específicas HTTP/2
    http2_push_preload on;          # Habilitar Link preload push
    http2_max_concurrent_streams 128;
    http2_idle_timeout 3m;

    root /var/www/html;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

# Redirigir HTTP a HTTPS
server {
    listen 80;
    listen [::]:80;
    server_name ejemplo.com www.ejemplo.com;
    return 301 https://$server_name$request_uri;
}

Configuración HTTP/3 (Nginx 1.25+)

# /etc/nginx/nginx.conf

http {
    # Habilitar soporte HTTP/3
    http3 on;
    http3_hq on;

    server {
        # HTTP/3 sobre QUIC
        listen 443 quic reuseport;
        listen 443 ssl http2;

        server_name ejemplo.com;

        ssl_certificate /etc/letsencrypt/live/ejemplo.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/ejemplo.com/privkey.pem;

        # TLS 1.3 requerido para HTTP/3
        ssl_protocols TLSv1.3;
        ssl_early_data on;          # Habilitar 0-RTT

        # Anunciar soporte HTTP/3
        add_header Alt-Svc 'h3=":443"; ma=86400';

        # Configuraciones específicas QUIC
        quic_retry on;
        quic_gso on;

        location / {
            try_files $uri $uri/ =404;
        }
    }
}

Estrategia 2: Configuración de Apache HTTP/2

Habilitar Módulo HTTP/2

# /etc/apache2/mods-available/http2.load
LoadModule http2_module /usr/lib/apache2/modules/mod_http2.so

# Habilitar el módulo
# a2enmod http2

Configuración de Virtual Host

# /etc/apache2/sites-available/ejemplo.conf

<VirtualHost *:443>
    ServerName ejemplo.com
    ServerAlias www.ejemplo.com

    # Habilitar HTTP/2
    Protocols h2 h2c http/1.1

    # Configuración SSL (requerida)
    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/ejemplo.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/ejemplo.com/privkey.pem

    # Configuraciones TLS modernas
    SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
    SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256
    SSLHonorCipherOrder off

    # Configuraciones HTTP/2
    H2Direct on
    H2ModernTLSOnly off
    H2MaxSessionStreams 100
    H2WindowSize 65535

    DocumentRoot /var/www/html

    <Directory /var/www/html>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

# Redirección HTTP a HTTPS
<VirtualHost *:80>
    ServerName ejemplo.com
    Redirect permanent / https://ejemplo.com/
</VirtualHost>

Estrategia 3: HTTP/2 y HTTP/3 Basado en CDN

Configuración Cloudflare

Panel de Cloudflare → Speed → Optimization → Protocol Optimization

✅ HTTP/2: Habilitado por defecto (automático)
✅ HTTP/3: Habilitar en el panel

Configuraciones:
- HTTP/2 to Origin: Habilitar (si el origen soporta)
- HTTP/3: Activar
- 0-RTT Connection Resumption: Habilitar

AWS CloudFront

{
  "DistributionConfig": {
    "HttpVersion": "http2and3",
    "Origins": {
      "Items": [{
        "OriginProtocolPolicy": "https-only",
        "CustomOriginConfig": {
          "OriginProtocolPolicy": "https-only",
          "HTTPSPort": 443,
          "OriginSSLProtocols": {
            "Items": ["TLSv1.2"],
            "Quantity": 1
          }
        }
      }]
    },
    "DefaultCacheBehavior": {
      "ViewerProtocolPolicy": "redirect-to-https",
      "AllowedMethods": ["GET", "HEAD", "OPTIONS"]
    }
  }
}

Vercel y Netlify

Ambas plataformas proporcionan automáticamente HTTP/2 y HTTP/3:

Vercel:
- HTTP/2: Automático ✅
- HTTP/3: Automático ✅
- No requiere configuración

Netlify:
- HTTP/2: Automático ✅
- HTTP/3: Automático ✅
- No requiere configuración

Estrategia 4: Servidor Node.js HTTP/2

Implementación Nativa HTTP/2

// server.js
const http2 = require('http2');
const fs = require('fs');
const path = require('path');

const server = http2.createSecureServer({
  key: fs.readFileSync('server.key'),
  cert: fs.readFileSync('server.crt'),
  allowHTTP1: true  // Fallback para clientes HTTP/1.1
});

// Manejar streams
server.on('stream', (stream, headers) => {
  const reqPath = headers[':path'];

  // Ejemplo de server push (usar con moderación)
  if (reqPath === '/' && stream.pushAllowed) {
    stream.pushStream({ ':path': '/styles.css' }, (err, pushStream) => {
      if (!err) {
        pushStream.respondWithFile(
          path.join(__dirname, 'public', 'styles.css'),
          { 'content-type': 'text/css' }
        );
      }
    });
  }

  // Responder a la solicitud
  const filePath = reqPath === '/' ? '/index.html' : reqPath;
  stream.respondWithFile(
    path.join(__dirname, 'public', filePath),
    { 'content-type': getContentType(filePath) },
    { onError: (err) => handleError(stream, err) }
  );
});

server.listen(443, () => {
  console.log('Servidor HTTP/2 ejecutándose en puerto 443');
});

Express con HTTP/2

// Usando paquete spdy para HTTP/2 con Express
const spdy = require('spdy');
const express = require('express');
const fs = require('fs');

const app = express();

// Middleware y rutas
app.use(express.static('public'));

app.get('/', (req, res) => {
  // Server push via header Link
  res.setHeader('Link', '</styles.css>; rel=preload; as=style');
  res.sendFile(__dirname + '/public/index.html');
});

const options = {
  key: fs.readFileSync('server.key'),
  cert: fs.readFileSync('server.crt'),
  spdy: {
    protocols: ['h2', 'http/1.1'],
    plain: false
  }
};

spdy.createServer(options, app).listen(443, () => {
  console.log('Servidor HTTP/2 con Express ejecutándose');
});

Estrategia 5: Mejores Prácticas de Optimización

Eliminar Workarounds de HTTP/1.1

Después de Migrar a HTTP/2 - Qué Cambiar:
┌─────────────────────────────────────────────────────────────┐
│ ELIMINAR Estos Workarounds de HTTP/1.1:                     │
│                                                             │
│ ❌ Domain sharding (múltiples dominios CDN)                 │
│    └── HTTP/2 multiplexa en una sola conexión               │
│                                                             │
│ ❌ Concatenación excesiva de archivos                       │
│    └── Muchos archivos pequeños ahora son eficientes        │
│                                                             │
│ ❌ Sprites de imágenes (para todas las imágenes)            │
│    └── Imágenes individuales pueden cargar en paralelo      │
│                                                             │
│ ❌ Inline de todo (CSS, JS, imágenes)                       │
│    └── Archivos externos pueden cachearse y enviarse        │
│                                                             │
│ MANTENER Estas Prácticas:                                   │
│                                                             │
│ ✅ Minificación (aún reduce bytes)                          │
│ ✅ Compresión (gzip/Brotli sigue siendo esencial)           │
│ ✅ Caching (headers de caché siguen siendo críticos)        │
│ ✅ Code splitting (chunks razonables, no un archivo enorme) │
│ ✅ CSS Crítico (optimización de primer renderizado)         │
└─────────────────────────────────────────────────────────────┘

Preload y Early Hints

<!-- Usar preload con HTTP/2 push -->
<link rel="preload" href="/fonts/main.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/styles/critical.css" as="style">
<link rel="preload" href="/scripts/main.js" as="script">

<!-- Early Hints del lado del servidor (103) -->
<!-- Configuración Nginx -->
<!-- add_header Link "</styles.css>; rel=preload; as=style" early_hints; -->

División Óptima de Recursos

// vite.config.js - División óptima para HTTP/2
export default defineConfig({
  build: {
    rollupOptions: {
      output: {
        // Chunks más pequeños funcionan mejor con HTTP/2
        manualChunks: {
          vendor: ['vue', 'vue-router', 'pinia'],
          utils: ['lodash', 'axios'],
        },
        // Objetivo ~50-100KB por chunk
        chunkSizeWarningLimit: 100,
      },
    },
  },
});

Estrategia 6: Pruebas y Verificación

Probar Soporte HTTP/2

# Usando curl
curl -I --http2 -s https://ejemplo.com | head -1
# Esperado: HTTP/2 200

# Verificar protocolo negociado
curl -v --http2 https://ejemplo.com 2>&1 | grep "ALPN"
# Esperado: ALPN, server accepted to use h2

# Herramienta nghttp (análisis detallado HTTP/2)
nghttp -nv https://ejemplo.com

Probar Soporte HTTP/3

# Usando curl con HTTP/3 (requiere curl 7.66+)
curl --http3 -I https://ejemplo.com

# Verificar header Alt-Svc
curl -I https://ejemplo.com 2>&1 | grep -i "alt-svc"
# Esperado: alt-svc: h3=":443"; ma=86400

Herramientas de Prueba Online

Herramienta Propósito URL
HTTP/2 Test Verificar soporte HTTP/2 https://tools.keycdn.com/http2-test
HTTP/3 Check Verificar soporte HTTP/3 https://http3check.net
WebPageTest Análisis completo de protocolo https://webpagetest.org
Lighthouse Auditoría de rendimiento Integrado en Chrome DevTools

Midiendo el Impacto de la Migración

Comparación Antes/Después

ANTES de la Migración HTTP/2 (HTTP/1.1):
├── Conexiones por página: 6-8 paralelas
├── Time to First Byte: 450ms
├── Tiempo de Carga: 3.2s
├── Total de Solicitudes: 45
└── Lighthouse Performance: 68

DESPUÉS de la Migración HTTP/2:
├── Conexiones por página: 1-2 multiplexadas
├── Time to First Byte: 380ms (↓15%)
├── Tiempo de Carga: 2.4s (↓25%)
├── Total de Solicitudes: 45 (igual, pero más rápido)
└── Lighthouse Performance: 82 (↑14 puntos)

DESPUÉS de la Migración HTTP/3:
├── Conexiones por página: 1 QUIC
├── Time to First Byte: 320ms (↓29%)
├── Tiempo de Carga: 1.9s (↓40%)
├── 0-RTT para visitantes recurrentes
└── Lighthouse Performance: 89 (↑21 puntos)

Lista de Verificación de Migración

Antes de ir a producción, verifica:

  • [ ] HTTPS está completamente configurado (requerido para HTTP/2)
  • [ ] TLS 1.2+ habilitado, TLS 1.3 para HTTP/3
  • [ ] HTTP/2 habilitado y funcionando (probar con curl)
  • [ ] Header Alt-Svc anunciando HTTP/3 (si está habilitado)
  • [ ] Domain sharding eliminado (usar un solo dominio)
  • [ ] Bundling excesivo reducido
  • [ ] Server push configurado con moderación (o deshabilitado)
  • [ ] Fallback a HTTP/1.1 funciona para clientes antiguos
  • [ ] Métricas de rendimiento mejoraron en pruebas
  • [ ] CDN soporta HTTP/2 y HTTP/3

Artículos Relacionados

Continúa optimizando tu configuración de servidor:

📚 Volver al Hub de Performance SEO - Explora todos los temas de rendimiento


Referencias

  1. MDN Web Docs - HTTP/2
  2. MDN Web Docs - HTTP/3
  3. web.dev - Introduction to HTTP/2
  4. Cloudflare - HTTP/3 Support

Pruébalo Tú Mismo

¿Listo para verificar el soporte de protocolo HTTP de tu sitio?

🔧 Descarga UXR SEO Analyzer (Gratis, análisis 100% local)


Disclaimer: Los analizadores en esta extensión son guías de referencia basadas en documentación oficial de MDN, web.dev y Chrome Developers. No representan verdades absolutas sobre cómo los motores de búsqueda evalúan tu contenido—solo los motores de búsqueda conocen sus algoritmos internos. Usa estas recomendaciones como punto de partida para mejorar tu sitio.

Última actualización: 15 de diciembre de 2025

Artículos relacionados

Versión relacionada

Introducción

Http2 Http3 Explained

HTTP/2 y HTTP/3 son versiones modernas del protocolo HTTP que mejoran dramáticamente cómo cargan las páginas web

Hub de categoría

Hub

Performance Seo Hub

El rendimiento es un factor de ranking crítico e impacta directamente la experiencia del usuario

En la misma categoría

Guía detallada

Ttfb Optimization Guide

Time to First Byte (TTFB) es la base del rendimiento web—cada milisegundo de TTFB retrasa toda la carga de tu página

Guía detallada

Caching Headers Optimization Guide

El caché HTTP es una de las optimizaciones de rendimiento más poderosas disponibles

Guía detallada

Text Compression Implementation Guide

La compresión de texto puede reducir los tamaños de transferencia en un 60-90%, haciéndola una de las optimizaciones de rendimiento de mayor impacto disponibles