Knowledgebase

Aveti intrebari? Sunteti in locul potrivit!

Cum activati suportul Brotli pentru Nginx pe Ubuntu 18.04

Brotli este un algoritm de compresie open source, dezvoltat de Google ca alterntiva pentru Gzip. Zoplfli si Deflate. Studiul de caz Google a demonstrat  o rata de compresie cu 26% mai mica fata e metodele curente cu un usage mai mic la CPU.

Nginx nu dispune de suport oficial Brotli dar exista un modul suplimentar numit ngx_brotli cu ajutorul caruia puteti adauga acest tip de compresie pentru Nginx.

Verificati versiunea Ubuntu:

lsb_release -ds
# Ubuntu 18.04 LTS

Adaugati un utilizator  non-root cu acces  sudo si autentificati-va cu acel utilizator:

adduser johndoe --gecos "John Doe"
usermod -aG sudo johndoe
su - johndoe

NOTA: inlocuiti johndoe cu username-ul dorit

Actualizati sistemul.

sudo apt update && sudo apt upgrade -y

Setati timezone-ul.

sudo dpkg-reconfigure tzdata

Instalati tool-urile  si pachetele necesare.

sudo apt install -y build-essential git apt-transport-https socat

Primul pas – Instalati Acme.sh si obtineti un certificat TLS  Let’s Encrypt

Brotli  solicita folosirea protocolului  HTTPS. In acest caz utilizam Let’s Encrypt.

Downloadati si instalati 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

Verificati versiunea

acme.sh --version
# v2.8.0

Obtineti certificatele  RSA si ECDSA pentru exemplu.com.

# RSA 2048
sudo /etc/letsencrypt/acme.sh --issue --standalone --home /etc/letsencrypt -d exemplu.com --accountemail [email protected] --ocsp-must-staple --keylength 2048

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

Dupa ce executati comenzile de mai sus, certificatele si cheile pot fi identificate in urmatoarele locatii :

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

Pasul 2 – Instalati Nginx din repository-ul oficial Nginx

Downloadati si instalati  Nginx din repo-ul oficial 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/ubuntu/ `lsb_release -sc` nginx ndeb-src https://nginx.org/packages/mainline/ubuntu/ `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

Verificati versiunea

sudo nginx -v
# nginx version: nginx/1.15.2

Activati si porniti Nginx

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

Pasul  3 – Downloadati si compilati codul sursa  Brotli

Dupa ce ati instalat  Nginx,  este necesar sa construim modulul Brotli (ngx_brotli) ca un modul dinamic Nginx. Incepand cu versiunea  1.11.5 in Nginx este posibil sa compilam module idnfivuale dinamic fara a fin necesara compilarea completa a software-ului Nginx. In urmatorii pasi va prezentam modul prin care putem construi modulul Brotli dinamic fara a fi necesara compilarea completa Nginx

Downloadati ultima versiunea  Nginx si extrageti codul sursa .

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

NOTA: este foarte important ca versiunile si pachetele Nginx sa aiba aceeasi versiun.

Eliminati nginx-1.15.2.tar.gz.

rm nginx-1.15.2.tar.gz

Clonati ngx_brotli din GitHub.

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

Navigati in directorul codului sursa  Nginx.

cd ~/nginx-1.15.2

Downloadati librariile necesare.

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

Compilati ngx_brotli ca un modul dinamic si copiati in directorul standard al modulelor Nginx, /etc/nginx/modules.

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

Listati fisierele din/etc/nginx/modules si puteti observa fisierelengx_http_brotli_filter_module.so si ngx_http_brotli_static_module.so.

ls /etc/nginx/modules

Setati permisunile la 644 pentru toate fisierele .so .

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

Pasul 4 – Configurarea Nginx

Suntem pregatiti sa configuram suportul Brotli  in Nginx.

Executati comanda sudo vim /etc/nginx/nginx.conf  si adaugati cele 2 directive in prima parte a fisiserului pentru incarcarea modulelor Brotli.

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

Testati configurarea

sudo nginx -t

Creati un director root pentru  exemplu.com adaugati index.html si adaugati continut in fisier.

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

Creati un  virtual host pentru exemplu.com.

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

Populati fisierul cu urmatoare configuratie:

server {
  listen 80;
  server_name exemplu.com; # inlocuiti cu domeniul dorit
  return 301 https://$server_name$request_uri;
}

server {    
  listen 443 ssl http2;
  server_name exemplu.com; # inlocuiti cu domeniul dorit

  root /var/www/exemplu.com; # inlocuiti cu document root-ul dvs.

  # RSA
  ssl_certificate /etc/letsencrypt/examplu.com/fullchain.cer;
  ssl_certificate_key /etc/letsencrypt/examplu.com/examplu.com.key;
  # ECDSA
  ssl_certificate /etc/letsencrypt/exemplu.com_ecc/fullchain.cer;
  ssl_certificate_key /etc/letsencrypt/exemplu.com_ecc/exemplu.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;
}

Testati cofigurarea

sudo nginx -t

Reincarcati Nginx.

sudo systemctl reload nginx.service

Accesati site-ul dvs. intr-un web browser apoi din tab-ul network din developer tool . Observati response header-ul Content-Encoding: br. Acest lucru indica activarea si functionarea corecta a compresiei Brotli.