Rate Limiting adalah salah satu fitur NGINX yang memungkinkan Anda membatasi jumlah request HTTP yang dapat dilakukan oleh client dalam jangka waktu tertentu. Selain itu, fitur ini juga dapat digunakan untuk membatasi jumlah koneksi yang dapat dibuka oleh satu alamat IP client.
Configuring Rate Limiting Request #
Berikut contoh konfigurasi untuk membatasi request ke halaman login maksimal 10 request per detik dengan burst hingga 10 request tanpa delay.
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
server {
...
location /login/ {
limit_req zone=mylimit burst=10 nodelay;
proxy_pass http://my_upstream;
}
}
Penjelasan:
- $binary_remote_addr: Variable ini menyimpan alamat IP client yang melakukan request.
- zone=mylimit:10m: Membuat zona memori bernama mylimit dengan ukuran 10MB untuk menyimpan data rate limiting.
- rate=10r/s: Mengizinkan satu alamat IP client untuk melakukan maksimal 10 request per detik.
- zone=mylimit: Menggunakan zone mylimit yang telah didefinisikan sebelumnya untuk membatasi request.
- burst=10: Mengizinkan hingga 10 request yang melebihi batas rate (burst request) sebelum request mulai ditolak.
- nodelay: Semua burst request akan diproses secara bersamaan tanpa delay.
Anda juga bisa membatasi jumlah request berdasarkan server_name yang digunakan. Contohnya seperti berikut.
limit_req_zone $server_name zone=perserver:10m rate=10r/s;
server {
...
limit_req zone=perserver burst=10 nodelay;
}
Secara default, NGINX memberikan respon dengan kode status 503 (Service Temporarily Unavailable) ketika client mencapai batas rate limit. Gunakan limit_req_status
untuk menetapkan kode status pada request yang ditolak.
location /login/ {
limit_req zone=mylimit burst=10 nodelay;
limit_req_status 429;
}
Configuring Rate Limiting Connections #
Berikut adalah contoh konfigurasi untuk membatasi jumlah koneksi yang dapat dibuat oleh alamat IP tertentu ke halaman login, dengan batas maksimal 10 koneksi.
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
...
location /download/ {
limit_conn addr 10;
limit_conn_status 429;
...
}
}
Sama seperti rate limit request, Anda juga bisa membatasi jumlah koneksi menggunakan variabel server_name seperti contoh berikut.
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
server {
...
limit_conn perip 10;
limit_conn perserver 100;
}
Configuring Rate Limiting Bandwidth #
Untuk membatasi bandwidth di NGINX, Anda dapat menggunakan limit_rate dan limit_rate_after seperti contoh berikut.
location /download/ {
limit_rate_after 5m; # Kirim 5MB pertama tanpa batasan
limit_rate 1m; # Setelah 5MB, batasi ke 1 MB/detik
}
Penjelasan:
- limit_rate_after 5m: Untuk mengatur data awal diunduh tanpa terkena
rate_limit, setelah mencapai 5 MB,rate_limitakan diaktifkan. - limit_rate 1m: Membatasi kecepatan transfer data menjadi 1 MB/detik.
Anda juga bisa mengatur bandwidth secara dinamis berdasarkan variabel.
map $arg_user $limit_rate {
"premium" 0; # Tidak ada batasan untuk pengguna "premium"
default 100k; # Batas default 100 KB/detik
}
server {
location /files/ {
limit_rate $limit_rate;
}
}
Referensi: