Rumah >Operasi dan penyelenggaraan >Nginx >Bagaimana Nginx mengehadkan permintaan sumber http

Bagaimana Nginx mengehadkan permintaan sumber http

王林
王林ke hadapan
2023-05-17 12:16:061044semak imbas

Prasyarat: nginx perlu mempunyai modul ngx_http_limit_conn_module dan ngx_http_limit_req_module Anda boleh menggunakan perintah 2>&1 nginx -v | pasang dua modul ini.

Versi ujian ialah: versi nginx ialah 1.15+

Hadkan bilangan pautan

1. Gunakan arahan limit_conn_zone untuk menentukan kunci dan tetapkan parameter untuk zon memori yang dikongsi (proses pekerja akan menggunakan zon ini untuk berkongsi pembilang nilai kunci). Parameter pertama menentukan ungkapan untuk dinilai sebagai kunci. Zon parameter kedua menentukan nama dan saiz zon:

limit_conn_zone $binary_remote_addr zone=addr:10m;

2 Gunakan arahan limit_conn dalam konteks lokasi {}, pelayan {} atau http {} untuk menggunakan parameter pertama ialah nilai yang ditetapkan di atas. Nama kawasan memori kongsi yang ditentukan Parameter kedua ialah bilangan pautan yang dibenarkan untuk setiap kunci:

location /download/ {
 limit_conn addr 1;
}

Apabila menggunakan pembolehubah $binary_remote_addr sebagai parameter, ia adalah berdasarkan sekatan bagi alamat ip. Anda juga boleh menggunakan pembolehubah $server_name Hadkan bilangan sambungan ke pelayan yang diberikan:

http {
 limit_conn_zone $server_name zone=servers:10m;

 server {
 limit_conn servers 1000;
 }
}

Hadkan kadar permintaan

Penghadan kadar. boleh digunakan untuk menghalang serangan ddos, cc, atau untuk menghalang pelayan huluan daripada diserang pada masa yang sama Dibanjiri dengan terlalu banyak permintaan. Kaedah ini adalah berdasarkan algoritma baldi bocor, di mana permintaan tiba di baldi pada pelbagai kadar dan meninggalkan baldi pada kadar tetap. Sebelum menggunakan pengehadan kadar, anda perlu mengkonfigurasi parameter global "baldi bocor":

  • kunci - parameter yang digunakan untuk membezakan satu pelanggan daripada yang lain, biasanya pembolehubah

  • zon memori kongsi - nama dan saiz zon yang memegang keadaan kunci ini (iaitu "baldi bocor")

  • kadar - nombor daripada permintaan sesaat ( Had kadar permintaan yang dinyatakan dalam r/s) atau permintaan seminit (r/m) ("penyaliran baldi bocor"). Permintaan seminit menentukan kadar kurang daripada satu permintaan sesaat.

Parameter ini ditetapkan menggunakan arahan limit_req_zone. Arahan ini ditakrifkan pada peringkat http {} - pendekatan ini membenarkan penggunaan kawasan yang berbeza dan meminta parameter limpahan pada konteks yang berbeza:

http {
 #...

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

Dengan konfigurasi ini, saiz 10m bait dengan nama satu akan dicipta Kawasan memori dikongsi . Kawasan ini memegang keadaan set alamat ip klien menggunakan pembolehubah $binary_remote_addr. Ambil perhatian bahawa $remote_addr juga mengandungi alamat IP pelanggan, manakala $binary_remote_addr memegang perwakilan binari yang lebih pendek bagi alamat IP.

Saiz optimum kawasan memori kongsi boleh dikira menggunakan data berikut: $binary_remote_addr Saiz nilai alamat ipv4 ialah 4 bait dan keadaan storan mengambil 128 bait pada platform 64-bit. Oleh itu, nyatakan maklumat untuk lebih kurang 16000 alamat IP mengambil 1m bait kawasan ini.

Jika storan kehabisan apabila nginx perlu menambah entri baharu, entri tertua akan dipadamkan. Jika ruang yang dikosongkan masih tidak mencukupi untuk menampung rekod baharu, nginx akan mengembalikan kod status perkhidmatan 503 yang tidak tersedia, yang boleh ditakrifkan semula menggunakan arahan limit_req_status.

Setelah zon ini ditetapkan, anda boleh mengehadkan kadar permintaan menggunakan arahan limit_req di mana-mana sahaja dalam konfigurasi nginx, khususnya pelayan {} , lokasi {} dan konteks http {}:

http {
 #...

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

 server {
 #...

 location /search/ {
  limit_req zone=one;
 }
 }
}

Menggunakan konfigurasi di atas, nginx akan memproses tidak lebih daripada 1 permintaan sesaat di bawah laluan /search/, dan cara untuk menangguhkan pemprosesan permintaan ini ialah jumlah kadar tidak lebih daripada kadar yang ditetapkan. nginx akan menangguhkan pemprosesan permintaan sedemikian sehingga "baldi" (baldi kongsi satu) penuh. Untuk permintaan kepada baldi penuh, nginx akan bertindak balas dengan ralat tidak tersedia perkhidmatan 503 (apabila limit_req_status tidak mempunyai kod status set tersuai).

Hadkan lebar jalur

Untuk mengehadkan lebar jalur bagi setiap sambungan, gunakan arahan limit_rate berikut:

location /download/ {
 limit_rate 50k;
}

Dengan tetapan ini, pelanggan Akan boleh memuat turun kandungan pada kelajuan sehingga 50k/s dalam satu sambungan. Walau bagaimanapun, pelanggan boleh membuka berbilang sambungan untuk memintas had ini. Oleh itu, jika matlamatnya adalah untuk menghalang kelajuan muat turun lebih besar daripada nilai yang ditentukan, bilangan sambungan harus dihadkan juga. Contohnya, satu sambungan bagi setiap alamat ip (jika menggunakan kawasan memori kongsi yang dinyatakan di atas):

location /download/ {
 limit_conn addr 1;
 limit_rate 50k;
}

Untuk mengenakan had hanya selepas klien memuat turun jumlah data tertentu, gunakan arahan limit_rate_after. Mungkin munasabah untuk membenarkan pelanggan memuat turun jumlah data tertentu dengan cepat (cth. pengepala fail - indeks filem) dan mengehadkan kadar di mana data lain dimuat turun (membuat pengguna menonton filem dan bukannya memuat turun).

limit_rate_after 500k;
limit_rate 20k;

Contoh berikut menunjukkan konfigurasi gabungan untuk mengehadkan bilangan sambungan dan lebar jalur. Bilangan maksimum sambungan yang dibenarkan ditetapkan kepada 5 sambungan bagi setiap alamat pelanggan, yang berfungsi untuk kebanyakan kes biasa kerana penyemak imbas moden biasanya mempunyai maksimum 3 sambungan terbuka pada satu masa. Pada masa yang sama, lokasi yang disediakan untuk muat turun hanya membenarkan satu sambungan:

http {
 limit_conn_zone $binary_remote_address zone=addr:10m

 server {
 root /www/data;
 limit_conn addr 5;

 location / {
 }

 location /download/ {
  limit_conn addr 1;
  limit_rate_after 1m;
  limit_rate 50k;
 }
 }
}

Atas ialah kandungan terperinci Bagaimana Nginx mengehadkan permintaan sumber http. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam