Rate Limiting: http-request track
Last updated
Last updated
Trong HAProxy, lệnh http-request track-sc0
(cùng các biến thể track-sc1
, track-sc2
,...) cho phép bạn theo dõi thông tin từ các yêu cầu HTTP và lưu chúng vào stick table
. Việc này hữu ích khi bạn cần giám sát số lần truy cập từ một địa chỉ IP, theo dõi các yêu cầu theo từng URL cụ thể, hoặc phát hiện hành vi bất thường.
http-request track
HAProxy cung cấp nhiều lựa chọn cho khóa (key) mà bạn có thể sử dụng với http-request track
:
Field | Mô tả |
---|---|
Các field này giúp bạn kiểm soát chính xác thông tin mà bạn muốn track, nhưng đôi khi bạn cần thêm timestamp để nhận diện các yêu cầu đến trong khoảng thời gian nhất định.
Để track một yêu cầu HTTP kèm timestamp, bạn cần:
Lưu timestamp vào một biến.
Kết hợp timestamp này với các trường khác để tạo một khóa (key) độc nhất cho mỗi yêu cầu.
Dưới đây là cấu hình ví dụ trong HAProxy sử dụng http-request track-sc0
kết hợp timestamp với địa chỉ IP của client:
http-request set-var(req.timestamp) date(%ts)
: Lưu timestamp hiện tại vào biến req.timestamp
để sử dụng cho các thao tác sau.
http-request track-sc0 src,req.timestamp
: Tạo khóa track độc nhất dựa trên địa chỉ IP của client (src
) và timestamp (req.timestamp
). Điều này giúp bạn dễ dàng theo dõi từng yêu cầu với chi tiết về thời gian và nguồn yêu cầu.
Giả sử bạn muốn giới hạn số lượng yêu cầu từ một địa chỉ IP cụ thể trong một khoảng thời gian, ví dụ giới hạn mỗi IP chỉ được gửi tối đa 100 yêu cầu trong vòng 1 phút. Bạn có thể cấu hình HAProxy như sau:
stick-table: Định nghĩa bảng theo dõi (stick table) với http_req_rate(1m)
để lưu số lượng yêu cầu từ mỗi IP trong 1 phút.
track-sc0 src,req.timestamp: Theo dõi các yêu cầu của client kèm timestamp để tạo một khóa track duy nhất.
acl rate_limit_exceeded: Kiểm tra nếu số lượng yêu cầu từ một IP vượt quá 100 trong khoảng thời gian 1 phút (sc_http_req_rate(0) gt 100
).
http-request deny if rate_limit_exceeded: Từ chối yêu cầu nếu vượt quá giới hạn.
Lệnh http-request track
trong HAProxy giúp bạn theo dõi chi tiết từng yêu cầu, và bằng cách kết hợp với timestamp, bạn có thể tạo các giới hạn chi tiết cho từng client theo thời gian. Điều này là công cụ hữu ích để kiểm soát lưu lượng và bảo vệ hệ thống khỏi các hành vi quá tải.
src
Địa chỉ IP của client
src,map
Địa chỉ IP của client với file mapping
req.hdr(<header>)
Giá trị của một header cụ thể trong yêu cầu (ví dụ: User-Agent
)
req.uri
Đường dẫn URI của yêu cầu
req.path
Đường dẫn của yêu cầu (không bao gồm query string)
req.query
Phần query string trong URL
req.method
Phương thức HTTP của yêu cầu (GET, POST,...)
req.body
Nội dung của yêu cầu POST