NGINX - yêu cầu điều tiết để ngăn chặn lạm dụng


28

Lý do tôi muốn làm điều này là vì người dùng phát triển dựa trên API của chúng tôi bằng JavaScript và một số nhà phát triển làm hỏng và khiến khách truy cập đánh sập máy chủ bằng các yêu cầu AJAX. Khi điều này xảy ra, tôi muốn có thể điều tiết các yêu cầu API tới 50 yêu cầu mỗi phút hoặc một cái gì đó để có hiệu lực.

Lưu ý: (đặc biệt là các tài nguyên chuyên sâu DB, có lẽ ở cấp độ đường dẫn, thay vì toàn máy chủ (ví dụ: van tiết lưu "/ json_api /", nhưng không phải "/ static /").

Câu trả lời:


36

Điều này có thể được thực hiện bằng cách sử dụng LimitReqModule với Nginx. Tuy nhiên, nếu đây là một proxy ngược, bạn có thể muốn thử giới hạn tốc độ mới được HAProxy hỗ trợ .

Tôi thấy tỷ lệ nginx giới hạn là một chút khó hiểu để có được tỷ lệ chính xác mà bạn muốn.

Nhưng về cơ bản bạn có một cái gì đó như:

limit_req_zone  $binary_remote_addr  zone=default:10m   rate=50r/m;

trong httpphần và sau đó một cái gì đó như sau trong locationphần trong serverphần:

limit_req zone=default burst=10 nodelay;

Để không có nó cho một phần nhất định như /staticbạn sẽ chỉ làm cho nó một phần riêng biệt locationvà không bao gồm nó cho limit_reqchỉ thị (hoặc nghịch đảo).


cảm ơn. Bạn có thể giải thích những gì những điều đó đang làm (khu vực, nổ, gật đầu)? Và, ý bạn là đặt zone=limit_req_zone, thay vào đó?
orokusaki

Thành thật mà nói tôi không thể giải thích cho họ rằng đó là lý do tại sao tôi cảm thấy nó chỉ là khó hiểu. Lời giải thích của Michael trong liên kết tôi cung cấp có vẻ khả thi. Tôi không tin rằng tôi có bất kỳ lỗi chính tả nào cho đến câu hỏi thứ hai của bạn ... Tài liệu mô-đun tôi liên kết đến có một ví dụ có thể giúp ích.
Kyle Brandt

2
vùng, cụm và nút được ghi lại trên trang wiki Nginx về mô-đun giới hạn tốc độ , được liên kết đến từ câu trả lời ở trên.
Mark Stosberg

Kyle, bạn có biết có cách nào để kết hợp giới hạn tỷ lệ trên mỗi vị trí với một trình kích hoạt khác không (ví dụ: Ủy quyền-Tiêu đề). Trong trường hợp của tôi, tôi có thể muốn điều tiết tỷ lệ của một người dùng cụ thể.
Nils

1
@Nils AFAICS bạn có thể sử dụng $http_authorizationbiến để xác định vùng mới trong đó khóa là tiêu đề như vậy chứ không phải địa chỉ IP limit_req_zone $http_authorization zone = per_user : 10m rate = 5r/s, sau đó sử dụng per_uservùng đó trong các phần vị trí nơi bạn muốn thực hiện giới hạn tỷ lệ cho mỗi người dùng. Chưa được kiểm tra, tôi chỉ đọc tài liệu và danh sách các biến nginx ... hãy cho tôi biết nếu bạn thử nó!
idrarig
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.