Brotli adalah algoritma kompresi lossless generic-purpose yang dikembangkan oleh Google sebagai alternatif untuk Gzip, Zopfli, dan Deflate yang memampatkan data menggunakan kombinasi varian modern dari algoritma LZ77, Huffman coding, dan 2nd order context modeling, dengan rasio kompresi sebanding dengan metode kompresi general-purpose terbaik yang tersedia saat ini. Kecepatannya hampir sama dengan deflate tetapi menawarkan kompresi yang lebih padat.

Brotli adalah open source dan tersedia di bawah Lisensi MIT.

Nginx tidak memiliki dukungan resmi tetapi ada modul pihak ketiga yang dikembangkan oleh Google bernama ngx_brotli yang dapat Anda manfaatkan untuk menambahkan dukungan ke Nginx.

Tutorial ini akan menunjukkan kepada Anda cara menambahkan dukungan Brotli ke web server Nginx di server CentOS 8.

CATATAN: Panduan ini akan menggunakan “bedoe” sebagai contoh user dan “example.com” sebagai contoh domain. Gantilah sesuai dengan nama Anda.

Persyaratan

  • CentOS 8 server
  • Masuk sebagai root atau user sudo
  • Nginx versi 1.11.5 atau lebih baru
  • Nama domain dengan A/AAAA records sudah terkonfigurasi
  • TLS certificate

Langkah Awal

Periksa versi CentOS

cat /etc/centos-release
# CentOS Linux release 8.0.1905 (Core)

Setup zona waktu

timedatectl list-timezones
sudo timedatectl set-timezone 'Asia/Jakarta'

Perbarui paket sistem operasi Anda (software). Ini adalah langkah pertama yang penting karena memastikan Anda memiliki pembaruan terbaru dan perbaikan keamanan untuk paket perangkat lunak default sistem operasi Anda:

sudo dnf update -y

Instal beberapa paket penting yang diperlukan untuk administrasi dasar sistem operasi CentOS:

sudo dnf install -y curl wget vim git unzip socat bash-completion epel-release socat && sudo dnf groupinstall "Development Tools"

Langkah 1 – Instal Acme.sh dan dapatkan sertifikat TLS dari Let’s Encrypt

Brotli mengharuskan Anda mengatur dan menggunakan HTTPS. Di bagian ini, kita akan mengambil sertifikat terpercaya dari Let’s Encrypt.

Download dan install 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

Periksa versinya:

acme.sh --version
# v2.8.6

Dapatkan sertifikat RSA dan ECDSA untuk 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

Setelah menjalankan perintah di atas, sertifikat dan key Anda akan berada di lokasi berikut:

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

Langkah 2 – Instal Nginx dari repositori resmi Nginx

Anda perlu mengunduh dan menginstal Nginx terbaru dari repo resmi Nginx:

Instal prasyarat:

sudo yum install yum-utils

Untuk mengatur repositori yum, buat file bernama /etc/yum.repos.d/nginx.repo :

sudo nano /etc/yum.repos.d/nginx.repo

kemudian copy dan paste konten berikut :

[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

Secara default, repositori nginx stable yang digunakan. Kita perlu menggunakan paket nginx mainline . Jalankan perintah berikut untuk menggunakan source mainline :

sudo yum-config-manager --enable nginx-mainline

Untuk menginstal nginx, jalankan perintah berikut:

sudo yum install -y nginx

Periksa versi Nginx:

sudo nginx -v
# nginx version: nginx/1.17.8

Aktifkan dan mulai layanan Nginx:

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

Langkah 3 – Download dan Compile Brotli Source Code

Setelah menginstal Nginx, kita perlu build modul Brotli (ngx_brotli) sebagai dynamic module untuk Nginx. Dari Nginx versi 1.11.5 dimungkinkan untuk mengkompilasi dynamic modules individual tanpa compile Nginx secara lengkap. Dalam beberapa langkah berikutnya, kita akan membangun modul Brotli sebagai dinamis tanpa compile Nginx secara lengkap.

Download versi terbaru dari source code Nginx mainline dan ekstrak:

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

CATATAN: Sangat penting bahwa nomor versi dari Nginx package dan Nginx source code cocok. Jika Anda menginstal Nginx versi 1.17.8 dari repositori resmi Nginx, maka Anda harus mengunduh source code dengan versi yang sama, dalam hal ini 1.17.8 .

Hapus file nginx-1.17.8.tar.gz:

rm nginx-1.17.8.tar.gz

Clone ngx_brotli dari GitHub:

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

Masuk ke direktori source code Nginx:

cd ~/nginx-1.17.8

Download libraries yang diperlukan :

sudo dnf install -y pcre pcre-devel zlib zlib-devel openssl openssl-devel

Compile ngx_brotli sebagai dynamic module dan copy ke direktori standar untuk modul Nginx, /etc/nginx/modules:

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

List file dengan perintah ls di /etc/nginx/modules dan Anda akan melihat ngx_http_brotli_filter_module.so dan ngx_http_brotli_static_module.so:

ls /etc/nginx/modules

Set permissions ke 644 untuk semua file dengan ekstensi .so :

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

Langkah 4 – Konfigurasikan Nginx

Kita siap untuk mengonfigurasi dukungan Brotli di Nginx.

buka pengaturan global nginx.conf dan kemudian kita akan menambahkan beberapa pengaturan.

sudo nano /etc/nginx/nginx.conf

tambahkan dua directive berikut di bagian atas file untuk memuat modul baru Brotli :

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

Tes konfigurasi nginx untuk periksa setiap kesalahan :

sudo nginx -t

Buat direktori untuk document root example.com dan buat index.html dengan beberapa konten di dalamnya:

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

buat konfigurasi virtual host untuk example.com:

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

kemudian gunakan konfigurasi berikut :

server {
  listen 80;
  server_name example.com; # ganti dengan nama domain Anda
  return 301 https://$server_name$request_uri;
}

server {    
  listen 443 ssl http2;
  server_name example.com; # ganti dengan nama domain Anda

  root /var/www/example.com; # ganti dengan document root dari website

  # 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;
}

Tes konfigurasi nginx agar sesuai dengan yang di inginkan :

sudo nginx -t

jika tidak ada kesalahan, reload nginx service:

sudo systemctl reload nginx.service

Kunjungi situs Anda di browser web Anda dan buka network tab di developer tools. Anda akan melihat Content-Encoding: br di response header. Itu adalah indikator bahwa kompresi Brotli berfungsi.

Pengaturan Brotli di CentOS 8

Pengaturan Brotli di CentOS 8

That’s it. You have enabled Brotli compression on your CentOS 8 system.