Cara Mengehadkan Bilangan Sambungan (Permintaan) Di Nginx

Cara Mengehadkan Bilangan Sambungan (Permintaan) Di Nginx

Nginx Kapal dengan pelbagai modul untuk membolehkan pengguna mengawal lalu lintas ke laman web mereka, aplikasi web, serta sumber web lain. Salah satu sebab utama untuk mengehadkan lalu lintas atau akses adalah untuk mencegah penyalahgunaan atau serangan jenis tertentu seperti Dos (Penafian perkhidmatan) serangan.

Terdapat tiga cara utama untuk mengehadkan penggunaan atau lalu lintas di Nginx:

  1. Mengehadkan bilangan sambungan (permintaan).
  2. Mengehadkan kadar permintaan.
  3. Mengehadkan jalur lebar.

Di atas Nginx Pendekatan pengurusan lalu lintas, bergantung pada kes penggunaan boleh dikonfigurasikan untuk mengehadkan berdasarkan kunci yang ditetapkan, yang paling biasa adalah alamat IP klien. Nginx juga menyokong pembolehubah lain seperti cookie sesi dan banyak lagi.

Di bahagian pertama siri tiga bahagian kami, kami akan membincangkan cara mengehadkan bilangan sambungan Nginx untuk melindungi laman web/aplikasi anda.

  • Cara Mengehadkan Bilangan Sambungan (Permintaan) Di Nginx - Bahagian 1
  • Cara Mengehadkan Kadar Sambungan (Permintaan) Di Nginx - Bahagian 2
  • Cara Mengehadkan Penggunaan Bandwidth Di Nginx - Bahagian 3

Perlu diingat bahawa Nginx akan mempertimbangkan sambungan untuk mengehadkan hanya jika ia mempunyai permintaan yang diproses oleh pelayan dan keseluruhan tajuk permintaan telah dibaca. Oleh itu, tidak semua sambungan pelanggan dikira.

Mengehadkan bilangan sambungan dalam nginx

Pertama, anda perlu menentukan zon memori bersama yang menyimpan metrik sambungan untuk pelbagai kunci, menggunakan had_conn_zone arahan. Seperti yang dinyatakan sebelum ini, kunci boleh menjadi teks, pemboleh ubah seperti alamat IP jauh pelanggan, atau gabungan kedua -dua.

Arahan ini yang sah dalam konteks HTTP mengambil dua parameter: kunci dan juga Kawasan (dalam format zon_name: saiz).

limit_conn_zone $ binary_remote_addr zon = limitconnbyaddr: 20m; 

Untuk menetapkan kod status tindak balas yang dikembalikan kepada permintaan yang ditolak, gunakan had_conn_status Arahan yang mengambil kod status HTTP sebagai parameter. Ia sah dalam konteks HTTP, pelayan, dan lokasi.

had_conn_status 429; 

Untuk menghadkan sambungan, gunakan limint_conn Arahan untuk menetapkan zon memori untuk digunakan dan bilangan maksimum sambungan yang dibenarkan seperti yang ditunjukkan dalam coretan konfigurasi berikut. Arahan ini sah dalam konteks HTTP, pelayan, dan lokasi.

had_conn limitconnbyaddr 50; 

Inilah konfigurasi lengkap:

Hulu API_Service Server 127.0.0.1: 9051; pelayan 10.1.1.77: 9052;  limit_conn_zone $ binary_remote_addr zon = limitconnbyaddr: 20m; had_conn_status 429; pelayan mendengar 80; Server_name testapp.Tecmint.com; root/var/www/html/testapp.Tecmint.com/membina; Indeks indeks.html; had_conn limitconnbyaddr 50; #termasuk coretan/error_pages.Con; proxy_read_timeout 600; proxy_connect_timeout 600; proxy_send_timeout 600; lokasi / try_files $ uri $ uri / / indeks.html = 404 = 403 = 500;  lokasi/api proxy_pass http: // api_service; proxy_set_header x-real-ip $ remote_addr; Proxy_Set_Header Host $ host; proxy_set_header x-forward-for $ proxy_add_x_forwarded_for; proxy_http_version 1.1; proxy_set_header menaik taraf $ http_upgrade; proxy_set_header sambungan "menaik taraf";  
Hadkan sambungan Nginx

Simpan fail dan tutupnya.

Kemudian periksa sama ada Nginx Konfigurasi baik -baik saja dengan menjalankan arahan berikut:

$ sudo nginx -t 

Seterusnya, muat semula Nginx perkhidmatan untuk melaksanakan perubahan baru -baru ini:

$ sudo Systemctl Reload nginx 

Memeriksa Had Sambungan Nginx

Apabila pelanggan melebihi bilangan maksimum sambungan yang dibenarkan, Nginx Mengembalikan "429 terlalu banyak permintaan"Ralat kepada pelanggan dan mendaftarkan entri seperti yang di bawah dalam fail log ralat:

2022/03/15 00:14:00 [ERROR] 597443#0: *127 Mengehadkan Sambungan oleh Zon "LimitConnbyaddr", Pelanggan: x.x.x.x, pelayan: testapp.Tecmimt.com, permintaan: "Dapatkan/statik/css/utama.63fdefff.bahagian.CSS.peta http/1.1 ", tuan rumah:" testapp.Tecmimt.com " 
Ralat had sambungan nginx

Mengehadkan bilangan sambungan nginx ke aplikasi

Anda juga boleh mengehadkan bilangan sambungan untuk pelayan yang diberikan adalah dengan menggunakan $ server_name berubah -ubah:

Hulu API_Service Server 127.0.0.1: 9051; pelayan 10.1.1.77: 9052;  limit_conn_zone $ server_name zon = limitbyservers: 10m; had_conn_status 429; pelayan mendengar 80; Server_name testapp.Tecmint.com; root/var/www/html/testapp.Tecmint.com/membina; Indeks indeks.html; Limit_conn Limitbyservers 2000; #termasuk coretan/error_pages.Con; proxy_read_timeout 600; proxy_connect_timeout 600; proxy_send_timeout 600; lokasi / try_files $ uri $ uri / / indeks.html = 404 = 403 = 500;  lokasi/api proxy_pass http: // api_service; proxy_set_header x-real-ip $ remote_addr; Proxy_Set_Header Host $ host; proxy_set_header x-forward-for $ proxy_add_x_forwarded_for; proxy_http_version 1.1; proxy_set_header menaik taraf $ http_upgrade; proxy_set_header sambungan "menaik taraf";  

Konfigurasi ini membolehkan Nginx Untuk mengehadkan jumlah sambungan ke pelayan maya yang menggerakkan aplikasi testapp.Tecmint.com, ke 2000 sambungan.

Catatan: Mengehadkan sambungan berdasarkan IP pelanggan mempunyai kelemahan. Anda mungkin akan menyekat sambungan untuk lebih daripada sekadar satu pengguna, terutamanya jika banyak pengguna mengakses aplikasi anda berada di rangkaian yang sama dan beroperasi di belakang a Nat - Semua sambungan mereka akan berasal dari alamat IP yang sama.

Dalam senario sedemikian, anda boleh menggunakan satu atau lebih pembolehubah yang terdapat di nginx yang dapat mengenal pasti pelanggan di peringkat aplikasi, contohnya adalah Cookie sesi.

Anda juga mungkin menyukai artikel berkaitan Nginx berikut:

  • Cara membuat halaman ralat 404 tersuai di nginx
  • Cara Mengawal Akses Berdasarkan Alamat IP Klien di Nginx
  • Cara Cache Kandungan di Nginx
  • Cara mengaktifkan http/2.0 dalam nginx
  • Cara Menggunakan Nginx Sebagai Pengimbang Beban HTTP di Linux

Itu sahaja buat masa ini! Di bahagian seterusnya siri ini, kami akan membincangkan satu lagi teknik pengurusan lalu lintas yang berguna di Nginx - Mengehadkan kadar permintaan. Sehingga itu, tinggal bersama kami.