Thứ ba, 12/04/2016 | 00:00 GMT+7

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:

Đó 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 :

Ouput của sudo nginx -v
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:

/ etc / nginx / sites-available / default
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:

/ etc / nginx / sites-available / default
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:

/ etc / nginx / sites-available / default
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:

Đầ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 

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:

/ etc / nginx / sites-available / default
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; .

/etc/nginx/nginx.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

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:

/ etc / nginx / sites-available / default
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):

/ etc / nginx / sites-available / default
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:

/ etc / nginx / sites-available / default
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.

Công cụ nhà phát triển Chrome kiểm tra 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:

/etc/nginx/nginx.conf
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 :

/etc/nginx/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:

/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 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.


Tags:

Các tin liên quan

Cách thêm module gzip vào Nginx trên CentOS 7
2016-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