El módulo HTTP/2 de NGINX

NGINX | 19 de enero de 2016

Esta entrada de blog es una adaptación de una presentación de Valentin V. Bartenev en nginx.conf 2015, celebrada en San Francisco en septiembre.

Índice

Hace un par de días, lanzamos el módulo HTTP/2 de NGINX. En esta charla, voy a ofreceros una breve descripción general del nuevo módulo.

0:20 Descripción general del protocolo

HTTP/2 no sustituye a HTTP/1.x ni es una solución milagrosa; es otra capa de transporte para HTTP/1, con sus ventajas e inconvenientes, y es básicamente lo mismo que SPDY

Antes que nada, quiero desmentir algunos mitos en torno al nuevo protocolo.

Mucha gente considera HTTP/2 un sucesor moderno y superior de HTTP/1. No comparto esta opinión, y este es el motivo. En realidad, HTTP/2 no es más que otra capa de transporte para HTTP/1, lo cual no está mal, ya que permite utilizar HTTP/2 sin tener que modificar la aplicación: funciona con las mismas cabeceras. Basta con activar HTTP/2 en NGINX y NGINX se encargará de gestionar por ti todos los aspectos relacionados con el protocolo.

Pero HTTP/2 no es mágico. Tiene sus ventajas y sus inconvenientes. Hay casos de uso en los que funciona bien y otros escenarios en los que funciona mal.

1:40 Características principales de HTTP/2

Las características principales de HTTP/2 son su naturaleza binaria, la multiplexación, la compresión de cabeceras HPACK y un complejo sistema de priorización

Puedes considerar HTTP/2 como una nueva versión de SPDY, ya que se basó en este y es un protocolo muy similar. SPDY es un protocolo desarrollado por Google hace un par de años y diseñado para acelerar la entrega de contenido web.

NGINX ya es compatible con SPDY desde hace dos años, por lo que puede comprobar las ventajas de HTTP/2 utilizando el módulo SPDY. Algunos dirían que HTTP/2 no es más que una versión perfeccionada de SPDY 3.1.

Si no está familiarizado con SPDY, voy a repasar algunos puntos clave. Estos puntos también son válidos para HTTP/2, ya que, en esencia, se trata del mismo protocolo, aunque con algunas diferencias en los detalles.

El primer punto clave es que el protocolo en sí es binario. Me gustan los protocolos binarios: son más fáciles de programar y los buenos protocolos binarios ofrecen algunas ventajas de rendimiento. Sin embargo, también entiendo los inconvenientes de este enfoque.

3:08 HTTP/2 por dentro – Binario

Diapositiva que ilustra cómo la carga útil de una solicitud HTTP/2 está en formato binario, mientras que la de una solicitud HTTP/1.1 es texto legible para las personas

Aquí tenemos una solicitud HTTP/2. Tiene muy buena pinta y, como podéis ver, es muy fácil de depurar. No, es broma. Es difícil de depurar. Y esa es una de las desventajas de los protocolos binarios.

Puede que tengas que usar una herramienta para descodificar la solicitud o… bueno, a veces puede que tengas que depurar manualmente los datos binarios porque la herramienta puede fallar o no mostrarte todos los detalles ocultos en los bits.

Afortunadamente, la mayoría de las veces basta con habilitar HTTP/2 en NGINX y olvidarse de su naturaleza binaria. Y, por suerte, la mayoría de las solicitudes serán procesadas por máquinas, que son mucho mejores que los humanos a la hora de interpretar protocolos binarios.

4:26 HTTP/2 por dentro – Multiplexación

HTTP/2 multiplexa las solicitudes y respuestas a través de una única conexión

El siguiente aspecto clave de HTTP/2 es la multiplexación. En lugar de enviar y recibir solicitudes y respuestas como flujos de datos independientes a través de varias conexiones, HTTP/2 los multiplexa en un único flujo de bytes o de datos. Divide los datos de las distintas solicitudes y respuestas en fragmentos, cada uno con su propio identificador y un campo de tamaño, lo que permite al extremo determinar qué datos corresponden a cada solicitud.

La desventaja en este caso es que, como cada fragmento de datos tiene su propio identificador y sus propios campos, además de los datos propiamente dichos se transfieren también ciertos metadatos. Por tanto, existe cierta sobrecarga. En consecuencia, si solo se dispone de un flujo de datos, por ejemplo al ver una película, HTTP/2 no es un protocolo adecuado, ya que lo único que aportará será una sobrecarga adicional.

¿Cuáles son las ventajas de la multiplexación? La principal ventaja es que, al utilizar una única conexión, se ahorra todo el tiempo que se dedicaría con HTTP/1.x al proceso de negociación necesario para crear una nueva solicitud.

Estos retrasos resultan especialmente problemáticos cuando se utiliza TLS. Por eso, actualmente la mayoría de los clientes solo admiten HTTP/2 sobre TLS. Por lo que sé, no hay planes para admitir HTTP/2 sobre TCP sin cifrar, ya que no ofrece grandes ventajas. Esto se debe a que los procesos de negociación de TCP no son tan costosos como los de TLS, por lo que evitar varias conexiones no supone un gran ahorro.

7:09 Características principales de HTTP/2 – Compresión de cabeceras

HTTP/2 utiliza el algoritmo HPACK, diseñado específicamente para la compresión de cabeceras

El siguiente aspecto clave de HTTP/2 es la compresión de cabeceras. Si tienes cookies muy grandes, esto puede ahorrarte cientos de bytes por solicitud o respuesta, pero, por lo general, la mayoría de las veces no obtendrás grandes ventajas de la compresión de cabeceras. Esto se debe a que, aunque pienses en solicitudes independientes, al final tendrás que lidiar con la capa de paquetes de la red, y no importa demasiado si envías cien bytes o ciento cincuenta, ya que, en última instancia, seguirá siendo un solo paquete.

El inconveniente de la compresión de cabeceras de HTTP/2 es que mantiene un estado [Editor – En las tablas utilizadas para almacenar la información de compresión y descompresión]. Por tanto, los servidores y los clientes deben mantener algún tipo de estado para cada conexión, lo que consume mucha más memoria que mantener el estado de las conexiones HTTP/1. En consecuencia, cada conexión HTTP/2 utilizará mucha más memoria.

8:40 Características principales de HTTP/2 – Priorización

El mecanismo de priorización de HTTP/2 resuelve el problema de tener que enviar primero los datos más importantes cuando solo se dispone de un canal

El último aspecto clave de HTTP/2 es su mecanismo de priorización. Este resuelve el problema que introdujo la multiplexación. Cuando solo se dispone de una conexión, solo hay un canal, por lo que se debe decidir cuidadosamente qué respuesta se enviará a continuación por dicho canal.

La priorización es opcional en HTTP/2, pero sin ella no se obtienen grandes mejoras de rendimiento. El módulo HTTP/2 de NGINX es totalmente compatible con la priorización, tanto la basada en pesos como la basada en dependencias. Por lo que hemos visto hasta ahora, contamos actualmente con la implementación de HTTP/2 más rápida. Estos son los aspectos clave de HTTP/2.

10:06 Historia de HTTP/2

Diapositiva que resume el historial de compatibilidad con SPDY y HTTP/2 en las versiones de NGINX

Esta es una diapositiva sencilla que repasa la historia de HTTP/2. Es bastante clara. Veamos ahora cómo funciona HTTP/2 en la práctica.

10:16 Página de prueba

Página web con una combinación típica de tipos de recursos, utilizada para probar el rendimiento del módulo HTTP/2 de NGINX

Para entender cómo funciona HTTP/2 en distintas condiciones de red, he realizado algunas pruebas de rendimiento en una página web típica. Se trata simplemente de una página HTTP/2 que encontré en Github. Se puede ver cuántos recursos contiene y qué tamaño tiene cada uno. Creo que es bastante representativa de un sitio web típico.

10:52 Entorno de pruebas

Diapositiva que describe la configuración de hardware, software y NGINX utilizada para probar el módulo HTTP/2 de NGINX

Este es mi entorno de pruebas, por si quieres reproducir la prueba.

11:02 Carga del DOM

Gráfico de barras que compara los tiempos de descarga de HTTP/1, HTTP/2 y HTTPS en redes con distintas latencias

Y este es el resultado que obtuve. Como puede verse, he simulado distintas latencias de red en el eje X, expresadas como tiempos de ida y vuelta (RTT) en milisegundos, y después he medido el tiempo de descarga en el eje Y, también en milisegundos. Esta prueba mide el tiempo de carga de la página hasta que todos sus recursos se han cargado por completo.

En el gráfico se observa una tendencia clara: con latencias bajas, no hay diferencias significativas entre HTTP, HTTPS y HTTP/2. Con latencias más altas, se puede ver que HTTP/1.x sin cifrar es la opción más rápida. HTTP/2 ocupa el segundo lugar y HTTPS es la opción más lenta.

11:48 Primer renderizado

Gráfico de barras que compara el tiempo necesario para mostrar el primer elemento de una página web con HTTP/1, HTTP/2 y HTTPS en redes con distintas latencias

¿Y qué hay del tiempo hasta el «primer renderizado»? En muchos casos, es la métrica más importante desde la perspectiva del usuario, porque es el momento en el que realmente ve algo en la pantalla. A menudo, el tiempo que tarda la página en cargarse por completo no es tan importante como el tiempo que tarda el usuario en empezar a ver algo.

Aquí observamos la misma tendencia, pero lo interesante de nuestra prueba es que, para latencias situadas en la zona media del intervalo, de 30 ms a 250 ms, HTTP/2 es un poco más rápido que HTTP convencional, aunque la diferencia es muy pequeña.

Configuración de las 12:45

Diapositiva que describe los requisitos y el argumento de comando para compilar un binario de NGINX con el módulo HTTP/2, además de la directiva para activar HTTP/2 en la configuración

Bien, esos han sido nuestros benchmarks; ahora hablemos de cómo configurar HTTP/2 y NGINX.

En realidad, es muy sencillo. Lo único que hay que hacer es añadir el parámetro http2 a la directiva listen. Probablemente, el paso más complicado sea obtener la versión más reciente de OpenSSL, ya que HTTP/2 requiere la extensión ALPN [negociación de protocolos en la capa de aplicación], y esta extensión solo es compatible con OpenSSL 1.0.2.

También hemos implementado NPN [Negociación del siguiente protocolo] para HTTP/2, que actualmente funciona con la mayoría de los clientes, pero estos dejarán de admitir NPN cuando SPDY quede obsoleto a principios de 2016. Esto significa que, por ahora, puedes usar HTTP/2 con la versión de OpenSSL incluida en muchas distribuciones de Linux, pero debes tener en cuenta que dejará de funcionar en un futuro próximo.

Y eso es todo sobre la configuración de NGINX para HTTP/2. Con esto concluye mi presentación. Gracias.

[Documentación de referencia del módulo HTTP/2]

Preguntas y respuestas

P: ¿También será compatible con HTTP/2 en el lado del servidor de origen o solo en el lado del cliente?

R: Por el momento, solo admitimos HTTP/2 en el lado del cliente. No se puede configurar HTTP/2 con proxy_pass. [Nota del editor: En la versión original de esta publicación, esta frase se transcribió incorrectamente como «Se puede configurar HTTP/2 con proxy_pass». Lamentamos cualquier confusión que esto haya podido causar.]

Pero ¿qué sentido tiene HTTP/2 en el backend? Como se puede ver en las pruebas de rendimiento, HTTP/2 no aporta grandes ventajas en redes de baja latencia, como las conexiones con servidores upstream.

Además, en NGINX está disponible el módulo keepalive, que permite configurar una caché de conexiones persistentes. La principal ventaja de HTTP/2 en cuanto a rendimiento es que elimina los intercambios de conexión adicionales, pero si ya los evita mediante una caché de conexiones persistentes, no necesita HTTP/2 en el lado del servidor de origen.

Más recursos sobre HTTP/2

¿Está listo para probar HTTP/2 con NGINX Plus en su entorno? Inicie hoy mismo su prueba gratuita de 30 días o póngase en contacto con nosotros para hablar sobre sus casos de uso.


Compartir
Etiquetas: F5 NGINX, 2016, Tech

Artículos relacionados del blog

Únete a F5 NGINX en AppWorld 2024
NGINX | 04/01/2024

Únete a F5 NGINX en AppWorld 2024

Descubre las numerosas razones para asistir al evento insignia de F5, que incluirá un emocionante anuncio sobre la cartera de productos NGINX.

Rotación de certificados SSL/TLS sin reinicios en NGINX Open Source
NGINX | 26/09/2023

Rotación de certificados SSL/TLS sin reinicios en NGINX Open Source

La función de diccionario compartido permite configurar NGINX sin necesidad de reiniciarlo al renovar los certificados SSL/TLS.

Exposición de APIs en Kubernetes
NGINX | 10/03/2022

Exposición de APIs en Kubernetes

La unidad 2 de Microservices March 2022 se centra en cómo exponer tus API en Kubernetes. Aquí tienes enlaces a los recursos que necesitas: la retransmisión en directo del 14 de marzo, artículos de blog y otros recursos de preparación, y el laboratorio práctico «Protege las API de Kubernetes mediante la limitación de solicitudes».

NGINX Sprint 2.0: visión clara, código renovado y nuevos compromisos con el código abierto
NGINX | 23/08/2021

NGINX Sprint 2.0: visión clara, código renovado y nuevos compromisos con el código abierto

Hoy, en NGINX Sprint 2.0, anunciamos cómo respaldaremos nuestra visión del futuro de las aplicaciones modernas con una mayor presencia en la comunidad de código abierto, incluida la participación en el proyecto comunitario Kubernetes, nuevos proyectos de software de código abierto y la arquitectura de referencia para aplicaciones modernas.

Presentamos NGINX Plus R22
NGINX | 09/06/2020

Presentamos NGINX Plus R22

NGINX Plus R22 incorpora nuevas funcionalidades, como la compatibilidad con OCSP para verificar la revocación de certificados en TLS mutuo, el uso de varios proveedores de identidad OIDC en una configuración, el seguimiento en tiempo real de la limitación de solicitudes y conexiones en el panel de NGINX Plus y mejoras en NGINX JavaScript.

Presentamos NGINX Plus R17
NGINX | 11/12/2018

Presentamos NGINX Plus R17

NGINX Plus R17 incorpora compatibilidad con la limitación de velocidad en dos fases y con TLS 1.3, la versión más reciente del protocolo Transport Layer Security. La configuración de OpenID Connect es más sencilla y NGINX ModSecurity WAF es el doble de rápido que antes. También se ha actualizado el módulo JavaScript de NGINX.