nginx là một máy chủ HTTP hiệu năng cao, cũng như một máy chủ phản hướng ngược, bộ cân bằng tải và máy chủ phản hướng thư điện tử.
Máy chủ HTTP
nginx có thể cung cấp dịch vụ HTTP độc lập, thường được sử dụng như máy chủ trang web tĩnh. Khi hoạt động như máy chủ HTTP, nginx hỗ trợ nhiều tên miền ảo, cho phép triển khai nhiều trang web trên cùng một máy chủ.
Cấu hình nhiều tên miền ảo trong nginx rất đơn giản, chỉ cần thêm nhiều khối server. Có hai cách để cấu hình các khối server:
Phương pháp 1: Định nghĩa trực tiếp nhiều khối server trong khối http
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
# Cấu hình tên miền ảo 1
server {
listen 80;
server_name example1.com;
charset utf-8;
access_log /var/log/nginx/example1.access.log main;
location / {
root /var/www/example1;
index index.html index.htm;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/www/error;
}
}
# Cấu hình tên miền ảo 2
server {
listen 80;
server_name example2.com;
charset utf-8;
access_log /var/log/nginx/example2.access.log main;
location / {
root /var/www/example2;
index index.html index.htm;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/www/error;
}
}
}
Phương pháp 2: Đặt mỗi khối server vào các file riêng biệt và sử dụng lệnh include trong khối http
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
include /etc/nginx/sites-available/*.conf;
}
Ví dụ về nội dung của file cấu hình riêng cho từng tên miền:
# /etc/nginx/sites-available/example1.conf
server {
listen 80;
server_name example1.com;
charset utf-8;
access_log /var/log/nginx/example1.access.log main;
location / {
root /var/www/example1;
index index.html index.htm;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/www/error;
}
}
# /etc/nginx/sites-available/example2.conf
server {
listen 80;
server_name example2.com;
charset utf-8;
access_log /var/log/nginx/example2.access.log main;
location / {
root /var/www/example2;
index index.html index.htm;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/www/error;
}
}
Máy chủ phản hướng ngược
Ngoài việc đóng vai trò là máy chủ web tĩnh, nginx còn được sử dụng phổ biến nhất là làm máy chủ phản hướng ngược cho các ứng dụng phía sau.
Khi nginx hoạt động như máy chủ phản hướng ngược, nó đóng vai trò như cổng vào của ứng dụng phía sau, điều này có nghĩa là mọi yêu cầu đến ứng dụng phía sau đều phải đi qua nginx.
Cấu hình nginx làm máy chủ phản hướng ngược cần chú ý hai điểm chính:
(1) Sử dụng lệnh upstream để định nghĩa một nhóm các ứng dụng phía sau.
(2) Trong khối location, chỉ định nhóm ứng dụng phía sau (hoặc địa chỉ truy cập).
Một ví dụ cấu hình đầy đủ cho nginx làm máy chủ phản hướng ngược như sau:
http {
upstream backend_app {
server 192.168.1.100:8080;
}
server {
location / {
proxy_pass http://backend_app/;
}
}
}
Lưu ý đặc biệt: Khi cấu hình phản hướng ngược, nếu đường dẫn mapping trong location không phải là "/" mà là "/xxx", hậu tố "/" ở cuối địa chỉ URL trong lệnh proxy_pass sẽ ảnh hưởng đến kết quả như sau: (1) Nếu đường dẫn mapping là "/", việc có hoặc không có "/" ở cuối địa chỉ URL trong proxy_pass không khác biệt. (2) Nếu đường dẫn mapping là "/xxx" và proxy_pass có "/" ở cuối, khi truy cập "/xxx", thực tế sẽ truy cập vào đường dẫn gốc của máy chủ đích, tức là "/". (3) Nếu đường dẫn mapping là "/xxx" và proxy_pass không có "/" ở cuối, khi truy cập "/xxx", thực tế sẽ truy cập vào đường dẫn "/xxx/" của máy chủ đích.
Nginx có thể hoạt động như máy chủ phản hướng ngược cho nhiều ứng dụng trong cùng một tên miền ảo hoặc nhiều tên miền ảo khác nhau.
Làm máy chủ phản hướng ngược cho nhiều ứng dụng trong cùng một tên miền ảo
Trong trường hợp này, nginx phân biệt các ứng dụng thông qua các đường dẫn URI khác nhau.
http {
upstream app1 {
server 192.168.1.101:8080;
}
upstream app2 {
server 192.168.1.102:8080;
}
server {
listen 80;
server_name example.com;
location /service1 {
proxy_pass http://app1/;
}
location /service2 {
proxy_pass http://app2/;
}
}
}
Làm máy chủ phản hướng ngược cho nhiều tên miền ảo khác nhau
Trong trường hợp này, cấu hình nhiều tên miền ảo và thiết lập phản hướng ngược cho mỗi tên miền.
http {
upstream app1 {
server 192.168.1.101:8080;
}
upstream app2 {
server 192.168.1.102:8080;
}
server {
listen 80;
server_name example1.com;
location / {
proxy_pass http://app1/;
}
}
server {
listen 80;
server_name example2.com;
location / {
proxy_pass http://app2/;
}
}
}
Bộ cân bằng tải
Dù không phải là chức năng chính, nginx vẫn có thể hoạt động như bộ cân bằng tải cho một số giao thức cụ thể như HTTP, HTTPS, FastCGI, uwsgi, SCGI, memcached và gRPC.
Chiến lược vòng lặp đơn giản
Đây là chiến lược mặc định của nginx khi hoạt động như bộ cân bằng tải.
upstream backend {
server 192.168.1.101:8080;
server 192.168.1.102:8080;
}
Chiến lược ít kết nối
Chiến lược này ưu tiên gửi yêu cầu đến máy chủ có ít kết nối nhất.
upstream backend {
least_conn;
server 192.168.1.101:8080;
server 192.168.1.102:8080;
}
Chiến lược băm IP khách hàng
Chiến lược này chuyển tất cả các yêu cầu từ một IP khách hàng cụ thể đến cùng một máy chủ.
upstream backend {
ip_hash;
server 192.168.1.101:8080;
server 192.168.1.102:8080;
}
Chiến lược trọng lượng máy chủ
Trong chiến lược này, hầu hết các yêu cầu sẽ được chuyển đến máy chủ có trọng lượng lớn hơn.
upstream backend {
server 192.168.1.101:8080 weight=3;
server 192.168.1.102:8080;
}
Máy chủ phản hướng thư điện tử
Nginx hỗ trợ việc phản hướng các giao thức IMAP, POP3 và SMTP. Chi tiết về cách cấu hình nginx làm máy chủ phản hướng thư điện tử xem tại: https://docs.nginx.com/nginx/admin-guide/mail-proxy/mail-proxy/.
Liên kết tham khảo: