Giới thiệu Một trang web chạy nhanh hay chậm đều phụ thuộc vào kích thước của tất cả các tập tin mà phải được tải bởi trình duyệt. Giảm kích thước của tập tin được truyền đi có thể làm cho trang web không chỉ được tải nhanh hơn, mà còn giúp tiết kiệm chi phí nâng cấp băng thông. gzip là một chương trình nén dữ liệu phổ biến. gzip là một phương thức để nén và làm giảm dung lượng các file ở server trước khi gửi đến client (ví dụ như trình duyệt). Nó có thể nén các file tĩnh như HTML, CSS, Javascript hay 1 số document khác như XML hay JSON. Còn đối với tập tin hình ảnh, video thì sẽ sử dụng cách nén khác. Trong hướng dẫn này, chúng tôi sẽ thảo luận làm thế nào để cấu hình Nginx được cài đặt trên máy chủ CentOS 7 của bạn sử dụng nén gzip để giảm kích thước của nội dung gửi đến người truy cập website. Bước 1 - Tạo các tập tin thử nghiệm Tạo một tập tin 1 kilobyte tên test.html trong thư mục mặc định Nginx sử dụng truncate. Phần mở rộng sẽ chỉ ra rằng nó là một trang HTML. Mã: truncate -s 1k /usr/share/nginx/html/test.html Hãy tạo thêm một vài tập tin thử nghiệm theo cách tương tự: một tập tin hình ảnh jpg, một tập tin css, và một tập tin JavaScript js. Mã: truncate -s 1k /usr/share/nginx/html/test.jpg truncate -s 1k /usr/share/nginx/html/test.css truncate -s 1k /usr/share/nginx/html/test.js Bước 2 - Kiểm tra Default Behavior Bước tiếp theo là kiểm tra Nginx sẽ thực hiện như thế nào với các tập tin chúng tôi vừa tạo ra. Hãy kiểm tra xem tập tin HTML có tên test.html.Lệnh yêu cầu một tập tin từ máy chủ Nginx của chúng tôi, và xác định rằng nó là tốt để gzip nội dung nén bằng cách sử dụng một HTTP header (Accept-Encoding: gzip). Mã: url -H "Accept-Encoding: gzip" -I http://localhost/test.html Đáp lại, bạn sẽ thấy một vài HTTP response headers: Nginx response headers Mã: 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 response, không có đề cập đến gzip nào. Điều này cho chúng ta biết nén gzip không được kích hoạt trên máy chủ. Đó là bởi vì trên CentOS 7 hỗ trợ cho gzip là hoàn toàn vô hiệu hóa trong cấu hình Nginx mặc định. Nếu gzip được kích hoạt, chúng ta sẽ thấy dòng output: Content-Encoding: gzip. Không chỉ các trang HTML, ta hãy thử kiểm tra các tập tin khác xem. Để xác minh rằng, bạn có thể yêu cầu hình ảnh thử nghiệm tên test.jpg của chúng tôi trong cùng một cách. Mã: curl -H "Accept-Encoding: gzip" -I http://localhost/test.jpg Kết quả sẽ giống hệt như trước: Mã: 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ó Content-Encoding: gzip ở kết quả đầu ra, có nghĩa là các tập tin đã được xử lý mà không cần nén. Hai tập tin còn lại cũng sẽ ra kết quả như trên. Bước 3 - Kích hoạt và cấu hình module gzip Bước tiếp theo là cấu hình Nginx để cho phép nén tất cả các định dạng tập tin mà có hiệu quả đối với nén. Module gzip là một mô-đun lõi trong Nginx, có nghĩa là nó đã được cài đặt, nhưng phải được kích hoạt và cấu hình. Trong một cài đặt Nginx trên CentOS 7, tất cả các tập tin với phần mở rộng conf từ tập tin /etc/nginx/conf.d được tải tự động. Điều này cho phép dễ dàng cấu hình các module bổ sung. Để kích hoạt các module gzip Nginx, tạo ra tập tin cấu hình tên là gzip.conf sử dụng nano hoặc trình soạn thảo văn bản yêu thích của bạn. Mã: nano /etc/nginx/conf.d/gzip.conf Thêm các dòng sau: Mã: ## # `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 lại và đóng file Hãy xem qua các thiết lập cấu hình áp dụng ở đây: gzip on: chỉ thị cho phép nén Gzip. gzip_disable "msie6": chỉ thị sẽ loại bỏ Internet Explorer 6 trong tất cả các trình duyệt sẽ nhận được các tập tin nén, vì IE6 không hỗ trợ gzip. thiết lập gzip_vary và gzip_proxied chắc chắn rằng proxy servers giữa trình duyệt và máy chủ sẽ nhận diện nén một cách chính xác. gzip_comp_level 6: chỉ thị cho biết bao nhiêu file sẽ được nén. Các số cao hơn, mức độ nén cao hơn và mức sử dụng tài nguyên. Giá trị 6 là một lựa chọn hợp lý. gzip_http_version 1.1 được sử dụng để hạn chế nén gzip đối với trình duyệt hỗ trợ giao thức HTTP/1.1. gzip_min_length 256: chỉ thị giúp Nginx không nén các file nhỏ hơn 256 byte. Các tập tin rất nhỏ hầu như không được hưởng lợi từ nén. gzip_types: danh sách tất cả các loại MIME sẽ được nén. Trong trường hợp này, danh sách bao gồm các trang HTML, css, tập tin javascript và JSON, các file XML, icons, SVG images, và web fonts. Để áp dụng cấu hình mới, khởi động lại Nginx. Mã: systemctl restart nginx Bước 4 – Kiểm tra cấu hình mới Bước tiếp theo là kiểm tra xem những thay đổi về cấu hình đã làm việc như mong đợi. Chúng ta có thể kiểm tra điều này giống như chúng ta đã làm trong bước 2, bằng cách sử dụng curl trên mỗi tập tin thử nghiệm và kiểm tra kết qủa đầu ra có xuất hiện dòng Content-Encoding: gzip. Mã: curl -H "Accept-Encoding: gzip" -I http://localhost/test.html Kết quả đầu ra: Mã: 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ể thấy dòng Content-Encoding: gzip ở trên điều này cho thấy Nginx đã sử dụng module gzip để nén tập tin. Bạn có thể kiểm tra tất cả các file khác theo cùng một cách: Mã: 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ỉ có tập tin test.jpg, là một tập tin ảnh, nên nó sẽ không được nén. Còn hai tập tin còn lại css và js, bạn sẽ có thể tìm thấy Content-Encoding: gzip ở kết quả đầu ra. Nếu gặp trường hợp, thì bạn đã cấu hình nén gzip trong Nginx thành công!