HƯỚNG DẪN Thêm gzip Module đến Nginx trên CentOS 7

Thảo luận trong 'KIẾN THỨC CƠ BẢN' bắt đầu bởi quyet1990, 16/11/16.

  1. quyet1990

    quyet1990 New Member

    220
    16
    0
    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!
     

Chia sẻ trang này

Đang tải...