Cómo habilitar soporte para HTTP/2 en Nginx

En este artículo voy a explicar cómo habilitar el soporte para el protocolo HTTP versión 2 en Nginx. HTTP/2 es la nueva versión del protocolo HTTP que utilizamos a diario para navegar páginas y sitios Web. Está basado en el protocolo experimental SPDY (desarrollado originalmente por Google) y se trata de la primera actualización mayor de la versión en casi dos décadas (HTTP/1.1 fue lanzado en 1999).

Las meta de desarrollo de esta nueva versión fue reducir la latencia, para mejorar la velocidad de carga de páginas en los navegadores. Para ello, se agregó compresión en los headers HTTP (a fin de reducir el tamaño de los mismos); un mecanismo de push para que los servidores puedan enviar datos a los navegadores de manera asincrónica (sin necesidad de un request); pipeline de solicitudes (para mejorar el ancho de banda) y multiplexado de solicitudes a través de una misma conexión TCP (para reducir la sobrecarga del mismo); entre otros. A su vez, se agregó un mecanismo de negociación para que los clientes puedan escoger entre HTTP/1.1, HTTP/2 u otro.

Todo esto, manteniendo compatibilidad con la versión 1.1. HTTP/2 mantiene la sintaxis de alto nivel de HTTP/1.1 casi intacta, al igual que los códigos de estado, cabeceras, etc. Lo que cambia (mejora) es la forma en que los datos e información son transferidos.







A continuación, se explica cómo compilar e instalar Nginx desde sus fuentes, con soporte para SSL/TLS y HTTP/2, en un sistema Debian 7 "Wheezy".

Reinstalar Nginx con soporte para HTTP/2

Dado que el servidor Nginx en cuestión está compilado desde sus fuentes (no instalado desde paquete con APT), será necesario recompilarlo. Al mismo tiempo se aprovecha la oportunidad para instalar la última versión estable disponible en el sitio Web oficial de Nginx.

Descargar Nginx 1.11.10:

# wget https://nginx.org/download/nginx-1.11.10.tar.gz

Extraer y cambiar al directorio fuente:

# tar xzf nginx-1.11.10.tar.gz # cd nginx-1.11.10

Configurar Nginx con soporte para SSL y HTTP/2:

# ./configure --with-http_ssl_module --with-http_v2_module

Compilar:

# make

Instalar la nueva versión:

# service nginx stop # make install # service nginx start

Notar que es necesario detener el servicio antes de instalar y reiniciarlo luego. Los archivos de configuración, certificados, logs, etc. no se pierden.

Verificar la nueva versión instalada:

root@linuxito:~/nginx-1.11.10# nginx -v nginx version: nginx/1.11.10

Configurar HTTP/2

Abrir el archivo de configuración del servidor Nginx con un editor de texto:

# nano /usr/local/nginx/conf/nginx.conf

Para habilitar el soporte para el protocolo HTTP/2 sólo basta con agregar la palabra clave "http2" al final de la línea listen . Por ejemplo, cambiar:

# HTTPS Server server { listen 443 ssl;

Por:

# HTTPS Server server { listen 443 ssl http2;

Guardar los cambios y reiniciar Nginx:

# service nginx restart

Al habilitar soporte para HTTP/2, no significa que se dejará de soportar HTTP/1.1, sólo significa que los navegadores que soporten HTTP/2 harán uso del mismo. Por otro lado HTTP/2 es compatible hacia atrás con HTTP/1.1.

Verificación

Para verificar el funcionamiento de HTTP/2 en nuestro servidor, es posible utilizar la herramienta curl con la opción --http2 .

También es posible recurrir a herramientas online (si nuestro navegador o el proxy en nuestra red no soportan HTTP/2):

Se debe tener en cuenta que, para aceptar conexiones HTTP/2 sobre TLS, se requiere contar con la extensión ALPN (Application-Layer Protocol Negotiation) de TLS, la cual está disponible sólo desde OpenSSL versión 1.0.2. Utilizar la extensión NPN (Next Protocol Negotiation) para este propósito (disponible desde OpenSSL versión 1.0.1) puede traer varios dolores de cabeza, pues recientemente el navegador Google Chrome ha deshabilitado el uso de NPN como un cambio en su política (decisiones unilaterales que toma Google sin preguntar a nadie, y que terminan rompiendo muchas cosas).

Para habilitar ALPN es necesario actualizar a OpenSSL 1.0.2. Si no está disponible desde paquete, será necesario compilar Nginx con una versión de OpenSSL privada, compilada desde sus fuentes. Tener en cuenta que si se utiliza HTTP/2 sin ALPN, muchos clientes dejarán de funcionar (por eso no lo estoy utilizando actualmente en este sitio).

¿Querés saber si tu navegador soporta HTTP/2? Desde este enlace se puede acceder a una demo de Akamai que muestra el impacto al utilizar HTTP/2 en tu navegador.

Además sirve para saber si tu navegador soporta HTTP/2:

Referencias

RFC 7540 - Hypertext Transfer Protocol Version 2 (HTTP/2)

Module ngx_http_v2_module

HTTP/2 - Wikipedia

HTTP/2 Server Push - Wikipedia

How To Set Up Nginx with HTTP/2 Support on Ubuntu 16.04



Tal vez pueda interesarte

