Cómo añadir soporte de compresión Brotli a Nginx en Debian 10

Brotli es un algoritmo de compresión sin pérdidas de propósito genérico desarrollado por Google como alternativa a Gzip, Zopfli y Deflate, que comprime los datos utilizando una combinación de una variante moderna del algoritmo LZ77, la codificación Huffman y el modelado de contexto de orden, con una relación de compresión comparable a los mejores métodos de compresión de propósito general disponibles en la actualidad. Su velocidad es similar a la de deflate, pero ofrece una compresión más densa.

Brotli es de código abierto bajo la licencia MIT.

Nginx no tiene soporte oficial pero hay un módulo de terceros desarrollado por Google llamado ngx_brotli que puedes utilizar para añadir soporte a Nginx.

Esta guía te mostrará cómo añadir soporte para Brotli al servidor web Nginx en el sistema Debian 10.

NOTA: Esta guía utilizará«johndoe" como ejemplo de usuario y«example.com«como ejemplo de dominio. Sustitúyelos según tus nombres.

Requisitos

  • Servidor Debian 10 (buster)
  • Versión de Nginx 1.11.5 o superior
  • Nombre de dominio con registros A/AAAA configurados
  • Certificado TLS

Pasos iniciales

Comprueba tu versión de Debian:

lsb_release -ds
# Debian GNU/Linux 10 (buster)

Configura la zona horaria:

sudo dpkg-reconfigure tzdata

Actualiza los paquetes de tu sistema operativo (software). Este es un primer paso esencial porque te asegura que tienes las últimas actualizaciones y correcciones de seguridad de los paquetes de software por defecto de tu sistema operativo:

sudo apt update && sudo apt upgrade -y

Instala algunos paquetes esenciales que son necesarios para la administración básica del sistema operativo Debian:

sudo apt install -y curl wget vim git unzip socat bash-completion apt-transport-https

Paso 1 – Instalar Acme.sh y obtener un certificado TLS de Let’s Encrypt

Brotli requiere que configures y utilices HTTPS. En esta parte, obtendremos un certificado de confianza de Let’s Encrypt.

Descarga e instala Acme.sh:

sudo mkdir /etc/letsencrypt
git clone https://github.com/Neilpang/acme.sh.git
cd acme.sh
sudo ./acme.sh --install --home /etc/letsencrypt --accountemail [email protected]
cd ~
source ~/.bashrc

Comprueba la versión:

acme.sh --version
# v2.8.2

Obtener certificados RSA y ECDSA para example.com:

# RSA 2048
sudo /etc/letsencrypt/acme.sh --issue --standalone --home /etc/letsencrypt -d example.com --accountemail [email protected] --ocsp-must-staple --keylength 2048
# ECDSA/ECC P-256
sudo /etc/letsencrypt/acme.sh --issue --standalone --home /etc/letsencrypt -d example.com --accountemail [email protected] --ocsp-must-staple --keylength ec-256

Después de ejecutar los comandos anteriores, tus certificados y claves estarán en las siguientes ubicaciones:

  • RSA: /etc/letsencrypt/example.com
  • ECC/ECDSA: /etc/letsencrypt/example.com_ecc

Paso 2 – Instalar Nginx desde el repositorio oficial de Nginx

Descarga e instala la última versión de Nginx desde el repositorio oficial de Nginx:

wget https://nginx.org/keys/nginx_signing.key
sudo apt-key add nginx_signing.key
rm nginx_signing.key
sudo -s printf "deb https://nginx.org/packages/mainline/debian/ `lsb_release -sc` nginx \ndeb-src https://nginx.org/packages/mainline/debian/ `lsb_release -sc` nginx \n" >> /etc/apt/sources.list.d/nginx_mainline.list
exit
sudo apt update
sudo apt install -y nginx nginx-module-geoip nginx-module-image-filter nginx-module-njs nginx-module-perl nginx-module-xslt

Comprueba la versión de Nginx:

sudo nginx -v
# nginx version: nginx/1.17.4

Habilita e inicia el servicio Nginx:

sudo systemctl enable nginx.service
sudo systemctl start nginx.service

Paso 3 – Descarga y compila el código fuente de Brotli

Después de instalar Nginx, tenemos que compilar el módulo Brotli (ngx_brotli) como un módulo dinámico de Nginx. A partir de la versión 1.11.5 de Nginx es posible compilar módulos dinámicos individuales sin necesidad de compilar el software completo de Nginx. En los próximos pasos, construiremos el módulo Brotli como dinámico sin compilar el Nginx completo.

Descarga la última versión del código fuente de Nginx principal y extráelo:

wget https://nginx.org/download/nginx-1.17.4.tar.gz && tar zxvf nginx-1.17.4.tar.gz

NOTA: Es muy importante que los números de versión del paquete Nginx y del código fuente de Nginx coincidan. Si has instalado Nginx 1.17.4 desde el repositorio oficial de Nginx, debes descargar la misma versión del código fuente, 1.17.4 en este caso.

Eliminar nginx-1.17.4.tar.gz:

rm nginx-1.17.4.tar.gz

Clona ngx_brotli de GitHub:

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

Navega hasta el directorio del código fuente de Nginx:

cd ~/nginx-1.17.4

Descarga las bibliotecas necesarias:

sudo apt install -y libpcre3 libpcre3-dev zlib1g zlib1g-dev openssl libssl-dev

Compila el ngx_brotli como módulo dinámico y cópialo en el directorio estándar para módulos de Nginx, /etc/nginx/modules:

./configure --with-compat --add-dynamic-module=../ngx_brotli
make modules
sudo cp objs/*.so /etc/nginx/modules

Enumera los archivos en /etc/nginx/modules y verás ngx_http_brotli_filter_module.so y ngx_http_brotli_static_module.so:

ls /etc/nginx/modules

Establece los permisos a 644 para todos los archivos de .so:

sudo chmod 644 /etc/nginx/modules/*.so

Paso 4 – Configurar Nginx

Estamos listos para configurar el soporte de Brotli en Nginx.

Ejecuta sudo vim /etc/nginx/nginx.conf y añade las siguientes dos directivas en la parte superior del archivo para cargar los nuevos módulos de Brotli:

load_module modules/ngx_http_brotli_filter_module.so;
load_module modules/ngx_http_brotli_static_module.so;

Prueba la configuración:

sudo nginx -t

Crea un directorio raíz de documentos para example.com y crea index.html con algún contenido en él:

sudo mkdir -p /var/www/example.com
sudo -s
echo "Hello from example.com" >> /var/www/example.com/index.html
exit

Crea un host virtual para example.com:

sudo vim /etc/nginx/conf.d/example.com.conf

Rellénalo con la siguiente configuración:

server {
  listen 80;
  server_name example.com; # Replace with your domain name
  return 301 https://$server_name$request_uri;
}

server {    
  listen 443 ssl http2;
  server_name example.com; # Replace with your domain name

  root /var/www/example.com; # Replace with your document root

  # RSA
  ssl_certificate /etc/letsencrypt/example.com/fullchain.cer;
  ssl_certificate_key /etc/letsencrypt/example.com/example.com.key;
  # ECDSA
  ssl_certificate /etc/letsencrypt/example.com_ecc/fullchain.cer;
  ssl_certificate_key /etc/letsencrypt/example.com_ecc/example.com.key;

  brotli on;
  brotli_static on;
  brotli_types text/plain text/css text/javascript application/javascript text/xml application/xml image/svg+xml application/json;
}

Prueba la configuración:

sudo nginx -t

Recarga Nginx:

sudo systemctl reload nginx.service

Visita tu sitio en tu navegador web y abre la pestaña de red de las herramientas de desarrollo. Verás Content-Encoding: br en las cabeceras de respuesta. Ese es el indicador de que la compresión Brotli está funcionando.

Soporte de Brotli en Nginx

Codificación del contenido

Eso es todo. Has activado la compresión Brotli en tu sistema Debian 10.

Enlaces

También te podría gustar...