Cara Membuat Rate Limiting pada NGINX
Rate limiting adalah teknik yang digunakan untuk mengontrol jumlah permintaan yang diterima oleh server dalam jangka waktu tertentu. Ini berguna untuk mencegah serangan DDoS, melindungi server dari beban berlebih, dan memastikan pengguna mendapatkan pengalaman yang adil. NGINX adalah salah satu web server yang populer dan mendukung fitur rate limiting dengan mudah. Berikut adalah langkah-langkah untuk membuat rate limiting pada NGINX.
1. Apa Itu Rate Limiting?
Rate limiting adalah cara untuk membatasi jumlah permintaan yang bisa dilakukan oleh klien ke server dalam periode waktu tertentu. Misalnya, kamu bisa membatasi 100 permintaan per menit dari satu alamat IP. Jika ada yang mencoba melebihi batas ini, NGINX akan menolak permintaan tersebut atau menundanya.
2. Mengapa Perlu Rate Limiting?
- Mencegah Serangan DDoS: Dengan membatasi jumlah permintaan, kamu bisa mengurangi dampak serangan DDoS.
- Mengontrol Penggunaan Sumber Daya: Memastikan server tidak kelebihan beban karena terlalu banyak permintaan.
- Adil untuk Semua Pengguna: Memastikan satu pengguna tidak mengambil semua sumber daya server.
3. Cara Mengaktifkan Rate Limiting di NGINX
NGINX menyediakan modul ngx_http_limit_req_module
untuk rate limiting. Berikut cara menggunakannya:
a. Konfigurasi Zona Pembatasan
Pertama, kamu perlu mendefinisikan zona pembatasan di blok http
di file konfigurasi NGINX (biasanya nginx.conf
atau di direktori sites-available
).
http {
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
}
Penjelasan:
$binary_remote_addr
: Variabel yang menyimpan alamat IP klien dalam bentuk biner.zone=mylimit:10m
: Membuat zona bernamamylimit
dengan ukuran 10 MB. Zona ini digunakan untuk menyimpan status alamat IP.rate=10r/s
: Membatasi permintaan menjadi 10 permintaan per detik.
b. Menerapkan Pembatasan ke Lokasi atau Server
Setelah zona pembatasan didefinisikan, kamu bisa menerapkannya ke blok server
atau location
.
server {
location / {
limit_req zone=mylimit burst=20 nodelay;
proxy_pass http://my_backend;
}
}
Penjelasan:
zone=mylimit
: Menggunakan zonamylimit
yang sudah didefinisikan sebelumnya.burst=20
: Mengizinkan hingga 20 permintaan melebihi batas rate (10r/s) untuk ditangani. Permintaan yang melebihiburst
akan ditolak.nodelay
: Tanpa penundaan, permintaan yang melebihi batas akan langsung ditolak. Jika tidak adanodelay
, permintaan akan ditunda.
4. Contoh Lain: Rate Limiting dengan Delay
Jika kamu ingin menunda permintaan yang melebihi batas, hapus nodelay
.
server {
location / {
limit_req zone=mylimit burst=20;
proxy_pass http://my_backend;
}
}
Dengan konfigurasi ini, permintaan yang melebihi batas akan ditunda sampai bisa diproses.
5. Menggunakan Beberapa Zona Pembatasan
Kamu bisa membuat beberapa zona pembatasan untuk aturan yang berbeda. Misalnya, satu untuk halaman login dan satu lagi untuk halaman lainnya.
http {
limit_req_zone $binary_remote_addr zone=login_limit:10m rate=5r/s;
limit_req_zone $binary_remote_addr zone=general_limit:10m rate=10r/s;
}
server {
location /login {
limit_req zone=login_limit burst=10 nodelay;
proxy_pass http://my_backend;
}
location / {
limit_req zone=general_limit burst=20 nodelay;
proxy_pass http://my_backend;
}
}
6. Mengatur Status Code untuk Permintaan yang Ditolak
Secara default, NGINX akan mengembalikan status code 503
(Service Unavailable) jika permintaan melebihi batas. Kamu bisa mengubahnya dengan limit_req_status
.
http {
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
limit_req_status 429;
}
Dengan konfigurasi di atas, status code yang dikembalikan adalah 429
(Too Many Requests).
7. Menggunakan Variabel Lain untuk Pembatasan
Selain alamat IP, kamu bisa menggunakan variabel lain untuk pembatasan, seperti $server_name
atau $request_uri
.
http {
limit_req_zone $request_uri zone=by_uri:10m rate=10r/s;
}
8. Tips dan Trik
- Ukuran Zona: Pastikan ukuran zona cukup besar untuk menampung semua alamat IP yang mungkin mengakses server. Jika terlalu kecil, beberapa alamat IP mungkin tidak terbatasi dengan benar.
- Testing: Selalu uji konfigurasi rate limiting di lingkungan pengembangan sebelum menerapkannya di produksi.
- Monitoring: Pantau log NGINX untuk melihat apakah ada permintaan yang ditolak karena rate limiting dan sesuaikan batas jika perlu.
Dengan mengikuti langkah-langkah di atas, kamu bisa dengan mudah mengimplementasikan rate limiting di NGINX untuk melindungi server dan memastikan pengalaman pengguna yang lebih baik.