Brotli là một thư viện nén dữ liệu mã nguồn mở được chỉ định chính thức bởi dự thảo IETF. Nó có thể được dùng để nén dữ liệu HTTPS responses mà server side gửi về cho browser, giống như vai trò của gzip hay deflate. Hiện nay phần lớn các browser phổ biến đã hỗ trợ Brotli mặc định, như Chrome, Firefox hay Edgle.
Ngoài ra, Brotli an toàn hơn vì brotli chỉ chạy trên giao thức HTTPS.
Cũng giống như gzip, Brotli là một thuật toán nén không mất dữ liệu, nén dữ liệu bằng cách sử dụng kết hợp một biến thể hiện đại của thuật toán LZ77, mã hóa Huffman và mô hình ngữ cảnh bậc 2, với tỷ lệ nén tương đương với các phương pháp nén đa năng tốt nhất hiện có. Nó tương tự về tốc độ với deflate / gzip nhưng cung cấp khả năng nén tốt hơn.
Trong bài này chúng ta sẽ cùng tìm hiểu về điểm mạnh của Brotli cũng như cách để setup một server đơn giản sử dụng Brotli.
Gzip vs Brotli:
Ưu điểm của Brotli so với gzip là nó sử dụng từ điển và do đó nó chỉ cần gửi khóa thay vì từ khóa đầy đủ.
- Các tệp Javascript được nén bằng Brotli nhỏ hơn 14-16% so với gzip.
- Các tệp HTML nhỏ hơn 21-25% so với gzip.
- Các tệp CSS nhỏ hơn 17-20% so với gzip.
Các bước thực hiện
Bước 1: Cài đặt Brotli
yum install pcre-devel cmake -y cd /usr/local/src git clone https://github.com/google/brotli.git cd brotli git checkout v1.0 ./configure-cmake make && make install grep "/usr/local/lib/" /etc/ld.so.conf || echo "/usr/local/lib/" >> /etc/ld.so.conf ldconfig
Bước 2: Download Nginx Static Brotli module 64bit
cd /usr/lib64/nginx mkdir modules #skip if folder exists cd modules rm -rf ngx_http_brotli* wget --no-cache https://linuxcanban.com/tools/nginx-brotli-modules.zip unzip nginx-brotli-modules.zip rm -rf nginx-brotli-modules.zip
Bước 3: Thêm cấu hình module vào nginx.conf
File nginx.conf mặc định có thể tìm thấy trong /etc/nginx/nginx.conf. Sau đó bạn thêm 2 dòng sau vào file nginx
/etc/nginx/nginx.conf
load_module "modules/ngx_http_brotli_filter_module.so"; load_module "modules/ngx_http_brotli_static_module.so";
Tiếp đến bạn thêm cấu hình nén vào trong file nginx.conf này luôn. bạn thêm trong thẻ http { là được
# Compression brotli
brotli on;
brotli_comp_level 6;
brotli_static on;
brotli_types text/xml image/svg+xml application/x-font-ttf image/vnd.microsoft.icon application/x-font-opentype application/json font/eot application/vnd.ms-fontobject application/javascript font/otf application/xml application/xhtml+xml text/javascript application/x-javascript text/plain application/x-font-truetype application/xml+rss image/x-icon font/opentype text/css image/x-win-bitmap;
- Dưới đây là tệp ví dụ
load_module "modules/ngx_http_brotli_filter_module.so";
load_module "modules/ngx_http_brotli_static_module.so";
user nobody;
worker_processes auto;
#worker_rlimit_nofile 65535;
error_log /var/log/nginx/error.log crit;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
use epoll;
multi_accept on;
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
client_header_timeout 3m;
client_body_timeout 3m;
client_max_body_size 256m;
client_header_buffer_size 4k;
client_body_buffer_size 256k;
large_client_header_buffers 4 32k;
send_timeout 3m;
keepalive_timeout 60 60;
reset_timedout_connection on;
server_names_hash_max_size 1024;
server_names_hash_bucket_size 1024;
ignore_invalid_headers on;
connection_pool_size 256;
request_pool_size 4k;
output_buffers 4 32k;
postpone_output 1460;
include mime.types;
default_type application/octet-stream;
# Compression brotli
brotli on;
brotli_comp_level 6;
brotli_static on;
brotli_types text/xml image/svg+xml application/x-font-ttf image/vnd.microsoft.icon application/x-font-opentype application/json font/eot application/vnd.ms-fontobject application/javascript font/otf application/xml application/xhtml+xml text/javascript application/x-javascript text/plain application/x-font-truetype application/xml+rss image/x-icon font/opentype text/css image/x-win-bitmap;
# Compression gzip
gzip on;
gzip_vary on;
gzip_disable "MSIE [1-6]\.";
gzip_proxied any;
gzip_min_length 512;
gzip_comp_level 6;
gzip_buffers 8 64k;
gzip_types text/plain text/xml text/css text/js application/x-javascript application/xml image/png image/x-icon image/gif image/jpeg image/svg+xml application/xml+rss text/javascript application/atom+xml application/javascript application/json application/x-font-ttf font/opentype;
}
- Lưu ý: Bạn có thể điều chỉnh mức độ nén cho brotli thành 0-11 11 brotli_comp_level ví dụ. “ Brotli_comp_level 11 ” nhưng minh đề nghị sử dụng giá trị 6
Sau đó bạn check lại cấu hình nginx xem đúng chưa bằng lệnh nginx -t . Nếu đã chính xác bạn restart lại nginx nhé.
systemctl restart nginx
Bước 4: Truy cập website và kiểm tra
- Bạn có thể kiểm tra tại website sau: https://tools.keycdn.com/brotli-test