Cómo activar la compresión Brotli en Nginx en CentOS
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 datos utilizando una combinación de una variante moderna del algoritmo LZ77, codificación Huffman y modelado contextual de2º orden, con una relación de compresión comparable a los mejores métodos de compresión de propósito general disponibles actualmente. 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 existe un módulo de terceros desarrollado por Google llamado ngx_brotli que puedes utilizar para añadir soporte a Nginx.
Este tutorial te mostrará cómo añadir soporte Brotli al servidor web Nginx en un servidor CentOS 8.
NOTA: Esta guía utilizará «johndoe"
como usuario de ejemplo y «example.com
«como dominio de ejemplo. Sustitúyelos según tus nombres.
Requisitos
- Servidor CentOS 8
- Nginx versión 1.11.5 o superior
- Nombre de dominio con registros
A
/AAAA
configurados - Certificado TLS
Pasos iniciales
Comprueba tu versión de CentOS:
cat /etc/centos-release # CentOS Linux release 8.0.1905 (Core)
Configura la zona horaria:
timedatectl list-timezones sudo timedatectl set-timezone 'Region/City'
Actualiza los paquetes de tu sistema operativo (software). Este es un primer paso importante porque garantiza que dispones de las últimas actualizaciones y correcciones de seguridad para los paquetes de software predeterminados de tu sistema operativo:
sudo dnf update -y
Instala algunos paquetes esenciales que son necesarios para la administración básica del sistema operativo CentOS:
sudo dnf install -y curl wget vim git unzip socat bash-completion epel-release socat && sudo dnf groupinstall "Development Tools"
Paso 1 – Instala Acme.sh y obtén 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.6
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
Tendrás que descargar e instalar la última versión de Nginx desde el repositorio oficial de Nginx:
Instala los requisitos previos:
sudo yum install yum-utils
Para configurar el repositorio yum, crea el archivo llamado /etc/yum.repos.d/nginx.repo
con el siguiente contenido:
[nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true [nginx-mainline] name=nginx mainline repo baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/ gpgcheck=1 enabled=0 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true
Por defecto, se utiliza el repositorio de paquetes estables de nginx. Necesitamos utilizar los paquetes mainline de nginx. Ejecuta el siguiente comando para utilizar la fuente mainline:
sudo yum-config-manager --enable nginx-mainline
Para instalar nginx, ejecuta el siguiente comando:
sudo yum install -y nginx
Comprueba la versión de Nginx:
sudo nginx -v # nginx version: nginx/1.17.8
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
Tras instalar Nginx, necesitamos compilar el módulo Brotli (ngx_brotli
) como 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 compilar el software Nginx completo. En los próximos pasos, compilaremos el módulo Brotli como dinámico sin compilar el Nginx completo.
Descarga la última versión del código fuente principal de Nginx y extráelo:
wget https://nginx.org/download/nginx-1.17.8.tar.gz && tar zxvf nginx-1.17.8.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 instalaste Nginx 1.17.8 desde el repositorio oficial de Nginx, entonces debes descargar la misma versión del código fuente, 1.17.8 en este caso.
Eliminar nginx-1.17.8.tar.gz:
rm nginx-1.17.8.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.8
Descarga las bibliotecas necesarias:
sudo dnf install -y pcre pcre-devel zlib zlib-devel openssl openssl-devel
Compila el ngx_brotli
como módulo dinámico y cópialo en el directorio estándar para módulos Nginx, /etc/nginx/modules:
./configure --with-compat --add-dynamic-module=../ngx_brotli make modules sudo cp objs/*.so /etc/nginx/modules
Lista 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 en 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 dos directivas siguientes 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 red de las herramientas de desarrollador. Verás Content-Encoding: br
en las cabeceras de respuesta. Ese es el indicador de que la compresión Brotli está funcionando.
Ya está. Has activado la compresión Brotli en tu sistema CentOS 8.