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.
Konfigurasi Rate Limiting Request
Berikut ini adalah contoh konfigurasi Nginx untuk membatasi jumlah request ke halaman login (/wp-login.php
) dan cron (/wp-cron.php
). Konfigurasi ini mengizinkan maksimal 1 request per detik ke halaman login, dengan burst hingga 1 request tanpa penundaan, serta maksimal 10 request per detik ke halaman cron.
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
limit_req_zone $binary_remote_addr zone=two:10m rate=10r/s;
server {
...
location = /wp-login.php {
limit_req zone=one burst=1 nodelay;
include fastcgi_params;
fastcgi_pass php74;
}
location = /wp-cron.php {
limit_req zone=two burst=1 nodelay;
include fastcgi_params;
fastcgi_pass php74;
}
}
Penjelasan:
-
$binary_remote_addr
: Variabel yang menyimpan alamat IP client dalam format biner, digunakan untuk identifikasi unik setiap client. -
limit_req_zone
: Mendefinisikan zona rate limiting.zone=one:10m
/zone=two:10m
: Menciptakan zona memori masing-masing sebesar 10MB untuk menyimpan informasi rate limit per alamat IP.rate=1r/s
/rate=10r/s
: Menentukan batas kecepatan request.1r/s
artinya satu request per detik;10r/s
artinya sepuluh request per detik.
-
limit_req
: Menerapkan pembatasan request pada lokasi tertentu.zone=one
/zone=two
: Menunjukkan zona yang digunakan.burst=1
: Mengizinkan satu request tambahan melebihi limit sebelum request mulai ditolak.nodelay
: Burst request diproses langsung tanpa penundaan.
Anda juga dapat membatasi jumlah request berdasarkan nama server (server_name
) yang digunakan dalam request. Contoh konfigurasi:
limit_req_zone $server_name zone=perserver:10m rate=10r/s;
server {
...
limit_req zone=perserver burst=1 nodelay;
}
Penjelasan:
$server_name
: Variabel yang merepresentasikan nama domain yang diminta oleh client. Digunakan untuk membedakan pembatasan berdasarkan domain.zone=perserver:10m
: Membuat zona memori bernamaperserver
sebesar 10MB.rate=10r/s
: Mengizinkan maksimal 10 request per detik untuk setiap nilaiserver_name
.burst=1
: Mengizinkan 1 request tambahan secara burst sebelum mulai ditolak.nodelay
: Burst request akan langsung diproses tanpa penundaan.
Secara default, NGINX mengembalikan kode status 503 Service Temporarily Unavailable saat permintaan melebihi batas rate. Anda dapat mengubah kode status ini menggunakan direktif limit_req_status
. Contoh:
location /login/ {
limit_req zone=mylimit burst=1 nodelay;
limit_req_status 429;
}
Penjelasan:
limit_req_status 429
: Mengatur agar request yang ditolak karena melebihi batas diberikan respons dengan HTTP 429 Too Many Requests, yang lebih sesuai secara semantik untuk kasus rate limiting.
Konfigurasi Rate Limiting untuk Koneksi
Berikut ini adalah contoh konfigurasi NGINX untuk membatasi jumlah koneksi simultan yang dapat dibuat oleh satu alamat IP ke endpoint tertentu, misalnya halaman /download/
. Dalam contoh ini, satu alamat IP hanya diizinkan membuat maksimal 10 koneksi secara bersamaan.
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
...
location /download/ {
limit_conn addr 10;
limit_conn_status 429;
...
}
}
Penjelasan:
limit_conn_zone $binary_remote_addr zone=addr:10m
: Membuat zona memori bernamaaddr
untuk menyimpan data koneksi per IP client, dengan alokasi memori sebesar 10MB.limit_conn addr 10
: Membatasi jumlah koneksi simultan dari satu alamat IP maksimum sebanyak 10 koneksi.limit_conn_status 429
: Mengatur agar koneksi yang ditolak karena melebihi batas diberikan respons dengan HTTP 429 Too Many Requests (lebih tepat secara semantik dibanding default 503).
Sama seperti pembatasan berdasarkan IP, Anda juga dapat membatasi jumlah koneksi berdasarkan nama server (server_name
). Berikut adalah contoh konfigurasi kombinasi keduanya:
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
server {
...
limit_conn perip 10; # Maksimal 10 koneksi per IP
limit_conn perserver 100; # Maksimal 100 koneksi per nama server
}
Penjelasan:
$binary_remote_addr
: Variabel yang digunakan untuk membatasi koneksi berdasarkan alamat IP client.$server_name
: Variabel untuk membatasi koneksi berdasarkan nama domain/server yang diminta client.limit_conn
: Digunakan untuk menetapkan batas koneksi untuk zona tertentu.
Konfigurasi Rate Limiting Bandwidth
Untuk membatasi penggunaan bandwidth di NGINX, Anda dapat menggunakan direktif limit_rate
dan limit_rate_after
. Berikut ini contoh konfigurasi dasarnya:
location /download/ {
limit_rate_after 5m; # Kirim 5MB pertama tanpa batasan
limit_rate 1m; # Setelah 5MB, batasi ke 1MB/detik
}
Penjelasan:
limit_rate_after 5m
: Mengizinkan 5MB pertama dikirim tanpa pembatasan kecepatan. Setelah itu, pembatasan diterapkan.limit_rate 1m
: Mengatur kecepatan transfer maksimum menjadi 1 megabyte per detik (MB/s) setelah batas awal tercapai.
Catatan: Satuan
m
dalam kontekslimit_rate
danlimit_rate_after
berarti megabyte dan megabyte per detik, bukan menit.
Anda juga dapat mengatur batas bandwidth secara dinamis berdasarkan nilai variabel, seperti parameter query. Contohnya:
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;
}
}
Penjelasan:
map
: Membuat pemetaan antara nilai parameter ($arg_user
) dan kecepatan transfer ($limit_rate
).limit_rate $limit_rate
: Menerapkan batasan kecepatan transfer secara dinamis sesuai hasil pemetaan.
Referensi: