Cara Konfigurasi Rate Limit – Rate limit adalah metode untuk membatasi jumlah permintaan (request) yang bisa dilakukan ke suatu layanan, API, atau server dalam jangka waktu tertentu. Tujuannya adalah untuk mencegah penyalahgunaan, menghindari kelebihan beban, dan melindungi sistem dari serangan seperti DDoS (Distributed Denial of Service).
Misalnya, sebuah website mungkin mengizinkan maksimal 100 permintaan per menit per pengguna atau per alamat IP. Jika batas tersebut terlampaui, permintaan selanjutnya bisa ditolak atau dibatasi sampai periode waktu berikutnya dimulai.
Rate Limiting
Rate limiting is an intelligent mechanism that protects a server from excessive load by limiting the number of requests or connections from a source in a certain time period. By implementing rate limiting, we can prevent DDoS attacks, brute force, or misuse of services.
DDoS (Distributed Denial of Service) adalah serangan siber yang berupaya untuk membuat suatu website atau server tidak dapat diakses oleh pengguna. DDOS dilakukan dengan cara membanjiri target dengan trafik atau permintaan yang sangat besar dari berbagai sumber secara bersamaan. Akibatnya, server menjadi kewalahan, menyebabkan penurunan kinerja atau bahkan downtime total. Dengan begitu, layanan online yang seharusnya tersedia bagi pengguna justru menjadi tidak responsif dan tidak dapat diakses.
Rate limit membantu mengurangi serangan DDoS dengan cara membatasi jumlah permintaan yang bisa dilakukan ke server dalam periode waktu tertentu. Selain itu, rate limit juga bertindak sebagai penghalang yang menjaga agar server tetap responsif dan aman dari serangan trafik berlebihan.
Baca Juga: Cara Install ModSecurity di Nginx + OWASP CRS di Ubuntu Server
Sekarang Kita akan mencoba mengimplementasikan rate limit ke sebuah website yang menggunakan web server nginx. Sebagai tambahan informasi, pada umumnya terdapat 2 jenis rate limit yang biasa digunakan. Yaitu rate limit berbasis koneksi dan rate limit berbasis permintaan.
Jenis-Jenis Rate Limit
Pada langkah pertama, kita akan membuat 2(dua) aturan rate limit yang bersifat global, yaitu aturan rate limit untuk permintaan (request) dan aturan rate limit untuk koneksi (concurrent). Rate limit request berfungsi mengontrol jumlah permintaan yang masuk, sedangkan rate limit koneksi berfungsi untuk membatasi jumlah koneksi aktif.
Buat aturan rate limit request dan rate limit koneksi current di /etc/nginx/conf.d/
sudo nano /etc/nginx/conf.d/rate-limit.conf
Salin dan tempel aturan rate limit di bawah ini:
# Aturan limit request
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=2r/s;
# Aturan limit koneksi
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
Selanjutnya, kita akan menerapkan aturan rate limit yang telah dibuat ke konfigurasi virtualhost Nginx. Dengan menambahkan aturan ini ke setiap website yang dikelola, kita dapat membatasi jumlah permintaan dan koneksi per IP untuk mencegah lonjakan trafik yang berlebihan. Konfigurasi ini akan diterapkan dalam blok server pada tiap virtualhost.
Misal di sini Kita terapkan ke salah satu website, dengan domain testapp.awanservers.com
sudo nano /etc/nginx/sites-available/testapp.awanservers.com
Salin baris berikut dan tempelkan ke dalam block location / {}
# Menerapkan aturan rate limit request
limit_req zone=req_limit burst=5 nodelay;
# Menerapkan aturan limit koneksi
limit_conn conn_limit 10;
# Status Rate Limit
limit_req_status 429;

Setelah itu, uji konfigurasi nginx dan pastikan tidak ada error.
sudo nginx -t

Terakhir restart service nginx.
sudo systemctl restart nginx
Untuk menguji rate limiter yang sudah dikonfigurasi, ada beberapa cara dan tools yang bisa digunakan. Tools tersebut diantaranya, cURL, Apache Benchmark, dan Siege. Tapi pada kali ini kita hanya akan melakukan uji beban menggunakan Apache Benchmark dan memeriksa apakah server menanggapi dengan HTTP 429 atau 503 setelah melewati batas koneksi atau permintaan.
Pertama install dulu tools Apache Bencmark (pengujianya di linux ya..)
sudo apt install apache-utils -y
Perintah di bawah ini akan menguji: Mengirimkan total 200 request (-n 2000) dan Menjalankan 50 request secara bersamaan (-c100).
ab -n 2000 -c 100 https://testapp.awanservers.com/
Hasil benchmarknya seperti ini:
Dari 200 request, hanya 8 request yang berhasil dan 192 request lainya gagal, ini mengindikasikan bahwa sebagian besar request tidak diterima karena rate limiter (kemungkinan besar mendapatkan HTTP 429). Perhatikan webnya juga diproteksi oleh proxy cloudflare.

Jika kita cek webnya, akan terkena error 429 seperti ini:

Kemudian cek error log nginx juga akan banyak error 429.

Jadi begitulah cara konfigurasi rate limit di nginx. Dengan menerapkan konfigurasi rate limit di Nginx, kamu telah menambahkan lapisan perlindungan penting untuk mencegah serangan DDoS. Dengan memanfaatkan directive seperti limit_req_zone dan limit_req, server dapat mengatur dan membatasi jumlah permintaan yang diterima dalam periode waktu tertentu, sehingga mengurangi risiko overload dan memastikan kestabilan layanan.
Semoga panduan ini bermanfaat, dan selamat mencoba! 🚀