Ở phần 1 tôi đã trình bày cách để các bạn sử dụng Nginx làm Reverse Proxy cho Node.js server. Phần 2 này tôi sẽ hướng dẫn các bạn tạo chứng chỉ SSL/TLS bằng công cụ miễn phí để các bạn hiểu hơn về việc SSL cho 1 website, ngoài ra tôi sẽ nêu ra một số câu hỏi thường gặp và trả lời nó giúp các bạn hiểu hơn về những gì tôi đã trình bày trong 2 bài này.
Giới thiệu về Let’s Encrypt
Let’s Encrypt là một Certificate Authority (CA) cung cấp cách dễ dàng để lấy và cài đặt miễn phí các chứng chỉ TLS/SSL, qua đó cho phép mã hóa HTTPS trên các web server. Nó đơn giản hóa quy trình bằng cách cung cấp một phần software client – Certbot, với mục tiêu tự động hóa hầu hết (nếu không phải tất cả) các bước cần thiết. Hiện tại, toàn bộ quy trình lấy và cài đặt chứng chỉ đã được tự động hóa hoàn toàn trên cả Apache và Nginx.
Trong hướng dẫn này, Chúng ta sẽ sử dụng Certbot để lấy một chứng chỉ SSL miễn phí cho Nginx trên Ubuntu 20.04 và thiết lập chứng chỉ tự động gia hạn.
Cài đặt Certbot
Bước đầu tiên để sử dụng Let’s Encrypt để lấy chứng chỉ SSL là cài đặt phần mềm Certbot trên máy chủ mà các bạn đã sử dụng cho bài học phần 1.
Cài đặt Certbot và đó là plugin Nginx với apt:
sudo apt install certbot python3-certbot-nginx
Nếu bạn đã bật tường lửa ufw, bạn sẽ cần điều chỉnh cài đặt để cho phép lưu lượng HTTPS. May mắn thay, Nginx đăng ký một số cấu hình với ufw sau khi cài đặt.
Bạn có thể xem cài đặt hiện tại bằng cách gõ:
sudo ufw status
Nó có thể trông như thế này, nghĩa là chỉ cho phép lưu lượng HTTP tới máy chủ web:
OutputStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx HTTP ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx HTTP (v6) ALLOW Anywhere (v6)
Ngoài ra, để cho phép lưu lượng HTTPS, hãy cho phép cấu hình Nginx Full và xóa cấu hình Nginx HTTP.
sudo ufw allow 'Nginx Full'
sudo ufw delete allow 'Nginx HTTP'
Trạng thái của bạn bây giờ sẽ trông như thế này:
sudo ufw status
OutputStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx Full ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx Full (v6) ALLOW Anywhere (v6)
Tiếp theo, hãy chạy Certbot và lấy chứng chỉ SSL.
1. Nhận chứng chỉ SSL
Certbot cung cấp nhiều cách khác nhau để lấy chứng chỉ SSL thông qua plugin. Plugin Nginx sẽ đảm nhiệm việc cấu hình lại Nginx và tải lại cấu hình bất cứ khi nào cần thiết. Để sử dụng plugin này, hãy gõ như sau:
sudo certbot --nginx -d example.com -d www.example.com
Có 1 lưu ý nhỏ ở đây nếu domain của bạn chưa setup www thì bạn cần setup www, nếu không có www thì bạn có thể bỏ qua và câu lệnh bây giờ sẽ trông như thế này:
sudo certbot –nginx -d example.com
Điều này chạy certbot với plugin –nginx, sử dụng -d để chỉ định tên miền mà bạn muốn chứng chỉ hợp lệ.
Nếu đây là lần đầu tiên bạn chạy certbot, bạn sẽ được nhắc nhập địa chỉ email và đồng ý với các điều khoản dịch vụ. Sau khi làm như vậy, certbot sẽ liên lạc với máy chủ Let’s Encrypt, sau đó chạy kiểm tra để xác minh rằng bạn kiểm soát domain mà bạn đang yêu cầu chứng chỉ.
Nếu thành công, certbot sẽ hỏi bạn muốn định cấu hình cài đặt HTTPS của mình như thế nào.
OutputPlease choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):
Chọn lựa chọn của bạn sau đó nhấn ENTER. Cấu hình sẽ được cập nhật và Nginx sẽ tải lại để nhận các cài đặt mới. certbot sẽ kết thúc bằng một thông báo cho bạn biết quá trình đã thành công và nơi lưu trữ chứng chỉ của bạn:
OutputIMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/example.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/example.com/privkey.pem
Your cert will expire on 2020-08-18. To obtain a new or tweaked
version of this certificate in the future, simply run certbot again
with the "certonly" option. To non-interactively renew *all* of
your certificates, run "certbot renew"
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
Sau bước này bạn sẽ vào file config nginx có thể sẽ thấy các config auto được thêm vào bởi cerbot, tuy nhiên nếu không muốn bạn có thể xóa chúng đi và sử dụng các config đã được trình bày ở phần 1. Sau khi có chứng chỉ SSL bạn sẽ sử dụng nó thay thế nội dung ở 2 dòng này của file config nginx.
ssl_certificate /path/to/ssl_certificate.crt;
ssl_certificate_key /path/to/ssl_certificate.key;
2. Xác minh tính năng tự động gia hạn của Certbot
Chứng chỉ của Let’s Encrypt chỉ có hiệu lực trong 90 ngày. Điều này nhằm khuyến khích người dùng tự động hóa quy trình gia hạn chứng chỉ của họ. Gói certbot mà chúng ta đã cài đặt sẽ giải quyết vấn đề này, bằng cách thêm bộ hẹn giờ systemd sẽ chạy hai lần một ngày và tự động gia hạn bất kỳ chứng chỉ nào trong vòng ba mươi ngày kể từ ngày hết hạn.
Bạn có thể truy vấn trạng thái của bộ hẹn giờ bằng systemctl:
sudo systemctl status certbot.timer
Output● certbot.timer - Run certbot twice daily
Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled)
Active: active (waiting) since Mon 2020-05-04 20:04:36 UTC; 2 weeks 1 days ago
Trigger: Thu 2020-05-21 05:22:32 UTC; 9h left
Triggers: ● certbot.service
Để kiểm tra quá trình gia hạn, bạn có thể chạy thử với certbot:
sudo certbot renew --dry-run
Nếu thấy không có lỗi, bạn đã hoàn tất. Khi cần, Certbot sẽ gia hạn chứng chỉ của bạn và tải lại Nginx để nhận các thay đổi. Nếu quá trình gia hạn tự động không thành công, Let’s Encrypt sẽ gửi thông báo đến email đã chỉ định ở bước nhận chứng chỉ, cảnh báo khi chứng chỉ của bạn sắp hết hạn.
Câu hỏi thường gặp
1. Tại sao nên sử dụng Nginx với Node.js?
- Cân bằng tải (Load balancing): Cân bằng tải trở nên quan trọng khi tải của máy chủ tăng lên. Bằng cách sử dụng một số thuật toán, Nginx có thể phân phối lưu lượng máy chủ qua nhiều máy chủ khác nhau được chỉ định trong file nginx.conf.
- Proxy ngược (Reverse proxy): Nginx hoạt động như một trung gian giữa máy chủ và máy chủ Node.js của chúng ta. Là một proxy ngược, Nginx sẽ chặn các yêu cầu từ client đến các máy chủ, kiểm tra header hoặc nội dung của các yêu cầu từ client nếu cần, sau đó chuyển tiếp yêu cầu đến các máy chủ. Nó cũng chịu trách nhiệm gửi phản hồi trở lại cho các thiết bị client.
- Lưu trữ nội dung tạm thời (Content caching): Nginx có thể được sử dụng để lưu trữ phản hồi cho các yêu cầu và phục vụ lại phản hồi đó bất cứ khi nào các route tương ứng được gọi.
- Nén Gzip (Gzip compression): Nginx cho phép nén nội dung tĩnh, giúp giảm kích thước của phản hồi gửi đến client.
2. Reverse proxy server hoạt động như thế nào
Reverse proxy hoạt động như một trung gian giữa các thiết bị client (ví dụ, trình duyệt web) và các máy chủ backend (ví dụ, máy chủ ứng dụng hoặc máy chủ web). Thay vì chuyển tiếp trực tiếp các yêu cầu từ client đến các máy chủ backend, reverse proxy sẽ chặn các yêu cầu này và chuyển tiếp chúng thay mặt cho client. Dưới đây là cách mà một reverse proxy server hoạt động:
- Client gửi yêu cầu: Một yêu cầu truy cập vào tài nguyên trên internet được gửi từ thiết bị client, chẳng hạn như trình duyệt web. Yêu cầu này thường bao gồm URL, loại yêu cầu và các header quan trọng khác.
- Yêu cầu đến reverse proxy: Khi có sử dụng reverse proxy, nó sẽ chặn bất kỳ yêu cầu nào đến máy chủ.
- Reverse proxy đánh giá yêu cầu: Sau khi nhận được yêu cầu, reverse proxy sẽ xem xét yêu cầu dựa trên các quy tắc hoặc cấu hình đã thiết lập để quyết định cách xử lý.
- Chuyển tiếp yêu cầu đến backend: Sau khi đánh giá yêu cầu, reverse proxy sẽ chuyển tiếp nó đến máy chủ phù hợp. Máy chủ backend này có thể được chọn dựa trên các yếu tố như thuật toán cân bằng tải, quy tắc định tuyến yêu cầu hoặc kiểm tra tình trạng của máy chủ.
- Máy chủ backend xử lý yêu cầu: Máy chủ nhận yêu cầu đã được chuyển tiếp từ reverse proxy và xử lý nó tương ứng.
- Phản hồi được gửi lại cho reverse proxy: Sau khi máy chủ backend xử lý xong yêu cầu, nó sẽ tạo ra một phản hồi phù hợp.
- Reverse proxy nhận phản hồi: Reverse proxy sẽ chặn phản hồi từ máy chủ.
- Phản hồi gửi lại cho client: Cuối cùng, reverse proxy sẽ chuyển tiếp phản hồi nhận được từ máy chủ backend đến thiết bị client ban đầu đã khởi tạo yêu cầu.
3. Sự khác biệt chính giữa foward proxy và reverse proxy là gì?
Sự khác biệt chính giữa forward proxy và reverse proxy nằm ở vai trò, cách triển khai và hướng lưu lượng mà chúng xử lý.
Forward proxy quản lý lưu lượng đi ra từ các thiết bị client đến internet. Nó nhận yêu cầu từ client để truy cập một tài nguyên trực tuyến và chuyển tiếp yêu cầu đó đến vị trí mong muốn thay mặt cho client.
Ngược lại, reverse proxy xử lý lưu lượng đến từ client và chuyển tiếp đến các máy chủ backend. Khi nhận được yêu cầu từ client để truy cập một tài nguyên được lưu trữ trên các máy chủ backend, reverse proxy sẽ chuyển tiếp yêu cầu đó đến máy chủ backend liên quan thay mặt cho client.
Forward proxy thường được cài đặt trên thiết bị client hoặc trong mạng của client. Bằng cách làm cầu nối giữa thiết bị client và internet, nó cung cấp các dịch vụ như ẩn danh, lọc nội dung và caching.
Trong khi đó, reverse proxy thường được cài đặt trước các máy chủ web, ứng dụng hoặc API. Với các chức năng như cân bằng tải, kết thúc SSL (SSL termination) và bảo mật, reverse proxy đóng vai trò như một cổng giữa client và các máy chủ backend.
Forward proxy có thể được sử dụng để tuân thủ các quy tắc, lọc nội dung và nâng cao bảo mật cũng như quyền riêng tư của người dùng khi duyệt internet. Trong khi đó, các trường hợp sử dụng của reverse proxy bao gồm định tuyến các yêu cầu từ client đến máy chủ backend, kết thúc SSL, caching và cân bằng tải.
4. Các phương pháp hay để theo dõi và duy trì Nginx làm reverse proxy là gì?
Là một reverse proxy, Nginx yêu cầu giám sát và bảo trì liên tục để đảm bảo tính ổn định, hiệu suất và bảo mật cho hạ tầng web của bạn.
- Giám sát sức khỏe của máy chủ: Giám sát tình trạng máy chủ là một khía cạnh quan trọng để xây dựng các máy chủ tốt hơn. Sử dụng các công cụ giám sát như Prometheus, Grafana hoặc module Nginx status tích hợp, chúng ta có thể theo dõi sức khỏe của máy chủ.
- Thiết lập logging: Chúng ta có thể cấu hình Nginx để ghi lại các access log và error log nhằm theo dõi các yêu cầu đến, mã phản hồi, và lỗi. Nhờ đó, chúng ta có thể xác định vấn đề phát sinh trong hệ thống và các khía cạnh cần cải thiện.
- Thường xuyên cập nhật Nginx: Theo dõi các bản phát hành và bản sửa lỗi bảo mật mới nhất của Nginx để đảm bảo rằng reverse proxy của bạn được bảo vệ khỏi các lỗ hổng đã biết.
Kết luận
Qua 2 bài viết này tôi hi vọng các bạn đã hiểu thêm về reverse proxy, nginx, node.js.Nội dung tôi giới thiệu cũng chỉ là cơ bản, tuy nhiên từ đây các bạn có thể học nâng cao thêm để có thể phát triển hơn trong tương lai.Tôi hi vọng bài viết này giúp ích cho các bạn.Nếu có gì góp ý các bạn có thể comment, tôi sẽ cố gắng trả lời.Thanks for reading!
Để lại một bình luận