Cómo configurar Nginx con soporte HTTP/2 en Ubuntu 22.04

Sergey Zhukaev escribió una versión anterior de este tutorial .

Introducción

Nginx es un servidor web de código abierto rápido y confiable. Ganó popularidad debido a su bajo consumo de memoria, alta escalabilidad, facilidad de configuración y compatibilidad con una amplia variedad de protocolos.

HTTP/2 es una versión más reciente del Protocolo de Transporte de Hipertexto, que se utiliza en la Web para enviar páginas desde el servidor al navegador. HTTP/2 es la primera actualización importante de HTTP en casi dos décadas: HTTP1.1 se presentó al público en 1999, cuando las páginas web eran mucho más pequeñas. Internet ha cambiado drásticamente desde entonces y ahora nos enfrentamos a las limitaciones de HTTP 1.1. El protocolo limita las velocidades de transferencia potenciales para la mayoría de los sitios web modernos porque descarga partes de una página en una cola (la parte anterior debe descargarse por completo antes de que comience la descarga de la siguiente parte) y una página web moderna promedio descarga docenas de recursos individuales de CSS, javascript e imágenes.

HTTP/2 resuelve este problema porque aporta algunos cambios fundamentales:

  • Todas las solicitudes se descargan en paralelo, no en una cola.
  • Los encabezados HTTP están comprimidos
  • Las páginas se transfieren como un archivo binario, no como un archivo de texto, lo cual es más eficiente
  • Los servidores pueden “enviar” datos incluso sin la solicitud del usuario, lo que mejora la velocidad para los usuarios con alta latencia.

Aunque HTTP/2 no requiere cifrado, los desarrolladores de los dos navegadores más populares, Google Chrome y Mozilla Firefox, han declarado que, por razones de seguridad, solo admitirán HTTP/2 para conexiones HTTPS. Por lo tanto, si decide configurar servidores con soporte para HTTP/2, también debe protegerlos con HTTPS.

Este tutorial le ayudará a configurar un servidor Nginx rápido y seguro con soporte HTTP/2.

Prerrequisitos

Antes de comenzar, necesitarás algunas cosas:

  • Un servidor Ubuntu 22.04 configurado siguiendo la guía de configuración inicial del servidor Ubuntu 22.04 , incluido un usuario sudo no root y un firewall.
  • Nginx instalado en su servidor, lo cual puede hacer siguiendo Cómo instalar Nginx en Ubuntu 22.04 .
  • Un nombre de dominio configurado para apuntar a su servidor. Puede comprar uno en Namecheap u obtener uno gratis en Freenom . Puede aprender a apuntar dominios a DigitalOcean Droplets siguiendo la documentación sobre Cómo administrar su dominio con DigitalOcean .
  • Un certificado TLS/SSL configurado para su servidor. Tiene dos opciones:
    • Puede obtener un certificado gratuito de Let’s Encrypt siguiendo Cómo proteger Nginx con Let’s Encrypt en Ubuntu 22.04 .
    • También puede generar y configurar un certificado autofirmado siguiendo Cómo crear un certificado SSL autofirmado para Nginx en Ubuntu 22.04 .
  • Nginx configurado para redirigir el tráfico de un puerto 80a otro 443, lo que debería estar cubierto por los requisitos previos anteriores.
  • Nginx configurado para usar una clave Diffie-Hellman efímera (DHE) de 2048 bits o superior, que también debería estar cubierta por los requisitos previos anteriores.

Paso 1: Habilitar la compatibilidad con HTTP/2

Si siguió el paso de configuración del bloque de servidor en el tutorial de instalación de Nginx , debería tener un bloque de servidor para su dominio con la directiva ya configurada correctamente. El primer cambio que haremos será modificar el bloque de servidor de su dominio para que use HTTP/2./etc/nginx/sites-available/your_domainserver_name

Abra el archivo de configuración de su dominio utilizando nanosu editor preferido:

  1. sudo nano /etc/nginx/sites-enabled/your_domain

En el archivo, localice las listenvariables asociadas al puerto 443:

/etc/nginx/sites-enabled/su_dominio

...    listen [::]:443 ssl ipv6only=on;     listen 443 ssl; ...

El primero es para conexiones IPv6. El segundo es para todas las conexiones IPv4. Habilitaremos HTTP/2 para ambos.

Modifique cada listendirectiva para incluir http2:

/etc/nginx/sites-enabled/su_dominio

...    listen [::]:443 ssl http2 ipv6only=on;     listen 443 ssl http2; ...

Esto le dice a Nginx que use HTTP/2 con navegadores compatibles.

Guarde el archivo de configuración y salga del editor de texto. Si está utilizando nano, presione Ctrl+Xy, cuando se le solicite, Ypresione Enter.

Siempre que realice cambios en los archivos de configuración de Nginx, debe verificar la configuración en busca de errores, utilizando el -tindicador , que ejecuta el comando de verificación de sintaxis integrado de Nginx:

  1. sudo nginx -t

Si la sintaxis está libre de errores, recibirá un resultado como el siguiente:

Salida de sudo nginx -t

nginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: configuration file /etc/nginx/nginx.conf test is successful

A continuación, configurará su servidor Nginx para utilizar una lista de cifrados más restrictiva para mejorar la seguridad de su servidor.

Paso 2: eliminar conjuntos de cifrado antiguos e inseguros

HTTP/2 tiene una lista de bloqueo de cifrados antiguos e inseguros que se deben evitar. Los conjuntos de cifrados son algoritmos criptográficos que describen cómo se deben cifrar los datos transferidos.

El método que utilizará para definir los cifrados dependerá de cómo haya configurado sus certificados TLS/SSL para Nginx.

Si utilizó Certbot para obtener sus certificados, también creó el archivo /etc/letsencrypt/options-ssl-nginx.confque contiene los cifrados que no son lo suficientemente seguros para HTTP/2. Sin embargo, modificar este archivo evitará que Certbot aplique actualizaciones en el futuro, por lo que simplemente le diremos a Nginx que no use este archivo y especificaremos nuestra propia lista de cifrados.

Abra el archivo de configuración del bloque del servidor para su dominio:

sudo nano /etc/nginx/sites-enabled/your_domain

Localice la línea que incluye el options-ssl-nginx.confarchivo y coméntela agregando un #carácter al comienzo de la línea:

/etc/nginx/sites-enabled/su_dominio

# include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot

Debajo de esa línea, agregue esta línea para definir los cifrados permitidos:

/etc/nginx/sites-enabled/su_dominio

ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

Guarde el archivo y salga del editor.

Si utilizó certificados autofirmados o utilizó un certificado de un tercero y lo configuró según los requisitos previos, abra el archivo /etc/nginx/snippets/ssl-params.confen su editor de texto:

  1. sudo nano /etc/nginx/snippets/ssl-params.conf

Localice la siguiente línea:

/etc/nginx/snippets/ssl-params.conf

...ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;...

Modifíquelo para utilizar la siguiente lista de cifrados:

/etc/nginx/snippets/ssl-params.conf

...ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

Guarde el archivo y salga del editor.

Una vez más, verifique la configuración en busca de errores de sintaxis utilizando el nginx -tcomando:

  1. sudo nginx -t

Si encuentra algún error, corríjalo y vuelva a realizar la prueba.

Una vez que su configuración pase la verificación de sintaxis, reinicie Nginx usando el systemctlcomando:

  1. sudo systemctl reload nginx.service

Con el servidor reiniciado, verifiquemos que funciona.

Paso 3: Verificar que HTTP/2 esté habilitado

Asegurémonos de que el servidor esté ejecutándose y trabajando con HTTP/2.

Utilice el curlcomando para realizar una solicitud a su sitio y ver los encabezados:

  1. curl -I -L --http2 https://your_domain

Recibirá un resultado como el siguiente:

HTTP/2 200**Server**: nginx/1.18.0 (Ubuntu)**Date**: Tue, 21 Jun 2022 22:19:09 GMT**Content-Type**: text/html**Content-Length**: 612**Last-Modified**: Tue, 21 Jun 2022 22:17:56 GMT**Connection**: keep-alive**ETag**: "62b24394-264"**Accept-Ranges**: bytes

También puedes verificar que se esté utilizando HTTP/2 en Google Chrome. Abre Chrome y navega hasta . Abre las Herramientas para desarrolladores de Chrome ( VerDesarrolladorHerramientas para desarrolladores ) y vuelve a cargar la página ( VerRecargar esta página ). Navega hasta la pestaña Red , haz clic derecho en la fila del encabezado de la tabla que comienza con Nombre y selecciona la opción Protocolo en el menú emergente.https://your_domain

Tendrás una nueva columna de Protocolo que contiene h2(que significa HTTP/2), lo que indica que HTTP/2 está funcionando.

En este punto, ya está listo para ofrecer contenido a través del protocolo HTTP/2. Mejoremos la seguridad y el rendimiento habilitando HSTS.

Paso 4: Habilitar la seguridad de transporte estricta HTTP (HSTS)

Aunque tus solicitudes HTTP se redirijan a HTTPS, puedes habilitar la Seguridad de Transporte Estricto HTTP (HSTS) para evitar tener que hacer esas redirecciones. Si el navegador encuentra un encabezado HSTS, no volverá a intentar conectarse al servidor a través de HTTP normal durante un período de tiempo determinado. Pase lo que pase, intercambiará datos utilizando solo una conexión HTTPS cifrada. Este encabezado también nos protege de ataques de degradación de protocolo .

Abra nuevamente el archivo de configuración del bloque del servidor para su dominio:

sudo nano /etc/nginx/your_domain

Agregue esta línea al mismo bloque del archivo que contiene los cifrados SSL para habilitar HSTS:

/etc/nginx/su_dominio

server {...    ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;    add_header Strict-Transport-Security "max-age=15768000" always;}...

El max-agevalor se establece en segundos y 15768000equivale a 6 meses.

De forma predeterminada, este encabezado no se agrega a las solicitudes de subdominios. Si tiene subdominios y desea que HSTS se aplique a todos ellos, debe agregar la includeSubDomainsvariable al final de la línea, de la siguiente manera:

/etc/nginx/su_dominio

add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;

Guarde el archivo y salga del editor.

Una vez más, verifique la configuración para detectar errores de sintaxis:

  1. sudo nginx -t

Por último, reinicie el servidor Nginx para aplicar los cambios.

  1. sudo systemctl reload nginx.service

Conclusión

Su servidor Nginx ahora está sirviendo páginas HTTP/2. Si desea probar la solidez de su conexión SSL, visite Qualys SSL Lab y realice una prueba en su servidor. Si todo está configurado correctamente, debería obtener una calificación A+ en seguridad.

Para obtener más información sobre cómo Nginx analiza e implementa las reglas de bloque de servidor, intente leer Comprender los algoritmos de selección de bloques de ubicación y servidor de Nginx .

SUSCRÍBETE A NUESTRO BOLETÍN 
No te pierdas de nuestro contenido ni de ninguna de nuestras guías para que puedas avanzar en los juegos que más te gustan.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Scroll al inicio