Cara Menilai Batas di NGINX

Pembatasan tarif di NGINX adalah fitur penting untuk mengontrol jumlah lalu lintas yang ditangani server Anda. Ini membantu melindungi server Anda dari kewalahan oleh terlalu banyak permintaan dalam waktu singkat, yang dapat disebabkan oleh serangan berbahaya seperti DDoS atau lonjakan lalu lintas yang tinggi. Menerapkan pembatasan tarif memastikan bahwa sumber daya Anda digunakan secara efisien dan pengguna yang sah dapat mengakses layanan Anda tanpa gangguan.

Panduan ini akan mendemonstrasikan cara mengonfigurasi pembatasan kecepatan di NGINX, memberikan instruksi yang jelas untuk membantu Anda mengelola dan mengontrol lalu lintas masuk secara efektif.

Memahami Arahan Batas Nilai di NGINX

Petunjuk Utama Pembatasan Nilai NGINX

NGINX mengonfigurasi pembatasan kecepatan menggunakan arahan tertentu, yang masing-masing memiliki fungsi unik:

  • batas_req_zona: Direktif limit_req_zone di NGINX menyiapkan zona memori bersama untuk menyimpan informasi pembatas kecepatan. Diposisikan dalam konteks http, ini menentukan tingkat permintaan yang diizinkan, yang secara efektif menetapkan garis dasar untuk batas kecepatan.
  • batas_permintaan: Arahan limit_req, yang digunakan dalam konteks lokasi, menerapkan batas kecepatan yang ditetapkan oleh limit_req_zone. Ini menerapkan batasan ini pada lokasi atau URL tertentu, sehingga mengontrol frekuensi akses ke titik akhir tersebut.
  • batas_req_status: Diposisikan dalam konteks lokasi, direktif limit_req_status menentukan kode status HTTP yang dikembalikan ketika tingkat permintaan melebihi batas. Mekanisme umpan balik ini sangat penting untuk memberi tahu pengguna atau sistem otomatis ketika mereka melebihi frekuensi permintaan yang diizinkan.

Membuat Konfigurasi Pembatas Kecepatan

Untuk menerapkan pembatasan kecepatan di NGINX, masukkan arahan yang sesuai ke dalam file konfigurasi NGINX. Perhatikan contoh dasar ini:

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

    server {
        ...
        location / {
            limit_req zone=mylimit burst=10;
            ...
        }
    }
}

Dalam konfigurasi ini, direktif limit_req_zone menetapkan zona memori bernama 'mylimit', mengizinkan 5 permintaan per detik (5r/s) dari setiap alamat IP klien ($binary_remote_addr). Arahan limit_req kemudian menerapkan batas tarif ini ke lokasi akar (/), dengan kapasitas lonjakan 10 permintaan, menawarkan keseimbangan antara pembatasan tarif yang ketat dan fleksibilitas untuk lonjakan lalu lintas yang sah.

Batasan Tarif di NGINX: Contoh Praktis

Konfigurasi Pembatasan Tarif Dasar

Bagian ini akan mengeksplorasi konfigurasi pembatasan kecepatan dasar yang diterapkan di seluruh server di NGINX. Tujuannya adalah untuk membatasi permintaan pengguna ke server, memastikan kinerja stabil dan mengurangi risiko kelebihan beban.

Contoh: Batas Tarif Seluruh Server

Perhatikan konfigurasi NGINX berikut:

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

    server {
        listen 80;
        server_name example.com;

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

Konfigurasi ini menetapkan batas 2 permintaan per detik untuk setiap klien, sebagaimana ditentukan oleh alamat IP mereka ($binary_remote_addr). Mari kita uraikan komponen-komponen utamanya:

  • limit_req_zone: Mendefinisikan zona memori (mylimit) untuk menyimpan status batas kecepatan dengan ukuran 10 megabyte. Ini menetapkan batas kecepatan menjadi 2 permintaan per detik (2r/s).
  • blok server: Mendengarkan pada port 80 untuk lalu lintas masuk ke example.com.
  • blok lokasi: Menerapkan batas kecepatan ke URL root (/). Parameter burst memungkinkan burst hingga 5 permintaan, memberikan fleksibilitas untuk lonjakan lalu lintas yang singkat. Direktif proxy_pass meneruskan permintaan ke server backend yang ditentukan.
  • Parameter Ledakan: Pengaturan burst=5 dalam direktif limit_req memungkinkan peningkatan permintaan jangka pendek, hingga 5 permintaan tambahan di atas kecepatan yang ditetapkan. Fitur ini sangat penting dalam menangani peningkatan lalu lintas yang tiba-tiba dan wajar tanpa memengaruhi pengalaman pengguna.
  • Tiket Proksi: Proxy_pass http://backend; direktif meneruskan lalu lintas ke server backend. Ini biasanya digunakan dalam skenario penyeimbangan beban atau ketika NGINX bertindak sebagai proksi terbalik.

Contoh Pembatasan Tarif Tingkat Lanjut

Batas Tarif Berbeda untuk Lokasi Berbeda

Anda mungkin perlu menerapkan batas kecepatan yang berbeda untuk bagian aplikasi yang berbeda dalam skenario yang lebih kompleks. Hal ini sangat berguna ketika titik akhir tertentu lebih banyak menggunakan sumber daya atau rentan terhadap penyalahgunaan.

Pertimbangkan konfigurasi berikut:

http {
    limit_req_zone $binary_remote_addr zone=low:10m rate=1r/s;
    limit_req_zone $binary_remote_addr zone=high:10m rate=10r/s;

    server {
        listen 80;
        server_name example.com;

        location /api/low {
            limit_req zone=low burst=3;
            proxy_pass http://backend;
        }

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

Konfigurasi ini menerapkan batas kecepatan yang lebih rendah (1 permintaan per detik) ke lokasi /api/low dan batas kecepatan yang lebih tinggi (10 permintaan per detik) ke lokasi /api/high.

Contoh Pembatasan Tarif Nginx Tambahan

Pembatasan Tarif Berdasarkan Jenis Permintaan

Anda dapat mengonfigurasi pembatasan tarif berdasarkan permintaan tertentu, seperti permintaan GET, POST, atau PUT. Hal ini sangat berguna ketika Anda ingin melindungi titik akhir tertentu yang lebih rentan terhadap penyalahgunaan atau memiliki dampak lebih tinggi pada sumber daya server Anda.

Anda dapat menggunakan arahan if dan variabel $request_method untuk menerapkan pembatasan tarif pada jenis permintaan tertentu. Berikut ini contohnya:

http {
    limit_req_zone $binary_remote_addr zone=get_limit:10m rate=5r/s;
    limit_req_zone $binary_remote_addr zone=post_limit:10m rate=2r/s;

    server {
        listen 80;
        server_name example.com;

        location / {
            if ($request_method = GET) {
                limit_req zone=get_limit burst=10;
            }

            if ($request_method = POST) {
                limit_req zone=post_limit burst=5;
            }

            proxy_pass http://backend;
        }
    }
}

Dalam konfigurasi ini, kami telah menyiapkan dua batas kecepatan terpisah: satu untuk permintaan GET (5 permintaan per detik) dan satu lagi untuk permintaan POST (2 permintaan per detik).

Pembatasan Tarif Berdasarkan Agen-Pengguna

Teknik lain yang bermanfaat adalah dengan menerapkan pembatasan tarif berdasarkan header Agen-Pengguna yang dikirim oleh klien. Hal ini dapat membantu melindungi layanan Anda dari bot atau crawler tertentu yang menyebabkan masalah.

Untuk menerapkan pembatasan tarif berdasarkan Agen-Pengguna, Anda dapat menggunakan direktif peta dan variabel $http_user_agent.

Berikut ini contohnya:

http {
    map $http_user_agent $limit_bots {
        default 0;
        ~*(Googlebot|Bingbot) 1;
    }

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

    server {
        listen 80;
        server_name example.com;

        location / {
            if ($limit_bots) {
                limit_req zone=bot_limit burst=2;
            }

            proxy_pass http://backend;
        }
    }
}

Dalam contoh ini, kami telah mendefinisikan direktif peta yang menyetel variabel $limit_bots ke 1 jika header Agen-Pengguna cocok dengan “Googlebot” atau “Bingbot”. Kami kemudian menerapkan batas kecepatan 1 permintaan per detik untuk permintaan dari bot ini.

Memasukkan IP ke dalam daftar putih dari Pembatasan Nilai

Terkadang, Anda mungkin ingin mengecualikan alamat IP tertentu, seperti mitra tepercaya atau layanan internal, dari pembatasan tarif. Untuk mencapai hal ini, Anda dapat menggunakan arahan geo, bersama dengan if direktif.

Berikut ini contohnya:

http {
    geo $rate_limit {
        default 1;
        192.168.0.0/24 0;
        10.0.0.0/8 0;
    }

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

    server {
        listen 80;
        server_name example.com;

        location / {
            if ($rate_limit) {
                limit_req zone=mylimit burst=10;
            }

            proxy_pass http://backend;
        }
    }
}

Pembatasan Tingkat Penskalaan dalam Lingkungan Terdistribusi

Ketika beberapa instance Nginx berjalan di lingkungan terdistribusi, Anda mungkin ingin memastikan bahwa pembatasan kecepatan konsisten di semua instance. Anda dapat menggunakan penyimpanan data terpusat seperti Redis untuk mengelola batas kecepatan untuk mencapai hal ini. Melakukan hal ini memungkinkan Anda mempertahankan batas kecepatan global yang dibagikan di antara semua instance Nginx.

Untuk mengatur pembatasan kecepatan dengan Redis, Anda harus menginstal dan mengkonfigurasi modul nginx-module-redis. Setelah Anda menginstal modul, Anda dapat memperbarui konfigurasi Nginx Anda untuk menggunakan Redis untuk pembatasan kecepatan.

Berikut ini contohnya:

load_module modules/ngx_http_redis_module.so;

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

    upstream redis_server {
        server 127.0.0.1:6379;
        keepalive 32;
    }

    server {
        listen 80;
        server_name example.com;

        location / {
            limit_req_redis zone=mylimit burst=10 redis_server=redis_server;
            proxy_pass http://backend;
        }
    }
}

Dalam contoh ini, kami telah menentukan blok upstream untuk server Redis dan memperbarui blok lokasi untuk menggunakan direktif limit_req_redis alih-alih direktif limit_req standar. Konfigurasi ini memastikan bahwa batas kecepatan diterapkan menggunakan penyimpanan data Redis bersama, memberikan pembatasan kecepatan yang konsisten di beberapa instance Nginx.

Pembatasan Kecepatan Dinamis

Dalam beberapa situasi, Anda mungkin ingin menyesuaikan batas kecepatan secara dinamis berdasarkan kondisi tertentu atau beban saat ini di server Anda. Misalnya, Anda mungkin ingin menerapkan batas tarif yang lebih ketat selama waktu lalu lintas puncak untuk mengelola sumber daya server dengan lebih baik.

Untuk menerapkan pembatasan kecepatan dinamis, Anda dapat menggunakan map arahan untuk menentukan batas tarif berdasarkan kondisi tertentu.

Berikut ini contohnya:

http {
    map $http_x_traffic $dynamic_rate {
        default "5r/s";
        high "2r/s";
    }

    limit_req_zone $binary_remote_addr zone=mylimit:10m rate=$dynamic_rate;

    server {
        listen 80;
        server_name example.com;

        location / {
            limit_req zone=mylimit burst=10;
            proxy_pass http://backend;
        }
    }
}

Dalam konfigurasi ini, kami menggunakan variabel $http_x_traffic yang berasal dari header kustom X-Traffic. Berdasarkan nilai header ini, kami menetapkan batas kecepatan secara dinamis. Jika nilai headernya “tinggi”, kami menerapkan batas kecepatan yang lebih ketat yaitu 2 permintaan per detik. Jika tidak, kami menggunakan kecepatan default 5 permintaan per detik.

Perhatikan bahwa contoh ini mengasumsikan bahwa server backend atau komponen lain di infrastruktur Anda menyetel header X-Traffic berdasarkan kondisi yang Anda inginkan.

Menguji Batas Kecepatan Anda di Konfigurasi NGINX

Memverifikasi Pembatasan Kecepatan dengan curl

Menggunakan curl untuk Pengujian Permintaan Sederhana

Untuk memvalidasi efektivitas pengaturan pembatasan kecepatan Anda di NGINX, curl, alat baris perintah untuk mengirim permintaan HTTP, terbukti sangat berguna. Ini dapat dengan cepat mengirim beberapa permintaan ke server Anda, membantu Anda menilai apakah batas kecepatan aktif.

for i in {1..10}; do curl -I http://example.com; done
  • Perintah ini mengeluarkan 10 permintaan HEAD ke server Anda, yang menargetkan http://example.com.
  • Analisis header respons HTTP dari permintaan ini untuk memverifikasi fungsionalitas pembatasan kecepatan.
  • NGINX harus mengembalikan kode status 429 Terlalu Banyak Permintaan ketika tingkat permintaan melebihi batas yang Anda tentukan.

Menguji dengan Apache Bench (ab)

Membandingkan Respons Server dengan Apache Bench

Apache Bench (ab) adalah alat pembandingan efektif yang ideal untuk menguji batas kecepatan dengan mensimulasikan kondisi lalu lintas tinggi. Ini membantu memahami bagaimana server NGINX Anda berperilaku di bawah lonjakan permintaan.

ab -n 100 -c 10 http://example.com/
  • Perintah ini menginstruksikan ab untuk mengirim 100 permintaan ke http://example.com dengan tingkat konkurensi 10.
  • Keluaran dari ab memberikan wawasan mengenai efektivitas pembatasan laju.
  • Fokus pada jumlah permintaan yang gagal dalam output, yang harus selaras dengan pengaturan konfigurasi pembatasan kecepatan NGINX Anda.

Menggunakan metode terbaik untuk menguji konfigurasi NGINX Anda memastikan bahwa aturan pembatasan kecepatan Anda berfungsi sebagaimana mestinya.

Kesimpulan

Dengan mengonfigurasi pembatasan kecepatan di NGINX, Anda dapat melindungi server Anda dari lalu lintas berlebihan dan potensi penyalahgunaan. Hal ini membantu menjaga kinerja dan ketersediaan layanan Anda, memastikan pengalaman yang lebih baik bagi pengguna yang sah. Pantau dan sesuaikan pengaturan pembatasan tarif Anda secara rutin untuk menyeimbangkan keamanan dan aksesibilitas. Menerapkan kontrol ini sangat penting dalam mengelola sumber daya server Anda secara efisien.

Joshua James
Ikuti aku
Postingan terbaru oleh Joshua James (Lihat semua)

Tinggalkan komentar