Hướng dẫn cấu hình Nginx cơ bản và nâng cao

Nginx là một máy chủ web hiệu suất cao, hoạt động như một reverse proxy, cân bằng tải, bộ đệm và hơn thế nữa. Với khả năng xử lý lượng truy cập lớn và tiêu thụ ít tài nguyên, Nginx đã trở thành lựa chọn hàng đầu cho nhiều ứng dụng web.

Cấu trúc tệp cấu hình Nginx

Tệp cấu hình chính của Nginx thường nằm trong thư mục conf và có tên là nginx.conf. Tệp này được chia thành ba phần chính:

  • Cấu hình toàn cục: Thiết lập các thuộc tính chung cho máy chủ Nginx.
  • Cấu hình sự kiện (event): Bao gồm các cài đặt liên quan đến kết nối mạng, ví dụ: worker_connections, chỉ định số lượng kết nối tối đa mà mỗi tiến trình worker có thể xử lý đồng thời.
  • Cấu hình HTTP: Chứa các chỉ thị liên quan đến giao thức HTTP, bao gồm cả cấu hình máy chủ ảo và proxy.

Các lệnh Nginx cơ bản

  • Khởi động: Chạy tệp thực thi nginx trong thư mục cài đặt Nginx.
  • Dừng:
    • nginx -s stop: Dừng Nginx một cách nhanh chóng.
    • nginx -s quit: Dừng Nginx một cách có trật tự, hoàn thành các yêu cầu đang xử lý.
    • Sử dụng lệnh taskkill trên Windows: taskkill /f /t /im nginx.exe để buộc dừng tiến trình Nginx và các tiến trình con của nó.
  • Các lệnh phổ biến khác có thể bao gồm kiểm tra cấu hình (nginx -t) hoặc tải lại cấu hình (nginx -s reload).

Cấu hình nâng cao

1. Cân bằng tải (Load Balancing)

Cân bằng tải giúp phân phối lưu lượng truy cập đến nhiều máy chủ backend, tăng tính sẵn sàng và hiệu suất của ứng dụng. Cấu hình cân bằng tải thường được đặt trong khối http.

Nginx thực hiện cân bằng tải bằng cách đóng vai trò là reverse proxy. Các yêu cầu từ người dùng sẽ đến Nginx trước, sau đó Nginx sẽ dựa vào các quy tắc được định nghĩa để chuyển tiếp yêu cầu đến một trong các máy chủ backend.

Các chiến lược cân bằng tải phổ biến:

  • Round Robin (Luân phiên): Phân phối yêu cầu lần lượt cho từng máy chủ.
  • Weight (Trọng số): Phân phối yêu cầu dựa trên trọng số được gán cho mỗi máy chủ. Máy chủ có trọng số cao hơn sẽ nhận được nhiều yêu cầu hơn.
  • IP Hash: Yêu cầu từ cùng một địa chỉ IP sẽ luôn được chuyển đến cùng một máy chủ backend.
  • Least Connections (Ít kết nối nhất): Chuyển tiếp yêu cầu đến máy chủ có số lượng kết nối đang hoạt động ít nhất.

Ví dụ cấu hình:

upstream backend_servers {
    server 192.168.1.10:8080 weight=90;
    server 192.168.1.11:8081 weight=10;
}

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend_servers;
    }
}
    

Trong ví dụ trên, upstream định nghĩa một nhóm các máy chủ backend, và khối server cấu hình cách Nginx xử lý các yêu cầu, sử dụng proxy_pass để chuyển tiếp chúng đến nhóm backend_servers.

2. Phân tách tĩnh và động (Static and Dynamic Content Separation)

Đây là một kỹ thuật tối ưu hóa hiệu suất bằng cách xử lý riêng các yêu cầu cho nội dung tĩnh (HTML, CSS, JavaScript, hình ảnh) và nội dung động (từ ứng dụng backend). Nginx có thể phục vụ trực tiếp các tệp tĩnh, giảm tải cho máy chủ ứng dụng.

Cách thực hiện:

  • Cấu hình Nginx với các khối location khác nhau. Một location có thể được thiết lập để phục vụ tệp tĩnh từ một thư mục cụ thể, trong khi location khác sẽ chuyển tiếp yêu cầu động đến máy chủ backend.
  • Sử dụng các chỉ thị như root để chỉ định thư mục chứa tệp tĩnh và expires để thiết lập thời gian bộ nhớ cache cho trình duyệt.

Ví dụ cấu hình:

server {
    listen 80;
    server_name example.com;
    root /var/www/html;

    location / {
        try_files $uri $uri/ /index.html; # Phục vụ tệp tĩnh hoặc chuyển hướng
    }

    location ~ \.(jpg|jpeg|png|gif|css|js|ico|html)$ {
        expires 30d; # Cache tệp tĩnh trong 30 ngày
        add_header Cache-Control "public";
    }

    location /api/ {
        proxy_pass http://localhost:5000; # Chuyển tiếp yêu cầu API đến ứng dụng backend
    }
}
    

3. Giới hạn tốc độ (Rate Limiting)

Giới hạn tốc độ giúp bảo vệ máy chủ khỏi bị quá tải do lượng truy cập đột biến bằng cách kiểm soát số lượng yêu cầu mà một máy khách có thể thực hiện trong một khoảng thời gian nhất định. Điều này ngăn chặn các cuộc tấn công DoS hoặc việc sử dụng tài nguyên quá mức.

Nginx cung cấp các mô-đun như ngx_http_limit_req_module để thực hiện chức năng này.

Ví dụ cấu hình:

http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s; # Định nghĩa khu vực giới hạn tốc độ

    server {
        listen 80;
        server_name example.com;

        location /login {
            limit_req zone=one burst=10 nodelay; # Áp dụng giới hạn tốc độ cho /login
            proxy_pass http://localhost:8080/login;
        }
    }
}
    
  • limit_req_zone: Định nghĩa một khu vực quản lý giới hạn tốc độ. $binary_remote_addr sử dụng địa chỉ IP của client làm khóa, zone=one:10m cấp phát 10MB bộ nhớ cho khu vực này, và rate=5r/s đặt giới hạn là 5 yêu cầu mỗi giây.
  • limit_req: Áp dụng khu vực giới hạn tốc độ đã định nghĩa. burst=10 cho phép một lượng truy cập đột biến lên tới 10 yêu cầu, và nodelay chỉ định rằng các yêu cầu vượt quá giới hạn sẽ bị từ chối ngay lập tức thay vì chờ đợi.

Các cấu hình phổ biến khác

  • worker_processes: Số lượng tiến trình worker. Thường được đặt bằng số lõi CPU.
  • worker_connections: Số lượng kết nối tối đa cho mỗi tiến trình worker.
  • include mime.types;: Nạp tệp định nghĩa các loại MIME tương ứng với phần mở rộng tệp.
  • default_type application/octet-stream;: Loại MIME mặc định nếu Nginx không xác định được.
  • sendfile on;: Cho phép Nginx sử dụng hệ thống gọi sendfile để truyền tệp hiệu quả hơn, giảm tải cho CPU.
  • keepalive_timeout 65;: Thời gian chờ cho kết nối keep-alive.
  • map $http_upgrade $connection_upgrade { ... }: Cấu hình này thường được sử dụng để xử lý các yêu cầu nâng cấp giao thức, ví dụ như WebSocket.

Thẻ: nginx reverse proxy Load Balancing Rate Limiting Web server configuration

Đăng vào ngày 21 tháng 7 lúc 20:01