Đây là kỹ thuật nén dữ liệu trước khi gởi, giúp giảm băng thông đường truyền và tăng tốc độ truyền tải dữ liệu.
Dể thực hiện được tính năng Compress Responses, ta sẽ sử dụng directive gzip
và gzip_comp_level
, hãy tham khảo ví dụ sau
worker_processes auto;
events {
worker_connections 1024;
}
http {
include /env/nginx/mime.types;
gzip on;
gzip_comp_level 3;
gzip_types text/css text/javascript;
server {
listen 80;
server_name nglearns.test;
root /srv/nglearns/static-demo;
location ~* \.(css|js|jpg)$ {
access_log off;
add_header Cache-Control public;
add_header Pragma public;
add_header Vary Accept-Encoding;
expires 1M;
}
}
}
Tại đây, ta có thể thấy, bằng cách sử dụng directive gzip
với giá trị là on
, ta đã dễ dàng mở tính năng nén dữ liệu.
Ngoài ra, với directive gzip_comp_level
, ta dễ dàng quyết định được cấp độ nén nội dung của nginx
Tiếp đến là directive gzip_types
, với thuộc tính này, ta sẽ nói với nginx các loại file nào cần được nén, trường trường hợp này là css và js với cách thiết lập text/css
và text/javascript
Cuối cùng, đừng quên sử dụng directive add_header Vary Accept-Encoding;
, Vì với thuộc tính này, ta sẽ nói với client rằng nội dung phản hồi sẽ tuỳ thuộc vào nội dung mà phía client chấp thuận.
Hãy thực nghiệm thông qua truy vấn sau
curl -I http://nglearns.test/mini.min.css
Kết quả
# HTTP/1.1 200 OK
# Server: nginx/1.18.0 (Ubuntu)
# Date: Sun, 25 Apr 2021 16:30:32 GMT
# Content-Type: text/css
# Content-Length: 46887
# Last-Modified: Sun, 25 Apr 2021 08:35:33 GMT
# Connection: keep-alive
# ETag: "608529d5-b727"
# Expires: Tue, 25 May 2021 16:30:32 GMT
# Cache-Control: max-age=2592000
# Cache-Control: public
# Pragma: public
# Vary: Accept-Encoding
# Accept-Ranges: bytes
Tại đây, bạn có thể thấy được không có dữ liệu nào được can thiệp nén. vậy chúng ta hãy thử với câu truy vấn sau
curl -I -H "Accept-Encoding: gzip" http://nglearns.test/mini.min.css
Kết quả
# HTTP/1.1 200 OK
# Server: nginx/1.18.0 (Ubuntu)
# Date: Sun, 25 Apr 2021 16:31:38 GMT
# Content-Type: text/css
# Last-Modified: Sun, 25 Apr 2021 08:35:33 GMT
# Connection: keep-alive
# ETag: W/"608529d5-b727"
# Expires: Tue, 25 May 2021 16:31:38 GMT
# Cache-Control: max-age=2592000
# Cache-Control: public
# Pragma: public
# Vary: Accept-Encoding
# Content-Encoding: gzip
Như các bạn đã thấy, dữ liệu đã được nén thông qua thông tin Content-Encoding
với giá trị là gzip
và tất nhiên, dữ liệu của file đã được nén sẽ bé hơn rất nhiều so với file bình thường.