1. Tổng quan
Trong hệ điều hành Linux, Reverse Proxy đóng vai trò làm cầu nối giữa host (máy khách) và server (máy chủ). Nó nhận yêu cầu của máy khách và chuyển lên server và nhận phản hồi từ server để chuyển tới máy khách, cho nên phản hồi từ nó giống như là một máy chủ vậy. Trong bài này, chúng tôi giải thích kỹ Nginx reverse proxy là gì và cách thiết lập nó trên VPS! Bạn có thể thuê VPS giá rẻ để thực hiện Nginx Reverse Proxy để giúp hạ tầng chạy ổn định.
Client và server liên tục trao đổi thông tin. Thông thường, reverse proxies được dùng như là một web server. Reverse proxy hay gateway được client coi như là một máy chủ web, không cần cấu hình gì đặc biệt. Client lập lệnh truy vấn thông thường và reverse proxy quyết định nơi chuyển thông tin đến và phản hồi như bản thân nó là máy gốc vậy.
Nginx reverse proxy có nhiều ưu điểm, vì vậy nó là kiểu server mã nguồn mở được dùng rộng rãi trên internet.
2. Ưu điểm
- Rất đơn giản để triển khai, đồng thời tạo tính bảo mật cao giúp ngăn chặn tấn công web server như DDoS và DoS
- Nginx Reverse proxy giúp tạo cân bằng tải giữa nhiều server hạ tầng và là giải pháp caching cho những server chậm
- Nginx không đòi hỏi thiết lập mới cho từng yêu cầu từ client. Nó mặc định dùng một process trên mỗi CPU
- Nó hoạt động như là server reverse proxy cho các giao thức đa dạng: HTTP, HTTPS, TCP, UDP, SMTP, IMAP, và POP3
- Nó có thể xử lý hơn 10000 kết nối nhưng chiếm ít dung lượng bộ nhớ. Nginx có thể vận hành nhiều web server khác nhau chỉ từ 1 IP và vẫn có thể phản hồi đúng kết quả tới đúng server trong mạng LAN
- Nginx là một trong các web server tốt nhất cải thiện tốc độ load cho nội dung tĩnh. Hơn nữa, nó cũng hữu dụng khi đóng vai trò cache nội dung để thực hiện mã hóa SSL để giảm tải cho web server chính
- Nó cũng hữu dụng để tối ưu nội dung và nén chúng để giảm thời gian tải
- Nginx có thể thực hiện test A/B mà không cần đặt code JavaScript vào trong trang.
3. Cách sử dụng.
Sơ đồ của mình đơn giản như vậy
3.1. Chuyển hướng từ http sang https
server {
listen 80 default_server;
server_name _;
return 301 https://$host$request_uri;
}
Với lệnh trên sẽ cho phép nginx chuyển hướng từ http sang https, tức là khi chúng ta nhập domain lên trình duyệt thì trình duyệt sẽ tự động chuyển hướng qua https thay vì mặc định là http.
3.2. Phần này ta cấu hình cho nginx lắng nghe ở port 443 và sử dụng phương thức xác thực ssl.
server {
listen 443 ssl;
server_name guacamole.hoanghd.com;
proxy_redirect off;
ssl_certificate /etc/nginx/letsencrypt/hoanghd.fun.pem; #fullchain.pem
ssl_certificate_key /etc/nginx/letsencrypt/hoanghd.fun.pem; #privkey.pem
ssl_trusted_certificate /etc/nginx/letsencrypt/hoanghd.fun.pem; #chain.pem
}
3.3. Phần này chỗ proxy_pass chúng ta trỏ tới url của website cần thiết lập Reverse Proxy, ở phần này mình đang sử dụng Guacamole và Zabbix.
server {
location / {
proxy_pass http://192.168.13.235:8474/guacamole/;
}
}
3.4. Nếu bạn cần chặn một số host nào đó truy cập vào Reverse Proxy này thì có thể thêm phần cấu hình như ở dưới nhé. Nếu các bạn không muốn siết truy cập website thì có thể bỏ qua bước này.
server {
location / {
deny 103.15.49.73/32;
allow all;
}
}
3.5. Config ssl
Tạo thư mục để lưu ssl, do mình lười nên mình sẽ sử dụng letsencrypt của 1 domain khác cho nhanh. Tạo thư mục /etc/nginx/letsencrypt/ và copy file ssl của domain vào đó (mình sẽ có 1 bài hướng dẫn lấy ssl letsencrypt sau nhé).
mkdir -p /etc/nginx/letsencrypt/
Đảm bảo phải có file ssl, do mình sử dụng demo nên mình sẽ sử dụng 1 file ssl bất kỳ, file hết hạn hay file của domain khác cũng được nhé, để nó có thể kích hoạt được ssl, nếu không có file ssl thì sẽ báo lỗi. Hãy đảm bảo rằng đã có file ssl ở đường dẫn /etc/nginx/letsencrypt/hoanghd.fun.pem
root@nginx:~# ll /etc/nginx/letsencrypt/hoanghd.fun.pem
-rw-r--r-- 1 root root 12871 Sep 25 14:25 /etc/nginx/letsencrypt/hoanghd.fun.pem
3.6. Mình có chỉnh lại file /etc/nginx/nginx.conf với nội dung như dưới, mình đã xóa hết comment và chỉ include mỗi thư mục /etc/nginx/conf.d/
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
gzip on;
include /etc/nginx/conf.d/*.conf;
}
3.7. Dưới đây là file cấu hình đầy đủ.
server {
listen 80 default_server;
server_name _;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name guacamole.hoanghd.com;
proxy_redirect off;
ssl_certificate /etc/nginx/letsencrypt/hoanghd.fun.pem; #fullchain.pem
ssl_certificate_key /etc/nginx/letsencrypt/hoanghd.fun.pem; #privkey.pem
ssl_trusted_certificate /etc/nginx/letsencrypt/hoanghd.fun.pem; #chain.pem
location / {
proxy_pass http://192.168.13.235:8474/guacamole/;
}
}
server {
listen 443 ssl;
server_name zabbix.hoanghd.com;
proxy_redirect off;
ssl_certificate /etc/nginx/letsencrypt/hoanghd.fun.pem; #fullchain.pem
ssl_certificate_key /etc/nginx/letsencrypt/hoanghd.fun.pem; #privkey.pem
ssl_trusted_certificate /etc/nginx/letsencrypt/hoanghd.fun.pem; #chain.pem
location / {
proxy_pass http://192.168.13.234/zabbix/;
}
}
Sử dụng nginx -t để kiểm tra lỗi file config
root@nginx:/etc/nginx# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Nếu không có lỗi sử dụng command dưới để reload lại Nginx
root@nginx:/etc/nginx# nginx -s reload
Đừng quên trỏ domain nhé
hoanghd@Has-iMac-TableLV ~ % cat /etc/hosts | grep hoanghd.com
192.168.13.233 zabbix.hoanghd.com
192.168.13.233 guacamole.hoanghd.com
Kiểm tra kết nối tới zabbix.hoanghd.com
hoanghd@Has-iMac-TableLV ~ % ping zabbix.hoanghd.com
PING zabbix.hoanghd.com (192.168.13.233): 56 data bytes
64 bytes from 192.168.13.233: icmp_seq=0 ttl=63 time=6.634 ms
64 bytes from 192.168.13.233: icmp_seq=1 ttl=63 time=6.650 ms
64 bytes from 192.168.13.233: icmp_seq=2 ttl=63 time=4.284 ms
64 bytes from 192.168.13.233: icmp_seq=3 ttl=63 time=4.443 ms
--- zabbix.hoanghd.com ping statistics ---
5 packets transmitted, 5 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 4.284/5.492/6.650/1.020 ms
Kiểm tra kết nối tới guacamole.hoanghd.com
hoanghd@Has-iMac-TableLV ~ % ping guacamole.hoanghd.com
PING guacamole.hoanghd.com (192.168.13.233): 56 data bytes
64 bytes from 192.168.13.233: icmp_seq=0 ttl=63 time=5.689 ms
64 bytes from 192.168.13.233: icmp_seq=1 ttl=63 time=5.063 ms
64 bytes from 192.168.13.233: icmp_seq=2 ttl=63 time=4.862 ms
64 bytes from 192.168.13.233: icmp_seq=3 ttl=63 time=4.564 ms
64 bytes from 192.168.13.233: icmp_seq=4 ttl=63 time=4.565 ms
--- guacamole.hoanghd.com ping statistics ---
6 packets transmitted, 6 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 4.564/4.941/5.689/0.380 ms
3.8. Kết quả.
Với Guacamole
Với Zabbix
Do mình đang sử dụng ssl của domain hoanghd.fun nên ssl báo not secure màu đỏ, nếu sử dụng đúng ssl và còn hạn sử dụng thì nó sẽ có tích xanh nhé, ở bài sau mình sẽ hướng dẫn sử dụng ssl letsencrypt, đảm bảo tích sẽ xanh lè.
Chúc các bạn may mắn