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: