Cách cấu hình Nginx làm Reverse Proxy: Hướng dẫn từng bước
Giới thiệu
Nginx là một trong những máy chủ web và reverse proxy phổ biến nhất trên thế giới, nổi tiếng với hiệu suất cao, khả năng mở rộng và tính linh hoạt. Nó thường được sử dụng như một reverse proxy để chuyển tiếp các yêu cầu từ khách hàng đến các máy chủ backend, mang lại nhiều lợi ích như cân bằng tải, bảo mật, bộ nhớ đệm và nhiều hơn nữa.
Một reverse proxy là một máy chủ nằm giữa các thiết bị khách (như trình duyệt) và các máy chủ backend (như máy chủ web hoặc máy chủ ứng dụng). Khi khách hàng gửi yêu cầu, reverse proxy sẽ chuyển tiếp những yêu cầu đó đến máy chủ backend thích hợp, và sau đó gửi phản hồi của máy chủ trở lại cho khách hàng. Cách tiếp cận này cho phép kiểm soát tập trung lưu lượng, cũng như cải thiện bảo mật và hiệu suất.
Trong hướng dẫn này, chúng tôi sẽ hướng dẫn bạn qua các bước cần thiết để cấu hình Nginx làm reverse proxy, bao gồm cài đặt, cấu hình cơ bản, thiết lập SSL và cân bằng tải. Dù bạn đang triển khai một ứng dụng web đơn giản hay quản lý cơ sở hạ tầng máy chủ phức tạp, Nginx có thể là một công cụ mạnh mẽ để cải thiện cả bảo mật và hiệu quả của hệ thống của bạn.
Cuối cùng của hướng dẫn này, bạn sẽ hiểu cách:
- Thiết lập một reverse proxy cơ bản với Nginx.
- Cấu hình SSL cho giao tiếp an toàn.
- Sử dụng Nginx để cân bằng tải giữa nhiều máy chủ backend.

Reverse Proxy là gì?
Một reverse proxy là một máy chủ nằm giữa các thiết bị khách và các máy chủ backend, chuyển tiếp các yêu cầu của khách hàng đến máy chủ backend thích hợp và trả lại phản hồi cho khách hàng. Về cơ bản, reverse proxy hoạt động như một trung gian, nhận các yêu cầu của khách hàng thay mặt cho máy chủ backend và chuyển tiếp chúng đến máy chủ, máy chủ sẽ xử lý và trả về kết quả.
Khác với một forward proxy, cái mà chuyển tiếp các yêu cầu từ khách hàng đến internet, reverse proxy làm điều ngược lại: nó xử lý các yêu cầu đến từ khách hàng và gửi chúng đến máy chủ backend đúng. Sự phân biệt này rất quan trọng, vì reverse proxy bảo vệ các máy chủ backend khỏi việc tiếp xúc trực tiếp với internet, nâng cao bảo mật và quyền riêng tư.
Sự khác biệt giữa Forward Proxy và Reverse Proxy
Tính năng | Forward Proxy | Reverse Proxy |
---|---|---|
Mục đích chính | Chuyển tiếp các yêu cầu của khách hàng đến internet. | Chuyển tiếp các yêu cầu của khách hàng đến các máy chủ backend. |
Vị trí | Giữa khách hàng và internet. | Giữa khách hàng và máy chủ backend. |
Khả năng nhìn thấy | Khách hàng biết về forward proxy. | Khách hàng thường không biết về reverse proxy. |
Các trường hợp sử dụng phổ biến | Lọc web, vượt qua các hạn chế địa lý, ẩn danh. | Cân bằng tải, bảo mật, bộ nhớ đệm, kết thúc SSL. |
Các trường hợp sử dụng cho Reverse Proxy
Một reverse proxy có thể cung cấp nhiều lợi ích cho cơ sở hạ tầng của bạn, chẳng hạn như:
-
Cân bằng tải: Phân phối lưu lượng đến từ nhiều máy chủ backend để cải thiện hiệu suất, độ tin cậy và khả năng mở rộng. Điều này giúp đảm bảo rằng không có máy chủ nào bị quá tải với các yêu cầu.
-
Bảo mật: Ẩn danh tính và cấu trúc nội bộ của các máy chủ backend của bạn, bảo vệ chúng khỏi việc tiếp xúc trực tiếp với internet. Reverse proxy cũng có thể cung cấp các lớp bảo mật bổ sung, chẳng hạn như tường lửa ứng dụng web hoặc kiểm soát truy cập.
-
Bộ nhớ đệm: Lưu trữ các phản hồi từ các máy chủ backend, giảm tải cho các tài nguyên backend và tăng tốc độ phản hồi cho nội dung thường xuyên được yêu cầu.
-
Kết thúc SSL: Xử lý mã hóa và giải mã Secure Sockets Layer (SSL) thay mặt cho các máy chủ backend. Điều này đơn giản hóa việc quản lý chứng chỉ SSL và giảm tải công việc tính toán từ các máy chủ backend.
-
Nén và Tối ưu hóa: Nén các phản hồi trước khi gửi đến khách hàng, giảm mức sử dụng băng thông và cải thiện thời gian tải.
-
Phân phối nội dung: Có thể được sử dụng để phân phối nội dung từ nhiều máy chủ backend, cung cấp một giao diện nhất quán cho khách hàng trong khi quản lý các tài nguyên máy chủ khác nhau ở phía sau.
Các yêu cầu cần có
Trước khi bạn bắt đầu cấu hình Nginx làm reverse proxy, có một số yêu cầu cần thiết mà bạn cần phải có. Những yêu cầu này bao gồm kiến thức cơ bản về Nginx, quyền truy cập vào một máy chủ và phần mềm cần thiết đã được cài đặt. Phần này sẽ hướng dẫn bạn những gì bạn cần để bắt đầu.
1. Kiến thức cơ bản về Nginx
Để cấu hình Nginx làm reverse proxy, bạn nên có hiểu biết cơ bản về cách Nginx hoạt động, bao gồm các tệp cấu hình và cấu trúc của nó. Nếu bạn chưa quen thuộc với Nginx, bạn có thể tham khảo tài liệu chính thức của Nginx để hiểu sâu hơn về phần mềm này.
Nginx sử dụng các tệp cấu hình, thường nằm trong /etc/nginx/
(trên các hệ thống Linux), để định nghĩa các cài đặt máy chủ. Tệp cấu hình chính là nginx.conf
, và các tệp cấu hình bổ sung có thể được bao gồm tùy thuộc vào thiết lập của bạn (ví dụ: trong /etc/nginx/sites-available/
và /etc/nginx/sites-enabled/
cho các bản phân phối dựa trên Debian).
2. Nginx đã được cài đặt trên máy chủ của bạn
Bạn sẽ cần phải có Nginx được cài đặt trên máy chủ của mình. Dưới đây là hướng dẫn cài đặt cho các bản phân phối Linux phổ biến.
Cài đặt Nginx trên Ubuntu/Debian
Để cài đặt Nginx trên các hệ thống Ubuntu hoặc Debian, hãy sử dụng các lệnh sau:
sudo apt update
sudo apt install nginx
Sau khi cài đặt, bạn có thể kiểm tra xem Nginx có đang chạy hay không bằng cách sử dụng:
sudo systemctl status nginx
Nếu Nginx không chạy, bạn có thể khởi động nó bằng:
sudo systemctl start nginx
Cài đặt Nginx trên CentOS/RHEL
Trên các hệ thống CentOS hoặc RHEL, hãy sử dụng các lệnh sau:
sudo yum install epel-release
sudo yum install nginx
Khởi động Nginx:
sudo systemctl start nginx
Xác minh cài đặt Nginx
Khi Nginx đã được cài đặt, hãy xác minh rằng nó đang chạy bằng cách mở trình duyệt web và điều hướng đến địa chỉ IP của máy chủ của bạn (ví dụ: http://your_server_ip
). Bạn sẽ thấy trang chào mừng của Nginx.
Ngoài ra, bạn có thể kiểm tra từ dòng lệnh bằng cách chạy:
curl http://localhost
Bạn sẽ thấy nội dung của trang HTML mặc định của Nginx.
3. Máy chủ Backend (Tùy chọn để thử nghiệm)
Trong khi Nginx có thể được cấu hình làm reverse proxy cho nhiều loại máy chủ backend (như ứng dụng web, máy chủ API, v.v.), cho hướng dẫn này, chúng tôi sẽ sử dụng một máy chủ backend đơn giản để thử nghiệm. Bạn có thể sử dụng một ứng dụng web chạy trên một cổng cụ thể, chẳng hạn như ứng dụng Node.js hoặc Python Flask, hoặc bạn có thể thiết lập một máy chủ HTTP đơn giản.
Ví dụ, bạn có thể cài đặt một máy chủ HTTP cơ bản python3
để thử nghiệm cấu hình reverse proxy:
# Khởi động một máy chủ HTTP đơn giản trên cổng 8080
python3 -m http.server 8080
Điều này sẽ khởi động một máy chủ cơ bản trên http://localhost:8080
. Bạn có thể sử dụng điều này làm máy chủ backend của mình để thử nghiệm cấu hình reverse proxy.
4. Truy cập dòng lệnh
Bạn sẽ cần quyền truy cập dòng lệnh vào máy chủ của mình, thông qua một terminal hoặc qua SSH (nếu bạn đang làm việc trên một máy chủ từ xa). Đảm bảo bạn có quyền cần thiết để cài đặt phần mềm và chỉnh sửa các tệp cấu hình trên máy chủ.
Để truy cập một máy chủ từ xa qua SSH, hãy sử dụng:
ssh user@your_server_ip
Hãy chắc chắn thay thế user
bằng tên người dùng thực tế của bạn và your_server_ip
bằng địa chỉ IP của máy chủ của bạn.
5. Trình soạn thảo văn bản
Bạn sẽ cần một trình soạn thảo văn bản để chỉnh sửa các tệp cấu hình. Trên hầu hết các hệ thống Linux, bạn có thể sử dụng các trình soạn thảo như nano
, vim
hoặc vi
. Ví dụ:
sudo nano /etc/nginx/nginx.conf
Bước 1: Cài đặt Nginx
Trước khi bạn có thể cấu hình Nginx làm reverse proxy, bạn cần phải có Nginx được cài đặt trên máy chủ của mình. Quy trình cài đặt sẽ khác nhau tùy thuộc vào hệ điều hành của bạn. Trong phần này, chúng tôi sẽ đề cập đến các bước cài đặt Nginx trên các hệ thống Ubuntu/Debian và CentOS/RHEL.
Cài đặt Nginx trên Ubuntu/Debian
Nếu bạn đang sử dụng hệ thống dựa trên Ubuntu hoặc Debian, bạn có thể cài đặt Nginx bằng cách làm theo các bước đơn giản sau:
-
Cập nhật danh sách gói của bạn
Trước khi cài đặt bất kỳ phần mềm mới nào, tốt nhất là cập nhật danh sách gói để đảm bảo bạn nhận được phiên bản mới nhất của Nginx.sudo apt update
-
Cài đặt Nginx
Cài đặt Nginx bằng cách sử dụng trình quản lý góiapt
.sudo apt install nginx
-
Khởi động Nginx
Sau khi cài đặt hoàn tất, bạn có thể khởi động dịch vụ Nginx bằng cách sử dụngsystemctl
:sudo systemctl start nginx
-
Bật Nginx khởi động cùng hệ thống
Để đảm bảo rằng Nginx tự động khởi động khi máy chủ của bạn khởi động lại, hãy bật nó để chạy cùng hệ thống:sudo systemctl enable nginx
-
Kiểm tra trạng thái Nginx
Xác minh rằng Nginx đang chạy đúng cách bằng cách kiểm tra trạng thái của nó:sudo systemctl status nginx
Bạn sẽ thấy đầu ra cho biết rằng Nginx đang hoạt động và chạy.
Xác minh cài đặt Nginx (Ubuntu/Debian)
Khi Nginx đã được cài đặt và đang chạy, bạn có thể xác minh rằng nó đang hoạt động bằng cách mở trình duyệt web và nhập địa chỉ IP của máy chủ của bạn. Bạn sẽ thấy trang chào mừng mặc định của Nginx, điều này xác nhận rằng Nginx đang hoạt động đúng cách.
Ngoài ra, bạn có thể sử dụng curl
để kiểm tra:
curl http://localhost
Bạn sẽ nhận được nội dung HTML từ trang mặc định của Nginx.
Cài đặt Nginx trên CentOS/RHEL
Đối với các hệ thống CentOS, RHEL hoặc Fedora, bạn có thể cài đặt Nginx với các bước sau:
-
Cài đặt kho lưu trữ EPEL
Đầu tiên, bạn cần kích hoạt kho lưu trữ EPEL (Extra Packages for Enterprise Linux), chứa Nginx và các gói hữu ích khác.sudo yum install epel-release
-
Cài đặt Nginx
Cài đặt Nginx bằng cách sử dụng trình quản lý góiyum
:sudo yum install nginx
-
Khởi động Nginx
Khi đã cài đặt, hãy khởi động dịch vụ Nginx:sudo systemctl start nginx
-
Bật Nginx khởi động cùng hệ thống
Để Nginx tự động khởi động sau khi khởi động lại, hãy sử dụng lệnh sau:sudo systemctl enable nginx
-
Kiểm tra trạng thái Nginx
Kiểm tra trạng thái của Nginx để đảm bảo nó đang chạy:sudo systemctl status nginx
Bạn sẽ thấy đầu ra cho biết rằng Nginx đang hoạt động và chạy.
Xác minh cài đặt Nginx (CentOS/RHEL)
Giống như trên Ubuntu/Debian, bạn có thể kiểm tra xem Nginx có đang chạy hay không bằng cách điều hướng đến địa chỉ IP của máy chủ của bạn trong trình duyệt. Bạn sẽ thấy trang chào mừng mặc định của Nginx.
Ngoài ra, hãy sử dụng curl
để xác minh:
curl http://localhost
Bạn sẽ nhận được nội dung HTML của trang mặc định của Nginx.
Các câu hỏi thường gặp (FAQ)
Sự khác biệt giữa reverse proxy và forward proxy là gì?
Một reverse proxy nằm giữa các thiết bị khách và các máy chủ backend, chuyển tiếp các yêu cầu của khách hàng đến các máy chủ thích hợp và sau đó trả lại phản hồi cho khách hàng. Khách hàng không biết về reverse proxy, vì nó hoạt động như một cổng vào các máy chủ backend.
Một forward proxy, ngược lại, nằm giữa khách hàng và internet. Nó được sử dụng để lọc hoặc kiểm soát các yêu cầu của khách hàng (ví dụ: để ẩn danh hoặc hạn chế truy cập), và khách hàng biết về sự hiện diện của proxy.
Tại sao tôi nên sử dụng Nginx làm reverse proxy?
Nginx là một máy chủ web và reverse proxy nhẹ, hiệu suất cao, được sử dụng rộng rãi vì khả năng mở rộng, các tính năng bảo mật và dễ cấu hình. Nó có thể xử lý nhiều kết nối đồng thời một cách hiệu quả và cung cấp các tính năng như:
- Cân bằng tải: Phân phối lưu lượng đến nhiều máy chủ backend.
- Bộ nhớ đệm: Giảm tải cho các máy chủ backend bằng cách lưu trữ các phản hồi.
- Kết thúc SSL: Xử lý mã hóa và giải mã SSL để giảm tải công việc này từ các máy chủ backend.
- Bảo mật: Bảo vệ các máy chủ backend khỏi việc tiếp xúc trực tiếp với internet.
Làm thế nào để tôi biết liệu cấu hình reverse proxy của mình có hoạt động không?
Bạn có thể xác minh thiết lập reverse proxy của mình theo nhiều cách:
-
Kiểm tra nhật ký: Nhật ký Nginx thường nằm trong
/var/log/nginx/access.log
và/var/log/nginx/error.log
. Những nhật ký này có thể giúp bạn xác định bất kỳ vấn đề nào.tail -f /var/log/nginx/access.log tail -f /var/log/nginx/error.log
-
Kiểm tra xem Nginx có đang chuyển tiếp yêu cầu không: Sử dụng
curl
hoặc trình duyệt của bạn để truy cập reverse proxy và xác minh xem nó có đang chuyển tiếp các yêu cầu đến máy chủ backend đúng cách không.curl http://your_domain_or_ip
-
Kiểm tra máy chủ backend trực tiếp: Truy cập địa chỉ IP và cổng của máy chủ backend trực tiếp để đảm bảo rằng nó đang phản hồi đúng cách (ví dụ:
http://localhost:8080
).
Làm thế nào để tôi kích hoạt SSL cho reverse proxy của mình?
Để kích hoạt SSL cho reverse proxy của bạn, bạn có thể sử dụng Let’s Encrypt với Certbot để có chứng chỉ SSL miễn phí. Dưới đây là một cái nhìn tổng quan ngắn gọn về quy trình:
-
Cài đặt Certbot và plugin Nginx (trên Ubuntu/Debian):
sudo apt install certbot python3-certbot-nginx
-
Lấy chứng chỉ SSL bằng cách sử dụng Certbot:
sudo certbot --nginx -d your_domain.com
Làm theo hướng dẫn để hoàn tất quy trình tạo chứng chỉ.
-
Cấu hình Nginx để sử dụng SSL:
Nginx sẽ tự động tạo một cấu hình SSL, nhưng bạn có thể chỉnh sửa nó nếu cần. Một cấu hình cơ bản có hỗ trợ SSL sẽ trông như sau:
server { listen 443 ssl; server_name your_domain.com; ssl_certificate /etc/letsencrypt/live/your_domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your_domain.com/privkey.pem; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } server { listen 80; server_name your_domain.com; return 301 https://$host$request_uri; }
-
Xác minh SSL: Sau khi cấu hình Nginx với SSL, bạn có thể kiểm tra xem chứng chỉ SSL có hoạt động không bằng cách truy cập
https://your_domain.com
hoặc sử dụng các công cụ trực tuyến như SSL Labs' SSL Test.
Làm thế nào để tôi cấu hình cân bằng tải với Nginx?
Để cấu hình cân bằng tải, Nginx cho phép bạn định nghĩa một khối upstream để phân phối lưu lượng đến nhiều máy chủ backend. Dưới đây là một ví dụ cơ bản:
upstream backend {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
server {
listen 80;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Cấu hình này sẽ cân bằng các yêu cầu giữa hai máy chủ backend chạy trên localhost:8080
và localhost:8081
.
Reverse proxy Nginx của tôi không chuyển tiếp yêu cầu. Tôi nên làm gì?
Dưới đây là một số bước khắc phục sự cố mà bạn có thể thực hiện:
-
Kiểm tra cú pháp cấu hình Nginx: Trước khi khởi động lại Nginx, hãy xác minh cú pháp của tệp cấu hình:
sudo nginx -t
Nếu có lỗi, Nginx sẽ hiển thị chúng, và bạn có thể sửa chữa chúng theo cách thích hợp.
-
Kiểm tra cài đặt tường lửa: Đảm bảo rằng tường lửa của bạn cho phép lưu lượng trên các cổng đúng (ví dụ: cổng 80 cho HTTP và cổng 443 cho HTTPS). Sử dụng các công cụ như
ufw
hoặcfirewalld
để kiểm tra và điều chỉnh quy tắc tường lửa. -
Kiểm tra nhật ký Nginx: Nhật ký Nginx là nơi tốt nhất để tìm kiếm lỗi liên quan đến việc proxy:
tail -f /var/log/nginx/error.log
Điều này có thể cung cấp cho bạn cái nhìn về việc liệu Nginx có gặp phải vấn đề khi cố gắng chuyển tiếp các yêu cầu hay không.
Làm thế nào để tôi cấu hình Nginx xử lý các kết nối WebSocket?
Các kết nối WebSocket yêu cầu xử lý đặc biệt vì chúng sử dụng một kết nối liên tục. Trong cấu hình Nginx của bạn, hãy thêm các tiêu đề sau để đảm bảo rằng các kết nối WebSocket được chuyển tiếp đúng cách:
location /ws/ {
proxy_pass http://localhost:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
Cấu hình này sẽ cho phép Nginx xử lý đúng các kết nối WebSocket đến máy chủ backend tại localhost:8080
.
Làm thế nào để tôi tối ưu hóa Nginx cho hiệu suất tốt hơn?
Dưới đây là một số mẹo tối ưu hóa hiệu suất cho Nginx:
-
Kích hoạt nén gzip: Nén các tệp tĩnh để giảm mức sử dụng băng thông và tăng tốc độ tải trang.
gzip on; gzip_types text/plain text/css application/javascript application/json;
-
Bộ nhớ đệm: Sử dụng bộ nhớ đệm để giảm tải cho các máy chủ backend cho nội dung thường xuyên được yêu cầu.
location /images/ { proxy_cache my_cache; proxy_cache_valid 200 1d; }
-
Thời gian chờ kết nối: Đặt thời gian chờ thích hợp để tránh việc chờ đợi không cần thiết cho các kết nối chậm hoặc không hoạt động.
proxy_read_timeout 90; proxy_connect_timeout 90;
-
Số lượng tiến trình làm việc: Tăng số lượng tiến trình làm việc để cải thiện khả năng xử lý nhiều kết nối đồng thời của Nginx. Bạn có thể điều chỉnh điều này trong
nginx.conf
:worker_processes auto;
Làm thế nào để tôi bảo vệ các máy chủ backend của mình phía sau Nginx?
Để tăng cường bảo mật cho các máy chủ backend của bạn, bạn có thể:
-
Sử dụng xác thực HTTP: Bảo vệ quyền truy cập vào backend của bạn bằng một tên người dùng và mật khẩu đơn giản.
location / { auth_basic "Restricted"; auth_basic_user_file /etc/nginx/.htpasswd; }
-
Giới hạn quyền truy cập theo IP: Hạn chế quyền truy cập vào máy chủ backend của bạn bằng cách chỉ cho phép các địa chỉ IP cụ thể.
location / { allow 192.168.1.0/24; deny all; }
-
Sử dụng Tường lửa Ứng dụng Web (WAF): Cân nhắc thiết lập một WAF như ModSecurity để cung cấp bảo vệ bổ sung chống lại các cuộc tấn công.