guía

NGINX turbo con HTTP2 + ALPN + Brotli.

Hoy te mostramos como lograr que NGINX soporte HTTP/2, ALPN y Brotli.

Imágen de portada

Ya casi estamos terminando 2018 y ofrecer un sitio web con SSL (HTTPS para los que no están en tema) debería ser la opción de facto. En nuestros servidores ofrecemos certificados SSL de Let's Encrypt mediante el web server NGINX. Sin embargo, la configuración por defecto en CentOS (la distro Linux que utilizamos) no esta optimizada. Las versiones en los repositorios son antiguas y no están habilitadas las últimas tecnologías. Por eso hoy, compartimos esta guía para que puedas acelerar tu servidor como lo hacemos nosotros. En particular activando HTTP2, ALPN y el algoritmo de compresión Brotli. Nosotros ya contamos con NGINX instalado en la versión 1.11.7, por lo que vamos a actualizarlo a la última posible. Pero primero una breve repaso de lo que vamos a activar.

HTTP/2 y ALPN.

HTTP/2, es la segunda versión mayor del protocolo HTTP desde HTTP1.1 (la que conocemos la mayoría de nosotros). Algunos beneficios y características de HTTP/2:

  • Binario: En contraste a HTTP/1.1, que es textual.
  • Multiplexado: Permite múltiples solicitudes y respuestas en la misma conexión TCP.
  • Extención ALPN: Permite conexiones encriptadas más rápida, ya que el protocolo de aplicación se determina durante la conexión inicial.
  • Compresión de cabeceras: Las cabeceras son comprimidas con un nuevo algoritmo (HPACK).
  • Una conexión: Los clientes solo pueden establecer una conexión.
  • RTT: Se reducen los tiempos de ida y vuelta (Round-trip Time) adicionales haciendo que los sitios se descarguen más rápido sin optimizaciones adicionales.

Compresión Brotli.

El algoritmo Brotli permite una mayor compresión (hasta un 26% más) que los algoritmos Zopfli, Deflate y Gzip y con menor uso de CPU.

Requisitos previos.

Como vamos a instalar NGINX con los módulos extras desde código fuente, vamos a necesitar las herramientas necesarias para compilar el código. De aqui en adelante todos los comandos son ejecutados como el usuario root. En CentOS y RHEL:

yum groupinstall 'Development Tools'

Instalación.

Para poder activar HTTP/2 y ALPN es necesario compilar NGINX con una versión de OpenSSL igual o superior 1.0.2. Nosotros vamos a instalarlo con la ultima versión al día de hoy, la 1.1.1a. Para esto vamos a descargar y descomprimir todo el código en el directorio /usr/local/src/. Por lo tanto:

cd /usr/local/src/
wget https://www.openssl.org/source/openssl-1.1.1a.tar.gz
tar -zxf openssl-1.1.1a.tar.gz

Ahora procedemos a descargar (clonar) el repositorio del modulo Brotli:

git clone https://github.com/google/ngx_brotli.git
cd ngx_brotli
git submodule update --init --recursive

Y por ultimo descargamos la ultima versión de NGINX. ⚠ Aquí hacemos una salvedad: en nuestro caso particular vamos a instalar la versión Mainline, que si bien puede ser menos estable que la Stable, el 20% de ganancia de performance vale el riesgo. Dicho esto continuamos con la descarga:

cd ..
wget https://nginx.org/download/nginx-1.15.7.tar.gz
tar -zxf nginx-1.15.7.tar.gz

Compilación e instalación de NGINX.

Primero vamos a necesitar los switches para compilar NGINX, para esto ejecutamos

nginx -V

Y copiamos todo el texto que comienza desde --prefix=. Luego a ese texto al final le agregamos lo siguiente

--add-module=/usr/local/src/ngx_brotli --with-openssl=/usr/local/src/openssl-1.1.1a/

Luego entramos en el directorio con el código de NGINX descomprimido y ejecutamos configure con todos los switches. En nuestro caso:

cd nginx-1.15.7
./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie' --add-module=/usr/local/src/ngx_brotli --with-openssl=/usr/local/src/openssl-1.1.1a/

Ahora solo compilamos e instalamos

make
make install

Finalmente para activar Brotli, configuramos el archivo /etc/nginx/nginx.conf en la seccion http (puede ser despues de la linea #Compression

brotli              on;
brotli_static       on;
brotli_comp_level   4;
brotli_types        text/plain text/css text/javascript text/js text/xml application/json application/javascript application/x-javascript application/xml application/xml+rss application/x-font-ttf image/svg+xml font/opentype font/woff font/woff2 font/woff3 application/x-font-woff;

Acá van a tener que probar los niveles de brotli_comp_level con valores que van de 1 a 11, ya que puede afectar la performance general. Para aplicar los cambios reiniciamos el servicio de NGINX.

service nginx restart

Pruebas.

Para verificar que todo este funcionando correctamente podemos visitar HTTP/2 y Brotli test.

Resultado de prueba de HTTP/2 y ALPN

Resultado de soporte para Brotli

Portada.

unsplash-logoNathan Van Egmond



Comentarios