Cách thiết lập Nginx với Hỗ trợ HTTP / 2 trên Ubuntu 16.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ợ cho phần lớn các giao thức khác nhau.Một trong những giao thức được hỗ trợ là HTTP / 2 tương đối mới, được xuất bản vào tháng 5 năm 2015. Ưu điểm chính của HTTP / 2 là tốc độ truyền cao cho các trang web giàu nội dung.
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:
- Ubuntu 16.04 Server
- User không phải root có quyền sudo (Kiểm tra Cài đặt server ban đầu với Ubuntu 16.04 để biết chi tiết.)
- Tên domain đã đăng ký đầy đủ. 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 .
- Đảm bảo rằng domain của bạn được cấu hình để trỏ đến Server. Hãy xem hướng dẫn này nếu bạn cần trợ giúp.
- Chứng chỉ SSL. Tạo certificate tự ký , nhận certificate miễn phí từ Let's Encrypt hoặc mua certificate từ nhà cung cấp khác .
Đó là tất cả. Nếu bạn có mọi thứ được liệt kê ở trên, bạn đã sẵn sàng để bắt đầu.
Sự khác biệt giữa HTTP 1.1 và HTTP / 2
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.
Bước 1 - Cài đặt version mới nhất của Nginx
Hỗ trợ giao thức HTTP / 2 đã được giới thiệu trong Nginx 1.9.5. May mắn là repository mặc định trong Ubuntu 16.04 chứa version cao hơn version này, vì vậy ta không phải thêm repository của bên thứ ba.
Đầu tiên, hãy cập nhật danh sách các gói có sẵn trong trình cài đặt gói apt:
- sudo apt-get update
Sau đó, cài đặt Nginx:
- sudo apt-get install nginx
Sau khi quá trình cài đặt kết thúc, bạn có thể kiểm tra version của Nginx bằng lệnh :
- sudo nginx -v
Đầu ra phải giống như sau :
nginx version: nginx/1.10.0 (Ubuntu)
Trong một số bước tiếp theo, ta sẽ sửa đổi các file cấu hình Nginx. Mỗi bước sẽ thay đổi một tùy chọn cấu hình Nginx. Ta sẽ kiểm tra cú pháp của file cấu hình trong quá trình này. Cuối cùng, ta sẽ xác minh Nginx hỗ trợ HTTP / 2 và thực hiện một vài thay đổi để tối ưu hóa hiệu suất.
Bước 2 - Thay đổi cổng lắng nghe và bật HTTP / 2
Thay đổi đầu tiên ta sẽ thực hiện là thay đổi cổng nghe từ 80
thành 443
.
Hãy mở file cấu hình:
- sudo nano /etc/nginx/sites-available/default
Theo mặc định, Nginx được đặt để lắng nghe cổng 80, là cổng HTTP tiêu chuẩn:
listen 80 default_server; listen [::]:80 default_server;
Như bạn thấy , ta có hai biến listen
khác nhau. Cái đầu tiên dành cho tất cả các kết nối IPv4. Cái thứ hai dành cho các kết nối IPv6. Ta sẽ bật mã hóa cho cả hai.
Sửa đổi cổng nghe thành 443
, được sử dụng bởi giao thức HTTPS:
listen 443 ssl http2 default_server; listen [::]:443 ssl http2 default_server;
Lưu ý ngoài ssl
, ta cũng đã thêm http2
vào dòng. Biến này yêu cầu Nginx sử dụng HTTP / 2 với các trình duyệt được hỗ trợ.
Bước 3 - Thay đổi tên server
Ta sử dụng mục nhập server_name
để chỉ định domain nào sẽ được liên kết với file cấu hình. Tìm mục nhập server_name
trong file cấu hình.
Theo mặc định, server_name
được đặt thành _
(gạch dưới), nghĩa là file cấu hình chịu trách nhiệm cho tất cả các yêu cầu đến. Thay đổi _
thành domain thực của bạn, như sau:
server_name example.com;
Lưu file cấu hình và chỉnh sửa 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
Bước 4 - Thêm certificate SSL
Tiếp theo, bạn cần cấu hình Nginx để sử dụng certificate SSL của bạn . Nếu bạn không biết certificate SSL là gì hoặc hiện không có certificate SSL nào, hãy làm theo một trong các hướng dẫn trong phần Yêu cầu của bài viết này.
Tạo một folder để lưu trữ certificate SSL của bạn bên trong folder cấu hình Nginx:
- sudo mkdir /etc/nginx/ssl
Sao chép certificate của bạn và private key vào vị trí này. Ta cũng sẽ đổi tên các file để cho biết chúng được liên kết với domain nào. Điều này sẽ có ích trong tương lai, khi bạn có nhiều hơn một domain được liên kết với server này. Thay thế example.com
bằng tên server thực tế của bạn:
- sudo cp /path/to/your/certificate.crt /etc/nginx/ssl/example.com.crt
- sudo cp /path/to/your/private.key /etc/nginx/ssl/example.com.key
Bây giờ, hãy mở lại file cấu hình của ta và cấu hình SSL.
- sudo nano /etc/nginx/sites-available/default
Trên các dòng mới bên trong khối server
, hãy xác định vị trí của các certificate của bạn:
ssl_certificate /etc/nginx/ssl/example.com.crt; ssl_certificate_key /etc/nginx/ssl/example.com.key;
Lưu file và thoát khỏi editor .
Bước 5 - Tránh các bộ mật mã cũ
HTTP / 2 có một danh sách đen khổng lồ gồm 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à một loạt các thuật toán mật mã, mô tả cách mã hóa dữ liệu truyền.
Ta sẽ sử dụng một bộ mật mã thực sự phổ biến, có tính bảo mật đã được chấp thuận bởi những gã khổng lồ Internet như CloudFlare. Nó không cho phép sử dụng mã hóa MD5 (được gọi là không an toàn từ năm 1996, nhưng bất chấp thực tế, việc sử dụng nó vẫn còn phổ biến cho đến ngày nay).
Mở file cấu hình sau:
- sudo nano /etc/nginx/nginx.conf
Thêm dòng này sau ssl_prefer_server_ciphers on;
.
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
Bước 6 - Tăng cường bảo mật trao đổi khóa
Bước đầu tiên trong quá trình cài đặt kết nối an toàn là trao đổi private key giữa server và client . Vấn đề là cho đến thời điểm này, kết nối giữa chúng không được mã hóa - nghĩa là việc chuyển dữ liệu có thể nhìn thấy đối với bất kỳ bên thứ ba nào. Đó là lý do tại sao ta cần thuật toán Diffie – Hellman – Merkle. Các chi tiết kỹ thuật về cách nó hoạt động là một vấn đề phức tạp không thể giải thích một cách ngắn gọn, nhưng nếu bạn thực sự quan tâm đến chi tiết, bạn có thể xem video YouTube này .
Theo mặc định, Nginx sử dụng khóa DHE (Ephemeral Diffie-Hellman) 1028-bit, tương đối dễ giải mã. Để bảo mật tối đa, ta nên xây dựng khóa DHE của riêng mình, an toàn hơn.
Để làm điều đó, hãy sử dụng lệnh sau:
- sudo openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048
Lưu ý ta nên tạo các tham số DH trong cùng một folder với certificate SSL của ta . Trong hướng dẫn này, các certificate được đặt trong /etc/nginx/ssl/
. Lý do cho điều này là Nginx luôn tìm kiếm khóa DHE do user cung cấp trong folder certificate và sử dụng nó nếu tồn tại.
Biến sau đường dẫn file (trong trường hợp của ta là 2048
) chỉ định độ dài của khóa. Khóa có độ dài 2048 bit là đủ an toàn và được Mozilla Foundation khuyến nghị , nhưng nếu bạn đang tìm kiếm nhiều mã hóa hơn nữa, bạn có thể thay đổi nó thành 4096
.
Quá trình tạo sẽ mất khoảng 5 phút.
Sau khi hoàn tất, hãy mở lại file cấu hình Nginx mặc định:
- sudo nano /etc/nginx/sites-available/default
Trên một dòng mới bên trong khối server
, xác định vị trí của khóa DHE tùy chỉnh của bạn:
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
Bước 7 - Chuyển hướng tất cả Yêu cầu HTTP sang HTTPS
Vì ta chỉ quan tâm đến việc phân phát nội dung thông qua HTTPS, ta nên cho Nginx biết nó phải làm gì nếu server nhận được yêu cầu HTTP.
Ở cuối file của ta , ta sẽ tạo một khối server mới để chuyển hướng tất cả các yêu cầu HTTP đến HTTPS (hãy đảm bảo thay thế tên server bằng domain thực của bạn):
server { listen 80; listen [::]:80; server_name example.com; return 301 https://$server_name$request_uri; }
Lưu file và thoát khỏi file cấu hình.
Kiểm tra cấu hình để biết lỗi cú pháp:
- sudo nginx -t
Bước 8 - Reload Nginx
Đó là nó cho tất cả các thay đổi cấu hình Nginx. Vì ta đã kiểm tra lỗi cú pháp với mỗi thay đổi, bạn nên sẵn sàng khởi động lại Nginx và kiểm tra các thay đổi của bạn .
Tóm lại, bỏ qua các dòng đã comment , file cấu hình của bạn bây giờ sẽ trông giống như sau:
server { listen 443 ssl http2 default_server; listen [::]:443 ssl http2 default_server; root /var/www/html; index index.html index.htm index.nginx-debian.html; server_name example.com; location / { try_files $uri $uri/ =404; } ssl_certificate /etc/nginx/ssl/example.com.crt; ssl_certificate_key /etc/nginx/ssl/example.com.key; ssl_dhparam /etc/nginx/ssl/dhparam.pem; } server { listen 80; listen [::]:80; server_name example.com; return 301 https://$server_name$request_uri; }
Để áp dụng các thay đổi, hãy khởi động lại server Nginx.
- sudo systemctl restart nginx
Bước 9 - Xác minh các thay đổi
Hãy kiểm tra xem server của ta có đang hoạt động hay không. Mở trình duyệt web và chuyển đến domain của bạn (thay thế example.com
bằng domain thực của bạn):
example.com
Nếu mọi thứ được cấu hình đúng cách, bạn sẽ được tự động chuyển hướng đến HTTPS. Bây giờ, hãy kiểm tra xem HTTP / 2 có hoạt động không: mở Công cụ nhà phát triển Chrome ( Xem -> Nhà phát triển -> Công cụ nhà phát triển ) và reload trang ( Xem -> Reload trang này ). Sau đó, chuyển đến tab Mạng , nhấp vào hàng tiêu đề bảng bắt đầu bằng Tên , nhấp chuột phải vào nó và chọn tùy chọn Giao thức .
Đến đây bạn sẽ thấy h2
(viết tắt của HTTP / 2) trong một cột mới cho trang web phục vụ nội dung HTTP / 2.
Đến đây, server của ta đã sẵn sàng phân phát nội dung thông qua giao thức HTTP / 2, nhưng vẫn còn một số việc ta nên làm để chuẩn bị cho server được sử dụng trong quá trình production .
Bước 10 - Tối ưu hóa Nginx để có hiệu suất tốt nhất
Trong bước này, ta sẽ điều chỉnh file cấu hình Nginx chính để có hiệu suất và bảo mật tốt nhất.
Trước hết, hãy mở nginx.conf
bằng lệnh nội dung sau vào console :
- sudo nano /etc/nginx/nginx.conf
Bật lưu trữ thông tin đăng nhập kết nối
So với HTTP, HTTPS mất thời gian tương đối lâu hơn để cài đặt kết nối ban đầu giữa server và user . Để giảm thiểu sự khác biệt này về tốc độ tải trang, ta sẽ bật bộ nhớ đệm của thông tin xác thực kết nối. Điều đó nghĩa là thay vì tạo phiên mới trên mọi trang được yêu cầu, server sẽ sử dụng version thông tin xác thực được lưu trong bộ nhớ cache.
Để bật cache phiên, hãy thêm những dòng này vào cuối khối http
của file nginx.conf
của bạn:
ssl_session_cache shared:SSL:5m; ssl_session_timeout 1h;
ssl_session_cache
chỉ định kích thước của cache sẽ chứa thông tin phiên. 1 MB của nó có thể lưu trữ thông tin cho khoảng 4000 phiên. Giá trị mặc định là 5 MB sẽ là quá đủ đối với hầu hết user , nhưng nếu bạn mong đợi lưu lượng truy cập thực sự lớn, bạn có thể tăng giá trị này tương ứng.
ssl_session_timeout
giới hạn thời gian các phiên cụ thể được lưu trữ trong cache . Giá trị này không được quá lớn (hơn một giờ), nhưng đặt giá trị quá thấp cũng vô nghĩa.
Bật bảo mật truyền tải nghiêm ngặt HTTP (HSTS)
Mặc dù ta đã thực hiện tất cả các yêu cầu HTTP thông thường chuyển hướng đến HTTPS trong file cấu hình Nginx của bạn , ta cũng nên bật Bảo mật truyền tải nghiêm ngặt HTTP để tránh phải thực hiện các chuyển hướng đó ngay từ đầu.
Nếu trình duyệt tìm thấy một tiêu đề HSTS, nó 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 sẽ bảo vệ ta khỏi các cuộc tấn công hạ cấp giao thức.
Thêm dòng này trong nginx.conf
:
add_header Strict-Transport-Security "max-age=15768000" always;
Độ max-age
được đặt bằng giây. 15768000 giây tương đương với 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 restart 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 thêm module gzip vào Nginx trên CentOS 72016-03-15
Cách thêm module gzip vào Nginx trên Ubuntu 14.04
2016-03-09
Cách thiết lập xác thực HTTP cơ bản với Nginx trên Ubuntu 14.04
2016-02-22
Cách thiết lập xác thực HTTP cơ bản với Nginx trên CentOS 7
2016-02-22
Cách bảo mật Nginx trên Ubuntu 14.04
2016-02-12
Cách bảo mật Nginx bằng Let's Encrypt trên CentOS 7
2016-01-26
Cách bảo mật Nginx bằng Let's Encrypt trên Ubuntu 14.04
2015-12-17
Cách chạy Nginx trong Docker Container trên Ubuntu 14.04
2015-10-28
Cách thêm ngx_pagespeed vào Nginx trên CentOS 7
2015-09-30
Cách thêm ngx_pagespeed vào Nginx trên Ubuntu 14.04
2015-09-22