Cara Implementasi Rate-Limit per IP di Nginx
Dalam dunia digital yang serba cepat, menjaga performa server agar tetap stabil adalah salah satu tantangan utama. Salah satu masalah umum yang sering muncul adalah traffic berlebihan dari IP tertentu yang bisa menyebabkan server lambat atau bahkan down. Untuk mengatasi hal ini, Nginx memiliki fitur rate limiting yang memungkinkan kita membatasi jumlah request per IP. Artikel ini akan membahas bagaimana cara implementasi rate-limit per IP di Nginx dengan langkah yang jelas, disertai tips agar tetap aman dan efisien.
Mengapa Rate-Limit Penting di Nginx?
Sebelum masuk ke teknis, mari pahami dulu alasan kenapa rate-limiting sangat krusial:
- Mencegah serangan DDoS sederhana
Banyak serangan menggunakan flood request dari satu atau beberapa IP. Rate-limit bisa membantu meredam efeknya. - Menjaga kestabilan server
Dengan membatasi request per IP, resource server tidak terbebani oleh spam traffic. - Meningkatkan pengalaman pengguna asli
Pengguna normal tidak terganggu oleh server lambat akibat request berlebihan.
Dalam konteks infrastruktur dan security, konfigurasi ini bisa menjadi lapisan perlindungan tambahan di luar firewall.
Dasar Konsep Rate-Limiting di Nginx
Nginx menggunakan leaky bucket algorithm untuk mengatur request. Artinya, request dari setiap IP akan “diteteskan” ke dalam bucket dengan kecepatan tertentu. Jika bucket penuh, request tambahan akan ditolak atau ditunda.
Dua directive utama yang digunakan:
limit_req_zone
→ mendefinisikan zona memory untuk menyimpan state limit.limit_req
→ menerapkan aturan rate-limit pada lokasi atau server tertentu.
Langkah Implementasi Rate-Limit per IP
Berikut langkah-langkah yang bisa kamu ikuti:
1. Definisikan Limit Request Zone
Di dalam konfigurasi http { ... }
, tambahkan:
limit_req_zone $binary_remote_addr zone=one:10m
rate=5r/s;
$binary_remote_addr
→ variabel untuk mengidentifikasi IP client.zone=one:10m
→ membuat zona memory bernamaone
sebesar 10 MB.rate=5r/s
→ batas maksimal 5 request per detik per IP.
2. Terapkan pada Server atau Lokasi
Di dalam blok server { ... }
atau location { ... }
, tambahkan:
location
/ { limit_req zone=one burst=10
nodelay;
}
zone=one
→ mengacu ke konfigurasilimit_req_zone
yang sudah dibuat.burst=10
→ memperbolehkan lonjakan 10 request tambahan dalam waktu singkat.nodelay
→ request di luar batas langsung ditolak, tidak ditunda.
3. Reload Nginx
Setelah konfigurasi selesai, reload server dengan:
sudo nginx -t
sudo systemctl reload nginx
Perintah -t
memastikan tidak ada error pada konfigurasi.
Contoh Kasus Praktis
Misalnya kamu punya API publik yang sering diakses. Tanpa rate-limiting, satu user bisa saja mengirim ratusan request per detik yang membuat API tidak responsif. Dengan aturan di atas, setiap IP hanya bisa mengirim 5 request per detik, burst 10. Jika lebih, request akan diblokir.
Hasilnya:
✅ Server tetap stabil
✅ User lain tetap mendapat respon normal
✅ Serangan sederhana otomatis terfilter
Tips Optimasi Rate-Limit di Nginx
1. Sesuaikan dengan Kapasitas Server
Jika server cukup kuat, kamu bisa menaikkan batas rate. Misalnya 20r/s agar tidak mengganggu pengguna normal.
2. Gunakan Logging
Tambahkan log khusus untuk request yang kena limit agar bisa dianalisis. Contohnya:
limit_req_status 429
;
Lalu cek log di /var/log/nginx/error.log
.
3. Kombinasikan dengan Firewall
Rate-limiting hanya lapisan pertama. Untuk serangan besar, gunakan firewall atau WAF (Web Application Firewall) agar lebih aman.
4. Terapkan Per Lokasi
Tidak semua path perlu rate-limit. Fokuskan pada endpoint sensitif seperti /login
atau /api
.
5. Uji di Staging
Sebelum di-deploy ke produksi, selalu uji di lingkungan staging agar tahu efeknya ke user experience.