Ngày đăng: 20 tháng 10 năm 2023
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:
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.
Trước khi bắt đầu, chúng ta sẽ cần một vài điều:
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 đó.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:
- 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
:
...
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
:
...
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:
- sudo nginx -t
Nếu cú pháp không có lỗi, bạn sẽ thấy kết quả sau:
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.
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:
- 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ó:
# 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:
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:
- sudo nano /etc/nginx/snippets/ssl-params.conf
Xác định vị trí dòng sau:
...
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:
...
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:
- 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:
- 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.
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 đề:
- curl -I -L https://your_domain
Bạn sẽ thấy kết quả sau:
OutputHTTP/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.
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.
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:
- sudo nano /etc/nginx/nginx.conf
Thêm dòng này vào tệp để bật HSTS:
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:
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:
- sudo nginx -t
Cuối cùng, khởi động lại máy chủ Nginx để áp dụng các thay đổi.
- sudo systemctl reload nginx
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.