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:
limit_req_zone→ definisi zona & keylimit_req→ penerapan limit
Tambahan:
limit_conn_zonelimit_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-rataburst= antrian sementaranodelay= 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