NGINX - permintaan pembatasan untuk mencegah penyalahgunaan

28

Alasan saya ingin melakukan ini adalah karena pengguna mengembangkan terhadap API kami dengan JavaScript, dan beberapa pengembang mengacaukan dan menyebabkan pengunjung membanting server dengan permintaan AJAX. Ketika ini terjadi, saya ingin dapat membatasi permintaan API hingga 50 permintaan per menit , atau sesuatu seperti itu.

Catatan: (terutama sumber daya intensif DB, jadi mungkin di tingkat jalur, bukan di seluruh server (mis. Throttle "/ json_api /", tetapi tidak "/ statis /").

orokusaki
sumber

Jawaban:

36

Ini dapat dilakukan dengan menggunakan LimitReqModule dengan Nginx. Namun jika ini untuk proksi terbalik, Anda mungkin ingin mencoba pembatasan tarif baru yang didukung oleh HAProxy .

Saya menemukan tingkat nginx membatasi sedikit membingungkan untuk mendapatkan tingkat yang tepat yang Anda inginkan.

Tetapi pada dasarnya Anda memiliki sesuatu seperti:

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

di httpbagian dan kemudian sesuatu seperti yang berikut di locationbagian dalam serverbagian:

limit_req zone=default burst=10 nodelay;

Agar tidak memilikinya untuk bagian tertentu seperti /staticAnda hanya akan membuat yang terpisah locationdan tidak memasukkannya limit_reqdirektif (atau kebalikannya).

Kyle Brandt
sumber
Terima kasih. Bisakah Anda menjelaskan apa yang dilakukan hal-hal itu (zona, meledak, mengangguk)? Dan, apakah Anda bermaksud mengatakannya zone=limit_req_zone?
orokusaki
Jujur saya tidak bisa menjelaskannya dengan baik, itulah sebabnya saya merasa itu hanya membingungkan. Penjelasan Michael di tautan yang saya berikan sepertinya layak. Saya tidak percaya saya memiliki kesalahan ketik sejauh pertanyaan kedua Anda ... Dokumentasi modul yang saya tautkan memiliki contoh yang mungkin membantu.
Kyle Brandt
2
zona, burst, dan nodelay didokumentasikan pada halaman wiki Nginx tentang modul pembatas laju , ditautkan dari jawaban di atas.
Mark Stosberg
Kyle, apakah Anda tahu jika ada cara untuk menggabungkan batas tarif per lokasi dengan pemicu lain (mis. Header-Otorisasi). Dalam kasus saya, saya mungkin ingin membatasi kecepatan pengguna tertentu.
Nils
1
@Nils AFAICS Anda bisa menggunakan $http_authorizationvariabel untuk menentukan zona baru di mana kuncinya adalah header seperti itu daripada alamat IP, yaitu limit_req_zone $http_authorization zone = per_user : 10m rate = 5r/s, dan kemudian menggunakan per_userzona di bagian lokasi di mana Anda ingin melakukan pembatasan laju per pengguna. Belum diuji, saya baru saja membaca dokumentasi dan daftar variabel nginx ... beri tahu saya jika Anda mencobanya!
idrarig