Setup Rate Limiting Nginx Tanpa Cloudflare

Setup Rate Limiting Nginx Tanpa Cloudflare

Tidak semua sistem butuh Cloudflare, CDN, atau WAF mahal untuk bertahan dari abuse. Faktanya, Nginx bawaan sudah punya rate limiting yang sangat kuat—asal dipahami dengan benar.

Masalahnya:

  • Banyak yang salah pasang
  • Salah hitung limit
  • Salah scope
  • Akhirnya blok user legit, sementara attacker lolos

Artikel ini membahas cara rate limiting Nginx bekerja, pola yang benar, dan kesalahan fatal yang sering terjadi.


1. Apa Itu Rate Limiting?

Rate limiting = membatasi jumlah request dalam periode waktu tertentu.

Tujuan:

  • Mencegah brute force
  • Mengurangi scraping
  • Melindungi endpoint berat
  • Menahan abuse bot

Bukan untuk:

  • Mengganti firewall
  • Mengganti DDoS protection skala besar

2. Senjata Utama Nginx

Nginx menyediakan dua directive inti:

  1. limit_req_zone → definisi zona & key
  2. limit_req → penerapan limit

Tambahan:

  • limit_conn_zone
  • limit_conn

3. Konsep Penting yang Sering Diabaikan

Rate limit ≠ per IP selalu

Key rate limit bebas:

  • IP ($binary_remote_addr)
  • Header ($http_authorization)
  • Cookie
  • API key
  • User ID (jika diproxy)

Salah memilih key = rate limit gagal total.


4. Contoh Rate Limiting Paling Dasar

limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;

Artinya:

  • Berdasarkan IP
  • Maksimal 10 request/detik
  • Zona RAM 10 MB

Diterapkan di location:

location /api/ {
    limit_req zone=req_limit burst=20 nodelay;
    proxy_pass http://backend;
}

5. burst dan nodelay: Sering Salah Kaprah

❌ Kesalahpahaman

“burst = tambahan limit”

Salah.

Cara Kerja Sebenarnya:

  • rate = kecepatan rata-rata
  • burst = antrian sementara
  • nodelay = langsung proses tanpa delay

Tanpa nodelay:

  • Request berlebih ditunda, bukan ditolak

Dengan nodelay:

  • Request di atas limit langsung 429

6. Contoh yang Aman untuk User Nyata

limit_req zone=req_limit burst=30;

Efek:

  • User bisa klik cepat
  • Bot tetap tertahan
  • UX lebih manusiawi

7. Kesalahan Fatal #1: Rate Limit di server {}

server {
    limit_req zone=req_limit;
}

Dampak:

  • Semua endpoint kena limit
  • Asset statis ikut dibatasi
  • Website terasa “lemot”

✅ Yang Benar

Rate limit hanya di endpoint sensitif:

  • /login
  • /api
  • /search
  • /wp-login.php

8. Rate Limiting Login Tanpa Cloudflare

limit_req_zone $binary_remote_addr zone=login_limit:10m rate=5r/m;

location = /login {
    limit_req zone=login_limit burst=5;
    proxy_pass http://backend;
}

Efek:

  • Bruteforce login mati
  • User normal tetap aman

9. API Rate Limit (Lebih Cerdas dari IP)

Salah:

limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;

Lebih Benar (API Key):

limit_req_zone $http_x_api_key zone=api:10m rate=20r/s;

Keuntungan:

  • Tidak rusak oleh NAT
  • Lebih adil
  • Lebih presisi

10. NAT & Mobile Network: Musuh Rate Limit IP

Satu IP bisa:

  • Puluhan user mobile
  • Ratusan user kantor

Solusi:

  • Rate lebih longgar
  • Gunakan header auth
  • Kombinasikan dengan burst

11. limit_conn: Pelengkap, Bukan Pengganti

Batasi koneksi bersamaan:

limit_conn_zone $binary_remote_addr zone=conn_limit:10m;

location / {
    limit_conn conn_limit 10;
}

Fungsi:

  • Menahan slowloris
  • Menahan client super lambat

12. Custom Response & Logging

Status default:

  • 503 (tanpa nodelay)
  • 429 (dengan nodelay)

Custom:

limit_req_status 429;

Log khusus:

error_log /var/log/nginx/ratelimit.log notice;

13. Rate Limiting ≠ Anti-DDoS

Harus jujur:

  • Nginx tidak menggantikan Cloudflare
  • DDoS besar tetap butuh CDN / provider

Namun:

  • Untuk abuse ringan–menengah
  • Internal API
  • Admin panel

➡️ Nginx sudah lebih dari cukup


14. Checklist Aman Rate Limiting

  • ✅ Scope sempit
  • ✅ Key tepat
  • ✅ Burst manusiawi
  • ❌ Jangan limit asset statis
  • ❌ Jangan limit global tanpa pikir

15. Kesimpulan

Rate limiting tanpa Cloudflare:

  • Bisa
  • Efektif
  • Murah
  • Stabil

Asal:

Jangan asal copy-paste konfigurasi

Jika mengingat satu hal saja:

Rate limit yang baik menahan bot, bukan manusia