Skip to main content
  1. Posts/

Menerapkan Rate Limiting dengan NGINX

2 mins
nginx nginx
Table of Contents

Rate Limiting adalah salah satu fitur NGINX yang memungkinkan Anda membatasi jumlah request HTTP yang dapat dilakukan oleh client dalam jangka waktu tertentu. Selain itu, fitur ini juga dapat digunakan untuk membatasi jumlah koneksi yang dapat dibuka oleh satu alamat IP client.

Configuring Rate Limiting Request
#

Berikut contoh konfigurasi untuk membatasi request ke halaman login maksimal 10 request per detik dengan burst hingga 10 request tanpa delay.

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

server {
    ...
    location /login/ {
        limit_req zone=mylimit burst=10 nodelay;
        proxy_pass http://my_upstream;
    }
}

Penjelasan:

  • $binary_remote_addr: Variable ini menyimpan alamat IP client yang melakukan request.
  • zone=mylimit:10m: Membuat zona memori bernama mylimit dengan ukuran 10MB untuk menyimpan data rate limiting.
  • rate=10r/s: Mengizinkan satu alamat IP client untuk melakukan maksimal 10 request per detik.
  • zone=mylimit: Menggunakan zone mylimit yang telah didefinisikan sebelumnya untuk membatasi request.
  • burst=10: Mengizinkan hingga 10 request yang melebihi batas rate (burst request) sebelum request mulai ditolak.
  • nodelay: Semua burst request akan diproses secara bersamaan tanpa delay.

Anda juga bisa membatasi jumlah request berdasarkan server_name yang digunakan. Contohnya seperti berikut.

limit_req_zone $server_name zone=perserver:10m rate=10r/s;

server {
    ...
    limit_req zone=perserver burst=10 nodelay;
}

Secara default, NGINX memberikan respon dengan kode status 503 (Service Temporarily Unavailable) ketika client mencapai batas rate limit. Gunakan limit_req_status untuk menetapkan kode status pada request yang ditolak.

    location /login/ {
        limit_req zone=mylimit burst=10 nodelay;
        limit_req_status 429;
    }

Configuring Rate Limiting Connections
#

Berikut adalah contoh konfigurasi untuk membatasi jumlah koneksi yang dapat dibuat oleh alamat IP tertentu ke halaman login, dengan batas maksimal 10 koneksi.

limit_conn_zone $binary_remote_addr zone=addr:10m;

server {
    ...
    location /download/ {
        limit_conn addr 10;
        limit_conn_status 429;
        ...
    }
}

Sama seperti rate limit request, Anda juga bisa membatasi jumlah koneksi menggunakan variabel server_name seperti contoh berikut.

limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;

server {
    ...
    limit_conn perip 10;
    limit_conn perserver 100;
}

Configuring Rate Limiting Bandwidth
#

Untuk membatasi bandwidth di NGINX, Anda dapat menggunakan limit_rate dan limit_rate_after seperti contoh berikut.

location /download/ {
    limit_rate_after 5m;  # Kirim 5MB pertama tanpa batasan
    limit_rate 1m;       # Setelah 5MB, batasi ke 1 MB/detik
}

Penjelasan:

  • limit_rate_after 5m: Untuk mengatur data awal diunduh tanpa terkena rate_limit, setelah mencapai 5 MB, rate_limit akan diaktifkan.
  • limit_rate 1m: Membatasi kecepatan transfer data menjadi 1 MB/detik.

Anda juga bisa mengatur bandwidth secara dinamis berdasarkan variabel.

map $arg_user $limit_rate {
    "premium"  0;     # Tidak ada batasan untuk pengguna "premium"
    default    100k;  # Batas default 100 KB/detik
}

server {
    location /files/ {
        limit_rate $limit_rate;
    }
}

Referensi:

Related

Custom Log Format in Nginx
1 min
nginx nginx linux
Enable Geoip2 Module in Nginx
2 mins
nginx nginx
Install Nginx dengan PHP-FPM dan Userdir
5 mins
nginx centos linux php nginx
Setting Reverse Proxy dengan Nginx
6 mins
nginx linux nginx
Enable Google PageSpeed Module
2 mins
linux linux apache nginx
Enable Brotli Compression
2 mins
linux apache nginx linux