Si usas apache como tu servidor web, y estás usando la versión que viene con Rocky Linux 9, la 2.4.57, tienes suerte, porque soporta el uso de HTTP/2 y no tienes que hacer nada para que esté funcionando. Aun así, vamos a comprobar que necesitas y ver que ganas frente al uso de HTTP1.1.
El soporte para HTTP/2 en Apache fue introducido en la versión 2.4.17 (2015). Rocky Linux 9, al ser una distribución reciente basada en Red Hat Enterprise Linux, incluye la versión de Apache 2.4.57.
HTTP/2 vs. HTTP/1.1
Te puedes imaginar que las ventajas son muchas, pero las principales son que HTTP/2 aporta mejor rendimiento y menor latencia a la hora de servir tus páginas web.
HTTP/1.1 | HTTP/2 | |
---|---|---|
Fecha de soporte inicial en Apache | 1997 | 2015 (Apache 2.4.17) |
Porcentaje de uso actual (2024) | Más del 60 % | 35.4 % |
Principales ventajas | Estabilidad, compatibilidad amplia | Mejor rendimiento, menor latencia, multiplexación de streams |
¿Qué debes conocer de HTTP/2?
Lo mejor es ir directamente a la documentación de apache: https://httpd.apache.org/docs/2.4/es/howto/http2.html.
- HTTP/2 es un protocolo binario, al contrario que HTTP 1.1 que es texto plano.
- h2 es HTTP/2 sobre TLS.
- h2c es HTTP/2 sobre TCP.
- Un frame es la unidad más pequeña de comunicación dentro de una conexión HTTP/2, que consiste en una cabecera y una secuencia de octetos de longitud variable estructurada de acuerdo con el tipo de frame.
- Un stream es un flujo bidireccional de frames dentro de una conexión HTTP/2. El concepto correspondiente en HTTP 1.1 es un intercambio de mensajes de solicitud/respuesta.
- HTTP/2 es capaz de llevar múltiples streams de datos sobre la misma conexión TCP.
Necesitas tener activo el módulo de Apache mod_http2 y un servidor con soporte SSL.
Su uso en Rocky Linux 9
Ya te he dicho, que si tienes instalado apache en tu servidor Rocky Linux, todo debería de funcionar sin mucho problema.
Vete a /etc/httpd/conf.modules.d/10-h2.conf. Tienes que tener algo como esto:
LoadModule http2_module modules/mod_http2.so
<IfModule !mpm_prefork>
Protocols h2 h2c http/1.1
</IfModule>
Este significa, que la configuración de Apache está cargando el módulo mod_http2 que implementa el protocolo HTTP/2.
- h2: Este es el protocolo HTTP/2 sobre conexiones TLS (HTTPS).
- h2c: Este es el protocolo HTTP/2 sobre conexiones TCP (sin cifrado, HTTP).
- http/1.1: Este es el protocolo HTTP/1.1, que garantiza compatibilidad con clientes que no soportan HTTP/2.
El orden es importante. Al poner h2 primeros estamos diciendo que preferimos este protocolo primero.
También lo puedes comprobar con este comando:
httpd -M | grep http2
Y que solo lo hace si el módulo mpm_prefork no está cargado.
Si tienes todo esto configurado, significa que tu web ya está usando HHTP/2.
Si no tienes el módulo mod_http2 instalado, lo puedes hacer con sudo dnf install mod_http2
¡Dato! Te recomiendo que uses mpm_worker o mpm_event:
MPM | Modelo | Uso de memoria | Compatibilidad con HTTP/2 | Uso |
---|---|---|---|---|
mpm_prefork | Multiproceso | Alto | No | Aplicaciones no seguras para hilos |
mpm_worker | Multiproceso y multihilo | Moderado | Sí | Servidores de alto tráfico y múltiples solicitudes concurrentes |
mpm_event | Multiproceso y multihilo | Moderado | Sí | Manejo eficiente de conexiones persistentes (Keep-Alive) |
Si pones en línea de comandos:
apachectl -V
Te va a salir el modo que tienes activo y otra mucha información.
Si quieres cambiar el MPM que usa Apache, solo tienes que buscar en tu archivo de configuración de apache lo siguiente y poner esto:
# Deshabilitar mpm_prefork si está habilitado
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
# Habilitar mpm_event
LoadModule mpm_event_module modules/mod_mpm_event.so
En el caso de una instalación de Rocky Linux 9, lo vas a encontrar en: /etc/httpd/conf.modules.d/00-mpm.conf:
# Select the MPM module which should be used by uncommenting exactly
# one of the following LoadModule lines. See the httpd.conf(5) man
# page for more information on changing the MPM.
# prefork MPM: Implements a non-threaded, pre-forking web server
# See: http://httpd.apache.org/docs/2.4/mod/prefork.html
#
# NOTE: If enabling prefork, the httpd_graceful_shutdown SELinux
# boolean should be enabled, to allow graceful stop/shutdown.
#
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
# worker MPM: Multi-Processing Module implementing a hybrid
# multi-threaded multi-process web server
# See: http://httpd.apache.org/docs/2.4/mod/worker.html
#
#LoadModule mpm_worker_module modules/mod_mpm_worker.so
# event MPM: A variant of the worker MPM with the goal of consuming
# threads only for connections with active processing
# See: http://httpd.apache.org/docs/2.4/mod/event.html
#
LoadModule mpm_event_module modules/mod_mpm_event.so
Como puedes ver, yo tengo activado mod_mpm_event.so. Es la mejor opción si estás usando PHP FPM.
Vale, ya nos hemos asegurado de tener un MPM compatible con HTTP/2 y que la configuración de apache está cargando el módulo mod_http2.so. ¡Ojo! Tienes que tener activo SSL en tu servidor, algo que es sencillo si usas Let’s Encrypt (no me meto en este artículo sobre como configurarlo, hay muy buenas opciones online donde te lo explican).
Otras cosas a tener en cuenta
Con la configuración anterior en /etc/httpd/conf.modules.d/10-h2.conf, estás aplicando toda la configuración todos tus virtual hosts (si tienes varios dominios instalados en tu servidor se aplica a todos al mismo tiempo).
Si quieres separar un poco las configuraciones, puedes aplicar la directiva Protocols a cada Virtual Host de la siguiente manera:
<VirtualHost *:443>
ServerName www.ejemplo.com
# Otros ajustes...
Protocols h2 http/1.1
</VirtualHost>
Lo importante en esta regla anterior, es que estamos aplicando la configuración a nuestro dominio con SSL configurado, es decir, que funciona con HTTPS (:443), por lo que solo ponemos en Protocols, h2 http/1.1.
Después de aplicar todos los cambios, reinicia el servidor Apache:
sudo systemctl restart httpd
¿Cómo compruebas que está activo? Con este comando:
curl -I -k -s --http2 https://tupaginaweb.com
Vas a obtener algo como esto (verás HTTP/2 200):
¡Dato! Casi todos los navegadores modernos dan soporte a HTTP/2, pero solo en conexiones SSL:
¿Puedes implementar HTTP/2 de otra manera en tu servidor?
Sí. Puedes hacerlo si gestionas tus DNS con Cloudflare. Solo tienes que ir a Speed > Optimización > Optimización de protocolo. Está activado por defecto en todos los dominios gratuitos y de pago.
Y ya que nos ponemos, podemos activar también De HTTP/2 a Origen, que te va a permitir solicitudes HTTP/2 entre Cloudflare’s Edge y tu servidor:
Para que esta segunda aparte funcione, tienes que tener activo HTTP/2 en tu servidor. Si no lo tienes activo, solo se va a conectar mediante HTTP1.1.
La moraleja de esto, es que si no quieres activar HTTP/2 en tu servidor, con Cloudflare lo vas a poder hacer sin hacer nada, y tus visitantes se van a beneficiar de esta opción fácilmente. Pero es totalmente recomendable tenerla activa en el servidor para luego conectar con Cloudflare de manera más rápida. Tú decides.
Con Cloudflare puedes hacer otras muchas cosas como por ejemplo: Cómo bloquear BOTS AI y SEO con Cloudflare, Cómo configurar las Cache Rules de Cloudflare para WordPress.