Cách thêm module gzip vào Nginx trên CentOS 7
Một trang web sẽ tải nhanh như thế nào phụ thuộc vào kích thước của tất cả các file mà trình duyệt phải download . Việc giảm kích thước file được truyền có thể làm cho trang web không chỉ tải nhanh hơn mà còn rẻ hơn cho những người phải trả tiền cho việc sử dụng băng thông của họ. gzip
là một chương trình nén dữ liệu phổ biến. Bạn có thể cấu hình Nginx để sử dụng gzip
để nén các file mà nó phân phối nhanh chóng. Các file đó sau đó sẽ được extract bởi các trình duyệt hỗ trợ nó khi truy xuất mà không bị mất bất kỳ điều gì, nhưng với lợi ích là lượng dữ liệu nhỏ hơn được truyền giữa web server và trình duyệt.
Do cách hoạt động của tính năng nén nói chung cũng như cách thức hoạt động của gzip
, một số file nhất định sẽ nén tốt hơn những file khác. Ví dụ: các file văn bản nén rất tốt, thường có kết quả nhỏ hơn hai lần. Mặt khác, các hình ảnh như file JPEG hoặc PNG đã được nén về bản chất của chúng và việc nén thứ hai bằng gzip
mang lại ít hoặc không có kết quả. Nén file sử dụng hết tài nguyên server , vì vậy tốt nhất là chỉ nén những file sẽ làm giảm kích thước đáng kể của nó.
Trong hướng dẫn này, ta sẽ thảo luận về cách cấu hình Nginx được cài đặt trên server CentOS 7 của bạn để sử dụng tính năng nén gzip
nhằm giảm kích thước nội dung được gửi đến khách truy cập trang web.
Yêu cầu
Để làm theo hướng dẫn này, bạn cần :
Một server CentOS 7 với user không phải root có quyền sudo
Nginx được cài đặt trên server của bạn theo hướng dẫn Cách cài đặt Nginx trên CentOS 7
Bước 1 - Tạo file kiểm tra
Trong bước này, ta sẽ tạo một số file thử nghiệm trong folder Nginx mặc định để nén văn bản của gzip
.
Để đưa ra quyết định loại file nào được cung cấp qua mạng, Nginx không phân tích nội dung file vì nó không đủ nhanh. Thay vào đó, nó chỉ tìm kiếm phần mở rộng file để xác định kiểu MIME của nó, biểu thị mục đích của file .
Do hành vi này, nội dung của các file kiểm tra là không liên quan. Bằng cách đặt tên các file một cách thích hợp, ta có thể đánh lừa Nginx nghĩ rằng một file hoàn toàn trống là một hình ảnh và file kia, ví dụ, là một biểu định kiểu.
Trong cấu hình của ta , Nginx sẽ không nén các file rất nhỏ, vì vậy ta sẽ tạo các file thử nghiệm có kích thước chính xác là 1 kilobyte. Điều này sẽ cho phép ta xác minh xem Nginx có sử dụng tính năng nén ở nơi cần thiết hay không, nén một loại file và không làm như vậy với các file khác.
Tạo một file 1 kilobyte có tên test.html
trong folder Nginx mặc định bằng cách sử dụng truncate
. Phần mở rộng biểu thị rằng đó là một trang HTML.
- sudo truncate -s 1k /usr/share/nginx/html/test.html
Hãy tạo thêm một vài file thử nghiệm theo cách tương tự: một file hình ảnh jpg
, một file định kiểu css
và một file JavaScript js
.
- sudo truncate -s 1k /usr/share/nginx/html/test.jpg
- sudo truncate -s 1k /usr/share/nginx/html/test.css
- sudo truncate -s 1k /usr/share/nginx/html/test.js
Bước 2 - Kiểm tra hành vi mặc định
Bước tiếp theo là kiểm tra xem Nginx hoạt động như thế nào đối với quá trình nén trên bản cài đặt mới với các file ta vừa tạo.
Hãy kiểm tra xem file HTML có tên test.html
có được phục vụ với tính năng nén hay không. Lệnh yêu cầu một file từ server Nginx của ta và chỉ định rằng có thể phân phát nội dung nén gzip
bằng cách sử dụng tiêu đề HTTP ( Accept-Encoding: gzip
).
- curl -H "Accept-Encoding: gzip" -I http://localhost/test.html
Đáp lại, bạn sẽ thấy một số tiêu đề phản hồi HTTP:
HTTP/1.1 200 OK Server: nginx/1.6.3 Date: Fri, 11 Mar 2016 12:53:06 GMT Content-Type: text/html Content-Length: 1024 Last-Modified: Fri, 11 Mar 2016 12:48:02 GMT Connection: keep-alive ETag: "56e2be82-400" Accept-Ranges: bytes
Trong câu trả lời, không có bất kỳ đề cập đến gzip
. Điều này cho ta biết rằng nén gzip
không được bật trên server . Đó là lý do trên CentOS 7, hỗ trợ cho gzip
hoàn toàn bị vô hiệu hóa trong cấu hình Nginx mặc định. Nếu tính năng nén được bật, ta sẽ thấy tiêu đề bổ sung trong kết quả có Content-Encoding: gzip
.
Không chỉ các trang HTML, mà còn mọi file khác trên bản cài đặt mới sẽ được phân phát không nén. Để xác minh điều đó, bạn có thể yêu cầu hình ảnh thử nghiệm của ta có tên test.jpg
theo cách tương tự.
- curl -H "Accept-Encoding: gzip" -I http://localhost/test.jpg
Kết quả sẽ gần như giống hệt như trước đây:
HTTP/1.1 200 OK Server: nginx/1.6.3 Date: Fri, 11 Mar 2016 12:58:03 GMT Content-Type: image/jpeg Content-Length: 1024 Last-Modified: Fri, 11 Mar 2016 12:48:05 GMT Connection: keep-alive ETag: "56e2be85-400" Accept-Ranges: bytes
Không có tiêu đề Content-Encoding: gzip
trong kết quả , nghĩa là file được phân phát mà không cần nén.
Bạn có thể lặp lại thử nghiệm với biểu định kiểu CSS thử nghiệm.
- curl -H "Accept-Encoding: gzip" -I http://localhost/test.css
, không có đề cập đến nén trong kết quả .
HTTP/1.1 200 OK Server: nginx/1.6.3 Date: Fri, 11 Mar 2016 12:59:04 GMT Content-Type: text/css Content-Length: 1024 Last-Modified: Fri, 11 Mar 2016 12:48:05 GMT Connection: keep-alive ETag: "56e2be85-400" Accept-Ranges: bytes
Bước 3 - Bật và cấu hình module gzip của Nginx
Bước tiếp theo là cấu hình Nginx để bật tính năng nén cho tất cả các định dạng file có thể được hưởng lợi từ việc nén.
Mô-đun gzip
là một module cốt lõi trong Nginx, nghĩa là nó đã được cài đặt nhưng phải được kích hoạt và cấu hình . Trong cài đặt Nginx mới trên CentOS 7, tất cả các file có phần mở rộng .conf
từ folder /etc/nginx/conf.d
sẽ được tự động tải. Điều này cho phép dễ dàng cấu hình các module bổ sung.
Để kích hoạt module Nginx gzip
, hãy tạo file cấu hình có tên gzip.conf
bằng nano
hoặc editor yêu thích của bạn.
- sudo nano /etc/nginx/conf.d/gzip.conf
Dán nội dung sau.
## # `gzip` Settings # # gzip on; gzip_disable "msie6"; gzip_vary on; gzip_proxied any; gzip_comp_level 6; gzip_http_version 1.1; gzip_min_length 256; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript application/vnd.ms-fontobject application/x-font-ttf font/opentype image/svg+xml image/x-icon;
Lưu file để thoát.
Hãy xem qua các cài đặt cấu hình được áp dụng tại đây:
gzip on
chỉ thị cho phép nén Gzip.gzip_disable "msie6"
loại trừ Internet Explorer 6 khỏi các trình duyệt sẽ nhận file nén, vì IE6 hoàn toàn không hỗ trợgzip
.gzip_vary
vàgzip_proxied
cài đặt chắc chắn rằng server proxy giữa trình duyệt và server sẽ nhận nén một cách chính xác.gzip_comp_level 6
đặt số lượng file sẽ được nén. Con số này càng cao thì mức độ nén và sử dụng tài nguyên càng cao. 6 là mức trung bình hợp lý.gzip_http_version 1.1
được sử dụng để giới hạn néngzip
cho các trình duyệt hỗ trợ giao thức HTTP / 1.1. Nếu trình duyệt không hỗ trợ nó, rất có thể nó cũng không hỗ trợgzip
.gzip_min_length 256
yêu cầu Nginx không nén các file nhỏ hơn 256 byte. Các file rất nhỏ hầu như không được hưởng lợi từ việc nén.gzip_types
liệt kê tất cả các kiểu MIME sẽ được nén. Trong trường hợp này, danh sách bao gồm các trang HTML, bảng định kiểu CSS, file Javascript và JSON, file XML, biểu tượng, hình ảnh SVG và phông chữ web.
Để kích hoạt cấu hình mới, hãy khởi động lại Nginx.
- sudo systemctl restart nginx
Bước 4 - Xác minh cấu hình mới
Bước tiếp theo là kiểm tra xem các thay đổi đối với cấu hình đã hoạt động như mong đợi hay chưa.
Ta có thể kiểm tra giống như ta đã làm trong bước 2, bằng cách sử dụng curl
trên mỗi file kiểm tra và kiểm tra kết quả cho tiêu đề Content-Encoding: gzip
.
- curl -H "Accept-Encoding: gzip" -I http://localhost/test.html
Đáp lại, bạn sẽ thấy tiêu đề Content-Encoding: gzip
mà trước đây không có:
HTTP/1.1 200 OK Server: nginx/1.6.3 Date: Fri, 11 Mar 2016 13:19:16 GMT Content-Type: text/html Last-Modified: Fri, 11 Mar 2016 12:48:02 GMT Connection: keep-alive Vary: Accept-Encoding Content-Encoding: gzip
Bạn có thể kiểm tra tất cả các file khác theo cùng một cách:
- curl -H "Accept-Encoding: gzip" -I http://localhost/test.jpg
- curl -H "Accept-Encoding: gzip" -I http://localhost/test.css
- curl -H "Accept-Encoding: gzip" -I http://localhost/test.js
Bây giờ chỉ test.jpg
, là một file hình ảnh, sẽ không bị nén. Trong cả hai ví dụ khác, bạn có thể tìm thấy tiêu đề Content-Encoding: gzip
trong kết quả .
Nếu đúng như vậy, bạn đã cấu hình nén gzip
trong Nginx thành công!
Kết luận
Thay đổi cấu hình Nginx để sử dụng đầy đủ tính năng nén gzip
rất dễ dàng, nhưng lợi ích có thể rất lớn. Không chỉ những khách truy cập có băng thông hạn chế sẽ nhận được trang web nhanh hơn mà cả Google cũng sẽ hài lòng về việc trang web tải nhanh hơn. Tốc độ đang được quan tâm như một phần quan trọng của web hiện đại và sử dụng gzip
là một bước quan trọng để cải thiện nó.
Các tin liên quan
Cách thêm module gzip vào Nginx trên Ubuntu 14.042016-03-09
Cách thiết lập xác thực HTTP cơ bản với Nginx trên Ubuntu 14.04
2016-02-22
Cách thiết lập xác thực HTTP cơ bản với Nginx trên CentOS 7
2016-02-22
Cách bảo mật Nginx trên Ubuntu 14.04
2016-02-12
Cách bảo mật Nginx bằng Let's Encrypt trên CentOS 7
2016-01-26
Cách bảo mật Nginx bằng Let's Encrypt trên Ubuntu 14.04
2015-12-17
Cách chạy Nginx trong Docker Container trên Ubuntu 14.04
2015-10-28
Cách thêm ngx_pagespeed vào Nginx trên CentOS 7
2015-09-30
Cách thêm ngx_pagespeed vào Nginx trên Ubuntu 14.04
2015-09-22
Cách thêm ngx_pagespeed vào Nginx trên Debian 8
2015-09-20