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:

  1. limit_req_zone → mendefinisikan zona memory untuk menyimpan state limit.
  2. 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 bernama one 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 konfigurasi limit_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.