Cómo habilitar HTTP / 2 en Apache en Ubuntu


Desde el inicio de la World Wide Web (www), el protocolo HTTP ha evolucionado a lo largo de los años para ofrecer contenido digital seguro y rápido a través de Internet.

La versión más utilizada es HTTP 1.1 y, si bien incluye mejoras de funciones y optimizaciones de rendimiento para abordar las deficiencias de versiones anteriores, no alcanza algunas otras características destacadas que han sido abordadas por HTTP/2.

El protocolo HTTP/1.1 está plagado de las siguientes deficiencias que lo hacen menos ideal, especialmente cuando se ejecutan servidores web de alto tráfico:

  1. Delays in loading web pages due to long HTTP headers.
  2. HTTP/1.1 is only able to send one request for each file per TCP connection.
  3. Given that HTTP/1.1 processes one request for every TCP connection, browsers are forced to send a deluge of parallel TCP connections to simultaneously process the requests. This leads to TCP congestion and ultimately bandwidth wastage and network degradation.

Los problemas mencionados anteriormente a menudo conducen a una degradación del rendimiento y altos costos generales en el uso del ancho de banda. HTTP/2 entró en escena para abordar estos problemas y ahora es el futuro de los protocolos HTTP.

Ofrece las siguientes ventajas:

  1. Header compression that minimizes client requests and thereby lowers bandwidth consumption. The resultant effect is fast page load speeds.
  2. Multiplexing several requests over one TCP connection. Both the server and the client can break down an HTTP request into multiple frames and regroup them at the other end.
  3. Faster web performances which consequently lead to better SEO ranking.
  4. Improved security since most mainstream browsers loads HTTP/2 over HTTPS.
  5. HTTP/2 is considered more mobile-friendly thanks to the header compression feature.

Dicho esto, vamos a habilitar HTTP/2 en Apache en Ubuntu 20.04 LTS y Ubuntu 18.04 LTS.

Antes de comenzar, asegúrese de habilitar HTTPS en el servidor web Apache antes de habilitar HTTP/2. Esto se debe a que todos los navegadores web convencionales admiten HTTP/2 sobre HTTPS. Tengo un nombre de dominio apuntado a una instancia en Ubuntu 20.04 que ejecuta un servidor Apache protegido con el certificado Let's Encrypt.

Además, se recomienda que tenga Apache 2.4.26 y versiones posteriores para servidores de producción que tengan la intención de cambiar a HTTP/2.

Para verificar la versión de Apache que está ejecutando, ejecute el comando:

$ apache2 -v

En la salida, puede ver que estamos usando la última versión, que es Apache 2.4.41 en el momento de escribir este artículo.

Habilite HTTP / 2 en un host virtual Apache

Para comenzar, primero confirme que el servidor web esté ejecutando HTTP/1.1. Puede hacer esto en un navegador abriendo la sección de herramientas para desarrolladores en Google Chrome usando la combinación Ctrl + SHIFT + I . Haga clic en la pestaña "Red" y busque la columna "Protocolo".

A continuación, habilite el módulo HTTP/2 en Ubuntu ejecutando el siguiente comando.

$ sudo a2enmod http2

A continuación, ubique y edite su archivo de host virtual SSL. Si ha habilitado HTTPS con Let's Encrypt, se crea un nuevo archivo con el sufijo le-ssl.conf.

$ sudo vim /etc/apache2/sites-enabled/your-domain-name-le-ssl.conf

Inserte la directiva a continuación después de la etiqueta .

Protocols h2 http/1.1

Para guardar los cambios, reinicie el servidor web Apache.

$ sudo systemctl restart apache2

Para verificar si HTTP/2 está habilitado, busque los encabezados HTTP usando el siguiente comando curl como se muestra.

$ curl -I --http2 -s https://domain.com/ | grep HTTP

Debería obtener la salida mostrada.

HTTP/2 200

En el navegador, vuelva a cargar su sitio. Luego, regrese a las herramientas para desarrolladores y confirme HTTP/2 indicado por la etiqueta h2 en la columna "Protocolo".

Al usar el módulo mod_php con Apache

Si está ejecutando Apache junto con el módulo mod_php, debe cambiar a PHP-FPM. Esto se debe a que el módulo mod_php utiliza el módulo MPM prefork que no es compatible con HTTP/2. Debe desinstalar el prefork MPM y cambiar al módulo mpm_event, que será compatible con HTTP/2.

Si está utilizando el módulo mod_php de PHP 7.4, por ejemplo, desactívelo como se muestra:

$ sudo a2dismod php7.4 

A partir de entonces, desactive el módulo MPM prefork.

$ sudo a2dismod mpm_prefork

Después de deshabilitar los módulos, a continuación, habilite los módulos Event MPM, Fast_CGI y setenvif como se muestra.

$ sudo a2enmod mpm_event proxy_fcgi setenvif

Instalar PHP-FPM en Ubuntu

A continuación, instale e inicie PHP-FPM como se muestra.

$ sudo apt install php7.4-fpm 
$ sudo systemctl start php7.4-fpm

Luego habilite PHP-FPM para que se inicie en el momento del arranque.

$ sudo systemctl enable php7.4-fpm

A continuación, habilite PHP-FPM como controlador PHP de Apache y reinicie el servidor web Apache para que se realicen los cambios.

$ sudo a2enconf php7.4-fpm

Habilitar la compatibilidad con HTTP / 2 en Apache Ubuntu

Luego habilite el módulo HTTP/2 como antes.

$ sudo a2enmod http2

Reinicie Apache para sincronizar todos los cambios.

$ sudo systemctl restart apache2

Finalmente, puede probar si su servidor está usando el protocolo HTTP/2 usando el comando curl como se muestra.

$ curl -I --http2 -s https://domain.com/ | grep HTTP

También puede optar por utilizar las herramientas de desarrollador en el navegador Google Chrome para verificar como se documentó anteriormente. Tenemos hasta el final de esta guía. Esperamos que haya encontrado valiosa la información y que pueda habilitar HTTP/2 en Apache con facilidad.