Introducing ZYNOO General Purpose & CPU Optimized Servers   Learn More >

Cách cấu hình giới hạn tần suất yêu cầu của Nginx trên Ubuntu

Giới hạn tần suất yêu cầu của Nginx là tính năng tích hợp giúp kiểm soát số lượng yêu cầu HTTP mà một máy khách có thể gửi trong một khoảng thời gian nhất định. Tính năng này có thể giảm lưu lượng truy cập gây hại nhắm vào API, trang đăng nhập và các ứng dụng tiêu tốn nhiều tài nguyên mà không cần cài thêm phần mềm.

Trong hướng dẫn này, bạn sẽ cấu hình giới hạn tần suất yêu cầu của Nginx, kiểm tra một cách an toàn và bật tính năng bảo vệ trên máy chủ Ubuntu.

Giới hạn tần suất yêu cầu của Nginx hoạt động như thế nào?

Nginx sử dụng mô-đun limit_req để theo dõi các yêu cầu đến, thường dựa trên địa chỉ IP của máy khách.

Ví dụ, bạn có thể đặt giới hạn trung bình là năm yêu cầu mỗi giây, đồng thời cho phép các đợt tăng lưu lượng ngắn. Những yêu cầu vượt quá mức tăng đột biến được phép sau đó có thể bị từ chối.

Điều này giúp ngăn lượng yêu cầu quá lớn làm quá tải ứng dụng của bạn.

Lưu ý: Giới hạn tần suất yêu cầu giúp giảm thiểu một số cuộc tấn công HTTP flood ở Lớp 7. Tính năng này không thể ngăn chặn các cuộc tấn công DDoS quy mô lớn ở cấp độ mạng làm bão hòa kết nối của bạn.

cách cấu hình giới hạn tần suất yêu cầu của Nginx

Điều kiện tiên quyết

Bạn cần có một máy chủ Ubuntu đã cài đặt Nginx, quyền truy cập SSH với đặc quyền sudo và một website hoặc ứng dụng hiện có.

Trước khi thay đổi, hãy sao lưu cấu hình website hiện tại của bạn.

Bước 1: Xác định vùng giới hạn tần suất yêu cầu

Kết nối với máy chủ của bạn qua SSH.

Trên bản cài đặt Nginx tiêu chuẩn của Ubuntu, hãy tạo một tệp cấu hình mới:

sudo nano /etc/nginx/conf.d/rate-limit.conf

Thêm:

limit_req_zone $binary_remote_addr zone=perip:10m rate=5r/s;

Cấu hình này sử dụng địa chỉ IP của máy khách để theo dõi yêu cầu, cấp phát 10 MB cho dữ liệu theo dõi và đặt giới hạn trung bình là năm yêu cầu mỗi giây cho mỗi IP.

Chỉ thị limit_req_zone phải được đặt trong ngữ cảnh http của Nginx. Cấu hình Ubuntu tiêu chuẩn nạp các tệp conf.d trong ngữ cảnh này.

Lưu tệp.

Bước 2: Bật giới hạn tần suất yêu cầu cho website của bạn

Mở tệp cấu hình Nginx hiện tại của website:

sudo nano /etc/nginx/sites-available/app.example.com

Thay tên tệp bằng tên tệp cấu hình thực tế của bạn.

Với một ứng dụng HTTP chạy trên cổng 3000, một điểm cuối API được bảo vệ có thể có cấu hình như sau:

location /api/ {
    limit_req zone=perip burst=10 nodelay;
    limit_req_status 429;
    limit_req_dry_run on;

    proxy_pass http://127.0.0.1:3000;
}

Sau đây là chức năng của các chỉ thị quan trọng:

  • limit_req: Áp dụng giới hạn đã xác định trước đó.
  • burst=10: Cho phép một đợt tăng yêu cầu ngắn vượt mức giới hạn.
  • nodelay: Xử lý ngay các yêu cầu nằm trong đợt tăng được phép.
  • limit_req_status 429: Trả về mã HTTP 429 khi yêu cầu bị từ chối.
  • limit_req_dry_run on: Ghi nhận các yêu cầu vượt giới hạn mà không chặn chúng.

Quan trọng: Thêm các chỉ thị giới hạn tần suất yêu cầu này vào khối location hiện có tương ứng. Đừng tạo các location trùng lặp hoặc thay thế cấu hình backend hiện tại của bạn.

Các giá trị được hiển thị chỉ là ví dụ. Hãy chọn giới hạn dựa trên lưu lượng yêu cầu thông thường của ứng dụng.

Bước 3: Kiểm tra tính hợp lệ của cấu hình Nginx

Kiểm tra cấu hình:

sudo nginx -t

Nếu quá trình kiểm tra thành công, hãy tải lại Nginx:

sudo systemctl reload nginx

Nếu xuất hiện lỗi, hãy khắc phục trước khi tải lại.

Bước 4: Kiểm tra giới hạn tần suất yêu cầu

Vì chế độ chạy thử đang được bật, các yêu cầu sẽ chưa bị từ chối.

Theo dõi nhật ký lỗi của Nginx:

sudo tail -f /var/log/nginx/error.log

Từ một cửa sổ dòng lệnh khác, hãy gửi một đợt yêu cầu nhỏ để kiểm tra đến điểm cuối do bạn quản lý:

for i in $(seq 1 15); do
  curl -s -o /dev/null -w "%{http_code}\n" \
  https://app.example.com/api/health
done

Thay URL bằng một điểm cuối đang hoạt động trên ứng dụng thử nghiệm hoặc ứng dụng ở môi trường staging của bạn.

Nếu các yêu cầu vượt quá giới hạn, Nginx sẽ ghi các thông báo chứa limiting requests, dry run vào nhật ký lỗi.

Ứng dụng của bạn sẽ tiếp tục trả về phản hồi như bình thường vì tính năng từ chối yêu cầu chưa được bật.

Bước 5: Bật giới hạn tần suất yêu cầu

Sau khi xem xét kết quả và xác nhận các giới hạn đã phù hợp, hãy xóa chỉ thị này khỏi khối location được bảo vệ:

limit_req_dry_run on;

Kiểm tra tính hợp lệ của cấu hình và tải lại Nginx một lần nữa:

sudo nginx -t
sudo systemctl reload nginx

Các yêu cầu vượt giới hạn giờ đây có thể nhận phản hồi HTTP 429 Too Many Requests.

Lặp lại một lần kiểm tra có kiểm soát và xem các mã phản hồi. Kết quả cụ thể phụ thuộc vào thời điểm gửi yêu cầu và các giới hạn bạn đã cấu hình.

Cách hoàn tác các thay đổi

Nếu người dùng hợp lệ bị ảnh hưởng, hãy khôi phục:

limit_req_dry_run on;

Kiểm tra tính hợp lệ của cấu hình và tải lại Nginx. Thao tác này đưa cấu hình về chế độ theo dõi mà không từ chối yêu cầu.

Sau đó, bạn có thể điều chỉnh giới hạn dựa trên lưu lượng truy cập thực tế.

Quan trọng: Nginx đặt sau Cloudflare hoặc một CDN khác

Khi Nginx đặt sau một reverse proxy, địa chỉ IP máy khách mà Nginx nhìn thấy có thể là của proxy thay vì của khách truy cập ban đầu.

Nếu áp dụng giới hạn theo IP mà không xử lý vấn đề này, những người dùng không liên quan có thể bị tính chung vào một nhóm.

Trước khi áp dụng giới hạn cho từng máy khách, hãy cấu hình cách xử lý IP máy khách đáng tin cậy bằng mô-đun Real IP của Nginx và các dải IP do nhà cung cấp proxy của bạn công bố.

Không bao giờ tin tưởng các header IP do khách truy cập tùy ý cung cấp.

Giới hạn tần suất yêu cầu của Nginx có thay thế được tính năng bảo vệ chống DDoS không?

Không. Nginx có thể giới hạn lượng yêu cầu HTTP quá lớn đến ứng dụng của bạn, nhưng không thể lọc lưu lượng đã làm bão hòa kết nối mạng thượng nguồn của máy chủ.

Để bảo vệ toàn diện hơn, hãy kết hợp các biện pháp kiểm soát ở cấp ứng dụng với các biện pháp giảm thiểu tấn công ở cấp dịch vụ lưu trữ.

Câu hỏi thường gặp

Tính năng giới hạn tần suất yêu cầu của Nginx có miễn phí không?

Có. Nginx Open Source bao gồm mô-đun limit_req.

Giới hạn tần suất yêu cầu của Nginx có thể chặn khách truy cập hợp lệ không?

Có. Cài đặt quá nghiêm ngặt có thể từ chối các yêu cầu hợp lệ, đặc biệt khi nhiều người dùng dùng chung một địa chỉ IP. Hãy kiểm tra ở chế độ chạy thử trước khi bật tính năng từ chối yêu cầu.

Giới hạn tần suất yêu cầu của Nginx có hoạt động với API không?

Có. Tính năng này đặc biệt hữu ích để kiểm soát lượng yêu cầu quá lớn gửi đến các điểm cuối API và những đường dẫn khác của ứng dụng tiêu tốn nhiều tài nguyên.

Kết luận

Nginx cung cấp tính năng giới hạn tần suất yêu cầu tích hợp, giúp giảm lưu lượng HTTP gây hại mà không cần cài thêm phần mềm.

Hãy cấu hình giới hạn tần suất yêu cầu, kiểm tra ở chế độ chạy thử và chỉ bật tính năng từ chối yêu cầu sau khi xem xét kết quả.

Để bảo vệ máy chủ toàn diện, hãy sử dụng giới hạn tần suất yêu cầu cùng với biện pháp giảm thiểu DDoS phù hợp ở phía thượng nguồn.

Table of Content

Proxy ngược Nginx nhận yêu cầu từ khách truy cập trang web rồi chuyển tiếp

Lỗi 502 Bad Gateway trong Nginx thường có nghĩa là Nginx không nhận được phản

Lỗi 504 Gateway Timeout xảy ra khi một máy chủ đóng vai trò cổng kết

Build your next project with ZYNOO

From your first website to demanding applications, choose the resources and control you need.

Shared Hosting

Start your blog or business website with cPanel, LiteSpeed and CloudLinux.

VPS Hosting

Grow your websites and applications with NVMe storage, KVM virtualization and full root access.

Dedicated Servers

Power demanding projects with your own physical server, dedicated resources and control over your environment.

Lên đầu trang