Mục lục

Không có mục lục
Tham gia kênh Telegram của CloudFly để nhận thêm ưu đãi và không bỏ lỡ bất kỳ khuyến mãi nào từ CloudFly

Cách thiết lập Nginx với hỗ trợ HTTP/2 trên Ubuntu 18.04

Ngày đăng: 20 tháng 10 năm 2023

Giới thiệu

Nginx là một máy chủ web nguồn mở nhanh và đáng tin cậy. Nó trở nên phổ biến nhờ dung lượng bộ nhớ thấp, khả năng mở rộng cao, dễ cấu hình và hỗ trợ nhiều loại giao thức.

HTTP/2 là phiên bản mới của Hypertext Transport Protocol (Giao thức truyền tải siêu văn bản), được sử dụng trên Web để phân phối các trang từ máy chủ đến trình duyệt. HTTP/2 là bản cập nhật lớn đầu tiên của HTTP trong gần hai thập kỷ: HTTP1.1 được giới thiệu ra công chúng vào năm 1999 khi các trang web thường chỉ là một tệp HTML duy nhất có biểu định kiểu CSS nội tuyến. Internet đã thay đổi đáng kể kể từ đó và hiện chúng ta đang phải đối mặt với những hạn chế của HTTP 1.1 — giao thức giới hạn tốc độ truyền tiềm năng đối với hầu hết các trang web hiện đại vì nó tải xuống các phần của trang trong hàng đợi (phần trước phải tải xuống hoàn toàn trước khi bắt đầu tải xuống phần tiếp theo) và một trang web hiện đại trung bình yêu cầu tải xuống khoảng 100 yêu cầu (mỗi yêu cầu là một hình ảnh, tệp js, tệp css, v.v.).

HTTP/2 giải quyết được vấn đề này vì nó mang lại một số thay đổi cơ bản:

  • Tất cả các yêu cầu được tải xuống song song, không xếp hàng
  • Tiêu đề HTTP được nén
  • Truyền trang dưới dạng nhị phân, không phải dưới dạng tệp văn bản, hiệu quả hơn
  • Máy chủ có thể “push” dữ liệu ngay cả khi không có yêu cầu của người dùng, giúp cải thiện tốc độ cho người dùng có độ trễ cao

Mặc dù HTTP/2 không yêu cầu mã hóa, các nhà phát triển của hai trình duyệt phổ biến nhất là Google Chrome và Mozilla Firefox đã tuyên bố rằng vì lý do bảo mật, họ sẽ chỉ hỗ trợ HTTP/2 cho các kết nối HTTPS. Do đó, nếu bạn quyết định thiết lập máy chủ có hỗ trợ HTTP/2, bạn cũng phải bảo mật chúng bằng HTTPS.

Hướng dẫn này sẽ giúp bạn thiết lập máy chủ Nginx nhanh chóng và an toàn với hỗ trợ HTTP/2.

Điều kiện tiên quyết

Trước khi bắt đầu, chúng ta sẽ cần một vài điều:

  • Một máy chủ Ubuntu 18.04 được thiết lập bằng cách làm theo hướng dẫn thiết lập máy chủ ban đầu của Ubuntu 18.04, bao gồm sudo non-root user và tường lửa.
  • Nginx đã được cài đặt trên máy chủ của bạn, bạn có thể thực hiện việc này bằng cách làm theo Cách cài đặt Nginx trên Ubuntu 18.04.
  • Một tên miền được cấu hình để trỏ đến máy chủ của bạn. Bạn có thể mua một tên miền tại CloudFly.
  • Chứng chỉ TLS/SSL được định cấu hình cho máy chủ của bạn. Bạn có ba lựa chọn:
    • Bạn có thể nhận chứng chỉ miễn phí từ Let's Encrypt bằng cách làm theo Cách bảo mật Nginx với Let's Encrypt trên Ubuntu 18.04.
    • Bạn cũng có thể tạo và định cấu hình chứng chỉ tự ký bằng cách làm theo Cách tạo chứng chỉ SSL tự ký cho Nginx trong Ubuntu 18.04.
    • Bạn có thể mua một cái từ nhà cung cấp khác và định cấu hình Nginx để sử dụng nó bằng cách làm theo Bước 2 đến 6 của Cách tạo Chứng chỉ SSL tự ký cho Nginx trong Ubuntu 18.04.
  • Nginx được định cấu hình để chuyển hướng lưu lượng truy cập từ cổng 80 sang cổng 443, cổng này phải đáp ứng các điều kiện tiên quyết trước đó.
  • Nginx được định cấu hình để sử dụng khóa Ephemeral Diffie-Hellman (DHE) 2048 bit trở lên, khóa này cũng phải được bao gồm trong các điều kiện tiên quyết trước đó.

Bước 1 - Kích hoạt hỗ trợ HTTP/2

Nếu bạn đã làm theo bước thiết lập server block trong hướng dẫn cài đặt Nginx, bạn sẽ có một server block cho miền của mình tại /etc/nginx/sites-available/your_domain với chỉ thị server_name đã được đặt phù hợp. Thay đổi đầu tiên chúng tôi sẽ thực hiện là sửa đổi server block của miền của bạn để sử dụng HTTP/2.

Mở tệp cấu hình cho miền của bạn:

  1. sudo nano /etc/nginx/sites-available/your_domain

Trong tệp, xác định vị trí các biến listen được liên kết với cổng 443:

/etc/nginx/sites-available/your_domain
...
    listen [::]:443 ssl ipv6only=on; 
    listen 443 ssl; 
...

Cái đầu tiên dành cho kết nối IPv6. Cái thứ hai dành cho tất cả các kết nối IPv4. Chúng tôi sẽ kích hoạt HTTP/2 cho cả hai.

Sửa đổi từng lệnh listen để bao gồm http2:

/etc/nginx/sites-available/your_domain
...
    listen [::]:443 ssl http2 ipv6only=on; 
    listen 443 ssl http2; 
...

Điều này yêu cầu Nginx sử dụng HTTP/2 với các trình duyệt được hỗ trợ.

Lưu tệp cấu hình và thoát khỏi trình soạn thảo văn bản.

Bất cứ khi nào bạn thực hiện thay đổi đối với tệp cấu hình Nginx, bạn nên kiểm tra cấu hình để tìm lỗi cú pháp, như sau:

  1. sudo nginx -t

Nếu cú pháp không có lỗi, bạn sẽ thấy kết quả sau:

Output of sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Tiếp theo, chúng tôi sẽ định cấu hình máy chủ của mình để sử dụng danh sách mật mã hạn chế hơn.

Bước 2 - Loại bỏ các bộ mật mã cũ và không an toàn

HTTP/2 có danh sách đen gồm các mật mã cũ và không an toàn, vì vậy chúng ta phải tránh chúng. Bộ mật mã là các thuật toán mã hóa mô tả cách mã hóa dữ liệu được truyền.

Phương pháp bạn sẽ sử dụng để xác định mật mã tùy thuộc vào cách bạn đã định cấu hình chứng chỉ TLS/SSL cho Nginx.

Nếu bạn đã sử dụng Certbot để lấy chứng chỉ của mình thì nó cũng tạo tệp /etc/letsencrypt/options-ssl-nginx.conf chứa các mật mã không đủ mạnh cho HTTP/2. Rất tiếc, việc sửa đổi tệp này sẽ ngăn Certbot áp dụng các bản cập nhật trong tương lai, vì vậy chúng tôi sẽ chỉ yêu cầu Nginx không sử dụng tệp này và chúng tôi sẽ chỉ định danh sách mật mã của riêng mình.

Mở tệp cấu hình server block cho miền của bạn:

  1. sudo nano /etc/nginx/sites-available/your_domain

Xác định vị trí dòng bao gồm tệp options-ssl-nginx.conf và nhận xét nó:

/etc/nginx/sites-available/your_domain
# include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot

Bên dưới dòng đó, thêm dòng này để xác định mật mã được phép:

/etc/nginx/sites-available/your_domain
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

Lưu tệp và thoát khỏi trình chỉnh sửa.

Nếu bạn đã sử dụng chứng chỉ tự ký hoặc sử dụng chứng chỉ từ bên thứ ba và định cấu hình chứng chỉ đó theo các điều kiện tiên quyết, hãy mở tệp /etc/nginx/snippets/ssl-params.conf trong trình soạn thảo văn bản của bạn:

  1. sudo nano /etc/nginx/snippets/ssl-params.conf

Xác định vị trí dòng sau:

/etc/nginx/snippets/ssl-params.conf
...
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
...

Sửa đổi nó để nó trông như thế này:

/etc/nginx/snippets/ssl-params.conf
...
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

Lưu tệp và thoát trình soạn thảo của bạn.

Một lần nữa, hãy kiểm tra cấu hình để tìm lỗi cú pháp:

  1. sudo nginx -t

Nếu bạn thấy bất kỳ lỗi nào, hãy giải quyết chúng và kiểm tra lại.

Khi bạn không thấy lỗi cú pháp, hãy khởi động lại Nginx:

  1. sudo systemctl reload nginx

Khi máy chủ được khởi động lại, hãy xác minh rằng nó hoạt động.

Bước 3 - Xác minh rằng HTTP/2 đã được bật

Hãy đảm bảo máy chủ đang chạy và hoạt động với HTTP/2.

Sử dụng lệnh curl để đưa ra yêu cầu tới trang web của bạn và xem các tiêu đề:

  1. curl -I -L https://your_domain

Bạn sẽ thấy kết quả sau:

Output
HTTP/1.1 301 Moved Permanently Server: nginx/1.14.0 (Ubuntu) Date: Fri, 06 Jul 2018 19:07:12 GMT Content-Type: text/html Content-Length: 194 Connection: keep-alive Location: https://your_domain/ HTTP/2 200 server: nginx/1.14.0 (Ubuntu) date: Fri, 06 Jul 2018 19:07:12 GMT content-type: text/html content-length: 16 last-modified: Fri, 06 Jul 2018 16:55:37 GMT etag: "5b3f9f09-10" accept-ranges: bytes

Bạn cũng có thể xác minh rằng HTTP/2 đang được sử dụng trong Google Chrome. Mở Chrome và điều hướng đến http://your_domain. Mở Chrome Developer Tools (View -> Developer -> Developer Tools) và tải lại trang (View -> Reload This Page). Điều hướng đến tab Network, nhấp chuột phải vào hàng tiêu đề của bảng bắt đầu bằng Name và chọn tùy chọn Protocol từ menu bật lên.

Bạn sẽ thấy h2 (viết tắt của HTTP/2) trong cột Protocol mới, cho biết HTTP/2 đang hoạt động.

description image

Tại thời điểm này, bạn đã sẵn sàng phân phát nội dung thông qua giao thức HTTP/2. Hãy cải thiện tính bảo mật và hiệu suất bằng cách bật HSTS.

Bước 4 - Kích hoạt bảo mật truyền tải nghiêm ngặt HTTP (HSTS)

Mặc dù các yêu cầu HTTP của bạn chuyển hướng đến HTTPS, bạn có thể bật HTTP Strict Transport Security (HSTS) để tránh phải thực hiện những chuyển hướng đó. Nếu trình duyệt tìm thấy tiêu đề HSTS, trình duyệt sẽ không cố gắng kết nối lại với máy chủ qua HTTP thông thường trong một khoảng thời gian nhất định. Dù thế nào đi chăng nữa, nó sẽ chỉ trao đổi dữ liệu bằng kết nối HTTPS được mã hóa. Tiêu đề này cũng bảo vệ chúng tôi khỏi các cuộc tấn công hạ cấp giao thức.

Mở tệp cấu hình Nginx trong trình chỉnh sửa của bạn:

  1. sudo nano /etc/nginx/nginx.conf

Thêm dòng này vào tệp để bật HSTS:

/etc/nginx/nginx.conf
http {
...
    ##
    # Virtual Host Configs
    ##

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
    add_header Strict-Transport-Security "max-age=15768000" always;
}
...

max-age được đặt tính bằng giây. Giá trị 15768000 tương đương với 6 tháng.

Theo mặc định, tiêu đề này không được thêm vào yêu cầu tên miền phụ. Nếu bạn có tên miền phụ và muốn HSTS áp dụng cho tất cả chúng, bạn nên thêm biến includeSubDomains ở cuối dòng, như sau:

/etc/nginx/nginx.conf
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;

Lưu tệp và thoát khỏi trình chỉnh sửa.

Một lần nữa, hãy kiểm tra cấu hình để tìm lỗi cú pháp:

  1. sudo nginx -t

Cuối cùng, khởi động lại máy chủ Nginx để áp dụng các thay đổi.

  1. sudo systemctl reload nginx

Kết luận

Máy chủ Nginx của bạn hiện đang phục vụ các trang HTTP/2. Nếu bạn muốn kiểm tra độ mạnh kết nối SSL của mình, vui lòng truy cập Qualys SSL Lab và chạy thử nghiệm trên máy chủ của bạn. Nếu mọi thứ được cấu hình đúng cách, bạn sẽ nhận được điểm A+ về bảo mật.

Tham gia kênh Telegram của CloudFly để nhận thêm ưu đãi và không bỏ lỡ bất kỳ khuyến mãi nào từ CloudFly
Chia sẻ

0 câu trả lời