Blog chia sẻ về công nghệ ...
Published on

Cách giới hạn Rate Limit truy cập API bằng NGINX (chi tiết từng bước)

Authors

🛡️ Làm sao để giới hạn Rate Limit truy cập API bằng NGINX?

Rate Limiting là kỹ thuật giới hạn số lượng request từ một client (thường theo IP) trong một khoảng thời gian cụ thể, nhằm:

  • Chống spam, DDoS
  • Ngăn abuse API
  • Bảo vệ tài nguyên server

📑 Mục Lục

  1. Mô hình giới hạn truy cập API
  2. Các directive quan trọng trong NGINX
  3. Cấu hình mẫu hạn chế tốc độ API
  4. Giải thích từng tham số
  5. Kiểm thử và theo dõi
  6. Tài liệu tham khảo

📦 Mô hình thực tế

               [Client 1]       [Client 2]
                    ↓                ↓
               ┌─────────────────────────┐
NGINX               │  rate_limit_by IP               └────────┬───────────────┘
               [Backend API server]

Mỗi IP sẽ bị giới hạn bao nhiêu request trong 1 giây/phút, tùy cấu hình.


🔧 Các directive quan trọng

DirectiveMô tả
limit_req_zoneKhai báo vùng giới hạn (key là IP)
limit_reqÁp dụng giới hạn cho từng location
burstCho phép vượt mức tạm thời (buffer)
nodelayCho phép trả ngay nếu trong burst

🛠️ Cấu hình giới hạn API

http {
  # Định nghĩa vùng giới hạn, theo IP client
  limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;

  server {
    listen 80;
    server_name api.example.com;

    location /api/ {
      limit_req zone=api_limit burst=20 nodelay;
      proxy_pass http://backend_api;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
    }
  }
}

🔍 Giải thích chi tiết

  • $binary_remote_addr: dùng IP client làm key
  • zone=api_limit:10m: tạo vùng lưu trữ tên api_limit, tối đa 10MB (~160k IP)
  • rate=10r/s: mỗi IP chỉ gửi 10 request mỗi giây
  • burst=20: cho phép tạm vượt mức 20 request
  • nodelay: trả lỗi 503 ngay nếu vượt ngưỡng, không đợi

🔬 Cách kiểm thử

Dùng công cụ như:

# Gửi 30 request trong vòng 1 giây
ab -n 30 -c 1 http://api.example.com/api/
  • 10 request đầu thành công
  • 20 request sau có thể bị từ chối (503) hoặc chậm, tùy burst/nodelay

📚 Tài liệu tham khảo


Tóm lại:
Bạn có thể dễ dàng bảo vệ API khỏi lạm dụng bằng cách cấu hình limit_req_zonelimit_req trong NGINX. Đây là kỹ thuật đơn giản – hiệu quả – không tốn nhiều tài nguyên để chặn bot, spam và DDoS.