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:
- Một server Ubuntu 18.04 được cài đặt theo hướng dẫn cài đặt server ban đầu Ubuntu 18.04 , bao gồm user không phải root có quyền sudo và firewall .
- Nginx được cài đặt trên server của bạn, bạn có thể thực hiện việc này theo Cách cài đặt Nginx trên Ubuntu 18.04 .
- Tên domain được cấu hình để trỏ đến server của bạn. Bạn có thể mua một cái trên Namecheap hoặc nhận một cái miễn phí trên Freenom . Bạn có thể tìm hiểu cách trỏ domain đến DigitalOcean Server theo tài liệu về Cách quản lý domain của bạn với DigitalOcean .
- Chứng chỉ TLS / SSL được cấu hình cho server của bạn. Bạn có ba lựa chọn:
- Bạn có thể nhận certificate miễn phí từ Let's Encrypt 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à cấu hình certificate tự ký theo Cách tạo certificate 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à cấu hình Nginx để sử dụng nó theo các Bước từ 2 đến 6 của Cách tạo Chứng chỉ SSL tự ký cho Nginx trong Ubuntu 18.04 .
- Nginx được cấu hình để chuyển hướng lưu lượng truy cập từ cổng
80
sang cổng443
, điều này sẽ được đề cập trong các yêu cầu trước đó. - Nginx được cấu hình để sử dụng khóa Ephemeral Diffie-Hellman (DHE) 2048 bit hoặc cao hơn, khóa này cũng phải được đề cập trong các yêu cầu trước đó.
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
:
... 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
:
... 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:
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ó:
# 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:
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:
... 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:
... 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:
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 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.
Đế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:
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:
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.
Các tin liên quan
Cách cung cấp các ứng dụng Flask với uWSGI và Nginx trên Ubuntu 20.042020-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