Instalando NGINX con soporte de compresión Brotli
No puedo disimular mi emoción hoy al hablaros de uno de los paquetes de software que más despiertan mi admiración desde que lo conozco y utilizo, NGiNX. Atrás quedaron proyectos como Lighttpd o Cherokee Web Server, utilizados como sustitutos de Apache en proyectos donde primaba el mínimo consumo de recursos y el máximo rendimiento.
NGiNX, pronunciado ‘enllin-ex’, es un servidor web y proxy inverso ligero y multiplataforma de gran desempeño que también puede utilizarse como proxy de protocolos de correo electrónico (IMAP/POP3). Creado por el ruso Igor Sysoev en 2004, actualmente son infinidad de sitios conocidos quienes lo utilizan, Netflix o Github entre ellos.
Recientemente NGINX+, el producto comercial derivado de este proyecto Open Source con licencia BSD, ha sido adquirido por una de las marcas de más renombre en el mundo del networking y aplicaciones web, F5 Networks. Esta marca es mundialmente famosa por sus soluciones de balanceo de carga BIG-IP y también, por qué no decirlo, por el coste de sus ‘appliances’.
Dejando atrás un poco las marcas y productos, hoy voy a hablaros sobre cómo integrar el algoritmo de compresión Brotli, creado por Google, dentro de NGiNX de forma fácil y rápida. Pero antes, hablemos de Brotli.
Brotli es un algoritmo de compresión de datos que ofrece velocidades similares o incluso menores que *gzip* pero con una densidad de compresión mucho mayor. Y es especialmente reseñable esta diferencia cuando se trata de texto. Un documento javascript o css es entre un 15% y un 20% más pequeño utilizando Brotli que gzip. Más información acerca de las bondades de este algoritmo aquí, aquí y aquí. Y si tienes mucho tiempo libre e inquietudes variopintas como yo, puedes encontrar aquí las especificaciones del formato y su repositorio en Github.
Bueno, manos a la obra. Partimos de una máquina Debian 9 versión 64bits en la que instalaremos las dependencias necesarias para poder descargar y compilar el proyecto nginx-ee, un conjunto de scripts que nos automatizará la tarea de compilar el servidor web NGiNX con soporte Brotli y algún otro módulo que nos será de gran utilidad.
Instalaremos git para descargar el repositorio del proyecto:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
gtk@nginx:~$ sudo apt install git Leyendo lista de paquetes... Hecho Creando árbol de dependencias Leyendo la información de estado... Hecho Se instalarán los siguientes paquetes adicionales: git-man liberror-perl patch rsync Paquetes sugeridos: git-daemon-run | git-daemon-sysvinit git-doc git-el git-email git-gui gitk gitweb git-arch git-cvs git-mediawiki git-svn ed diffutils-doc Se instalarán los siguientes paquetes NUEVOS: git git-man liberror-perl patch rsync 0 actualizados, 5 nuevos se instalarán, 0 para eliminar y 0 no actualizados. Se necesita descargar 6.131 kB de archivos. Se utilizarán 32,0 MB de espacio de disco adicional después de esta operación. ¿Desea continuar? [S/n] |
Descargamos desde el repositorio del proyecto:
1 2 3 4 5 6 7 8 |
gtk@nginx:~$ git clone https://github.com/VirtuBox/nginx-ee Cloning into 'nginx-ee'... remote: Enumerating objects: 62, done. remote: Counting objects: 100% (62/62), done. remote: Compressing objects: 100% (59/59), done. remote: Total 1363 (delta 32), reused 26 (delta 2), pack-reused 1301 Receiving objects: 100% (1363/1363), 464.50 KiB | 0 bytes/s, done. Resolving deltas: 100% (739/739), done. |
Lanzamos la compilación en modo interactivo. Nos permitirá seleccionar qué modulos incluir dentro de NGiNX y qué versión usaremos del servidor web:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
gtk@nginx:~/nginx-ee$ sudo ./nginx-build.sh --stable --pagespeed --rtmp --openssl-system Welcome to the nginx-ee bash script v3.6.2 ################################## Compilation summary ################################## Detected OS : Debian GNU/Linux 9.9 (stretch) Detected Arch : x86_64 - Nginx release : 1.16.0 - OPENSSL : from system - Dynamic modules NO - Pagespeed : stable - Naxsi : NO - RTMP : YES Installing dependencies [OK] Setting Up Nginx configurations [OK] Installing FFMPEG for RMTP module [OK] Downloading additionals modules [OK] Downloading zlib [OK] Downloading pcre [OK] Downloading brotli [OK] Downloading pagespeed [OK] Downloading nginx [OK] Applying nginx patches [OK] Configuring nginx [OK] Compiling nginx [OK] Updating Nginx manual [OK] Performing final steps [OK] Checking nginx configuration [OK] Nginx-ee was compiled successfully ! Installation log : /tmp/nginx-ee.log |
Comprobamos que NGiNX está corriendo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
gtk@nginx:~/nginx-ee$ sudo systemctl status nginx ● nginx.service - The NGINX HTTP and reverse proxy server Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2019-06-03 01:30:17 CEST; 2min 24s ago Process: 32493 ExecStop=/bin/kill -s QUIT $MAINPID (code=exited, status=0/SUCCESS) Process: 32501 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS) Process: 32500 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS) Main PID: 32505 (nginx) Tasks: 35 (limit: 4915) CGroup: /system.slice/nginx.service ├─32505 nginx: master process /usr/sbin/nginx ├─32506 nginx: worker process └─32507 nginx: cache manager process jun 03 01:30:17 nginx systemd[1]: Starting The NGINX HTTP and reverse proxy server... jun 03 01:30:17 nginx nginx[32500]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok jun 03 01:30:17 nginx nginx[32500]: nginx: configuration file /etc/nginx/nginx.conf test is successful jun 03 01:30:17 nginx systemd[1]: nginx.service: Failed to read PID from file /run/nginx.pid: Invalid argument jun 03 01:30:17 nginx systemd[1]: Started The NGINX HTTP and reverse proxy server. |
Y que está compilado con el soporte de Brotli, Pagespeed o RMTP, entre otros módulos:
1 2 3 4 5 6 |
gtk@nginx:~/nginx-ee$ sudo nginx -V nginx version: nginx/1.16.0 (VirtuBox Nginx-ee) built by gcc 6.3.0 20170516 (Debian 6.3.0-18+deb9u1) built with OpenSSL 1.1.0j 20 Nov 2018 TLS SNI support enabled configure arguments: --with-cc-opt=' -Wno-error=date-time' --with-ld-opt= --prefix=/usr/share --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/var/run/nginx.pid --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --modules-path=/usr/share/nginx/modules --build='VirtuBox Nginx-ee' --with-file-aio --with-threads --with-http_v2_hpack_enc --with-http_v2_module --with-http_ssl_module --with-pcre-jit --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_addition_module --with-http_gzip_static_module --with-http_gunzip_module --with-http_mp4_module --with-http_sub_module --add-module=../ngx_http_substitutions_filter_module --add-module=../srcache-nginx-module --add-module=../ngx_http_redis --add-module=../redis2-nginx-module --add-module=../memc-nginx-module --add-module=../ngx_devel_kit --add-module=../set-misc-nginx-module --add-module=../ngx_http_auth_pam_module --add-module=../nginx-module-vts --add-module=../ipscrubtmp/ipscrub --add-module=../incubator-pagespeed-ngx-latest-stable --add-module=../nginx-rtmp-module --add-module=../echo-nginx-module --add-module=../headers-more-nginx-module --add-module=../ngx_cache_purge --add-module=../ngx_brotli --with-zlib=../zlib-cf --with-openssl-opt=enable-tls1_3 --sbin-path=/usr/sbin/nginx |
Aquí podemos ver la captura de los headers de una petición servida con esta solución, los resaltados incluyen la codificación del contenido ‘br’ y el servidor ‘nginx’ que la sirve:
Deja una respuesta