Thứ ba, 09/06/2020 | 00:00 GMT+7

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

Nginx là một web server open-souce nhanh và tin cậy . Nó trở nên phổ biến do 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à một version mới của 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ừ server đế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 với công chúng vào năm 1999 khi các trang web thường chỉ là một file HTML duy nhất với biểu định kiểu CSS nội tuyến. Internet đã thay đổi đáng kể kể từ đó và bây giờ 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 cho hầu hết các trang web hiện đại vì nó download các phần của trang trong một hàng đợi (phần trước phải download hoàn toàn trước khi download phần tiếp theo bắt đầu), và một trang web hiện đại trung bình yêu cầu download khoảng 100 yêu cầu (mỗi yêu cầu là ảnh, file js, file css, v.v.).

HTTP / 2 giải quyết 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 download song song, không phải trong hàng đợi
  • Tiêu đề HTTP được nén
  • Chuyển trang dưới dạng file binary , không phải dưới dạng file văn bản, hiệu quả hơn
  • Server có thể "đẩy" dữ liệu ngay cả khi không có yêu cầu của user , điều này giúp cải thiện tốc độ cho những user 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, 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 cài đặt server 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 cài đặt server Nginx nhanh chóng và an toàn với hỗ trợ HTTP / 2.

Yêu cầu

Trước khi bắt đầu, ta cần một số điều sau:

Bước 1 - Bật hỗ trợ HTTP / 2

Nếu bạn đã làm theo bước cài đặt khối server trong hướng dẫn cài đặt Nginx , bạn sẽ có một khối server cho domain của bạn tại /etc/nginx/sites-available/ your_domain với chỉ thị server_name đã được cài đặt thích hợp. Thay đổi đầu tiên ta sẽ thực hiện là sửa đổi khối server domain của bạn để sử dụng HTTP / 2.

Mở file cấu hình cho domain của bạn:

  • sudo nano /etc/nginx/sites-available/your_domain

Trong file , định vị các biến listen liên kết với cổng 443 :

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

Cái đầu tiên dành cho các kết nối IPv6. Cái thứ hai dành cho tất cả các kết nối IPv4. Ta sẽ bật HTTP / 2 cho cả hai.

Sửa đổi từng chỉ thị listen để bao gồm http2 :

your_domain '> / 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 file cấu hình và thoát khỏi editor .

Khi nào bạn thực hiện thay đổi đối với file 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:

Đầu ra của 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, ta sẽ cấu hình server của bạn để sử dụng danh sách mật mã hạn chế hơn.

Bước 2 - Xóa bộ mật mã cũ và không an toàn

HTTP / 2 có một danh sách đen các mật mã cũ và không an toàn, vì vậy ta phải tránh chúng. Bộ mật mã là các thuật toán mật mã 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 đã cấu hình certificate TLS / SSL của bạn cho Nginx.

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

Mở file cấu hình khối server cho domain của bạn:

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

Tìm dòng bao gồm file options-ssl-nginx.conf và comment nó:

your_domain '> / 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 các mật mã được phép:

your_domain '> / 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 file và thoát khỏi editor .

Nếu bạn đã sử dụng certificate tự ký hoặc sử dụng certificate từ bên thứ ba và cấu hình nó theo các yêu cầu , hãy mở file /etc/nginx/snippets/ssl-params.conf trong editor của bạn:

  • 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 giống như sau:

/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 file và thoát khỏi editor .

, 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

Với server được khởi động lại, hãy xác minh nó hoạt động.

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

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

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

  • 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 HTTP / 2 đang được sử dụng trong Google Chrome. Mở Chrome và chuyển đến http:// your_domain . Mở Công cụ dành cho nhà phát triển Chrome ( Xem -> Nhà phát triển -> Công cụ dành cho nhà phát triển ) và reload trang ( Xem -> Reload trang này ). Điều hướng đến tab Mạng , bấm chuột phải vào hàng tiêu đề bảng bắt đầu bằng Tên và chọn tùy chọn Giao thức từ menu bật lên.

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

Công cụ nhà phát triển Chrome kiểm tra HTTP / 2

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

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

Ngay cả khi các yêu cầu HTTP của bạn chuyển hướng đến HTTPS, bạn có thể bật Bảo mật truyền tải nghiêm ngặt HTTP (HSTS) để tránh phải thực hiện các 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 server qua HTTP thông thường trong một khoảng thời gian nhất định. Không có vấn đề gì, nó sẽ trao đổi dữ liệu chỉ sử dụng kết nối HTTPS được mã hóa. Tiêu đề này cũng bảo vệ ta khỏi các cuộc tấn công hạ cấp giao thức.

Mở file cấu hình Nginx trong editor :

sudo nano /etc/nginx/nginx.conf 

Thêm dòng này vào file để 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 bằng giây. Giá trị 15768000 tương đương 6 tháng.

Theo mặc định, tiêu đề này không được thêm vào các yêu cầu domain phụ. Nếu bạn có các domain 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 file và thoát khỏi editor .

, 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 server Nginx để áp dụng các thay đổi.

  • sudo systemctl reload nginx

Kết luận

Server Nginx của bạn hiện đang cung cấp các trang HTTP / 2. Nếu bạn muốn kiểm tra độ bền của kết nối SSL, vui lòng truy cập Phòng thí nghiệm SSL của Qualys và chạy thử nghiệm trên server 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 + để bảo mật.


Tags:

Các tin trước

Cách cung cấp các ứng dụng Flask với uWSGI và Nginx trên Ubuntu 20.04 2020-05-26
Cách cung cấp các ứng dụng Flask với uWSGI và Nginx trên Ubuntu 18.04 2020-05-21
Cách bảo mật Nginx bằng Let's Encrypt trên Ubuntu 20.04 2020-05-20
Cách cung cấp các ứng dụng Flask với Gunicorn và Nginx trên Ubuntu 20.04 2020-05-20
Cách cài đặt và cấu hình Laravel với Nginx trên Ubuntu 20.04 2020-05-19
Cách cài đặt Nginx trên Ubuntu 18.04 2020-05-06
Cách cài đặt Nginx trên Ubuntu 20.04 [Quickstart] 2020-05-04
Cách cài đặt Nginx trên Ubuntu 20.04 2020-04-24
Cách tối ưu hóa cấu hình Nginx 2020-03-26
Cách thiết lập Laravel, Nginx và MySQL với Docker Compose 2020-03-09