Cara Membatasi Jumlah Koneksi (Permintaan) di Nginx

Cara Membatasi Jumlah Koneksi (Permintaan) di Nginx

Nginx Kapal dengan berbagai modul untuk memungkinkan pengguna mengontrol lalu lintas ke situs web mereka, aplikasi web, serta sumber daya web lainnya. Salah satu alasan utama untuk membatasi lalu lintas atau akses adalah untuk mencegah penyalahgunaan atau serangan dari jenis tertentu seperti Dos (Kegagalan layanan) Serangan.

Ada tiga cara utama untuk membatasi penggunaan atau lalu lintas Nginx:

  1. Membatasi jumlah koneksi (permintaan).
  2. Membatasi tingkat permintaan.
  3. Membatasi bandwidth.

Di atas Nginx Pendekatan manajemen lalu lintas, tergantung pada kasus penggunaan dapat dikonfigurasi hingga membatasi berdasarkan kunci yang ditentukan, yang paling umum adalah alamat IP klien. Nginx juga mendukung variabel lain seperti cookie sesi dan banyak lagi.

Pada bagian pertama dari seri tiga bagian kami, kami akan membahas cara membatasi jumlah koneksi masuk Nginx untuk melindungi situs web/aplikasi Anda.

  • Cara membatasi jumlah koneksi (permintaan) di nginx - bagian 1
  • Cara membatasi tingkat koneksi (permintaan) di nginx - bagian 2
  • Cara membatasi penggunaan bandwidth di nginx - bagian 3

Ingatlah itu Nginx akan mempertimbangkan koneksi untuk membatasi hanya jika memiliki permintaan yang diproses oleh server dan seluruh header permintaan telah dibaca. Oleh karena itu, tidak semua koneksi klien dihitung.

Membatasi jumlah koneksi di nginx

Pertama, Anda perlu mendefinisikan zona memori bersama yang menyimpan metrik koneksi untuk berbagai tombol, menggunakan Limit_conn_zone pengarahan. Seperti disebutkan sebelumnya, kunci dapat berupa teks, variabel seperti alamat IP jarak jauh klien, atau kombinasi keduanya.

Petunjuk ini yang valid dalam konteks HTTP mengambil dua parameter: kunci dan daerah (dalam format zona_name: ukuran).

limit_conn_zone $ Binary_remote_addr zona = LimitConnByAddr: 20m; 

Untuk menetapkan kode status respons yang dikembalikan ke permintaan yang ditolak, gunakan Limit_conn_status Petunjuk yang mengambil kode status HTTP sebagai parameter. Itu valid dalam konteks HTTP, server, dan lokasi.

Limit_conn_status 429; 

Untuk membatasi koneksi, gunakan limint_conn Petunjuk untuk mengatur zona memori yang akan digunakan dan jumlah maksimum koneksi yang diizinkan seperti yang ditunjukkan pada cuplikan konfigurasi berikut. Petunjuk ini valid dalam konteks HTTP, server, dan lokasi.

Limit_Conn LimitConnbyAddr 50; 

Ini konfigurasi lengkapnya:

Hulu API_Service Server 127.0.0.1: 9051; Server 10.1.1.77: 9052;  limit_conn_zone $ Binary_remote_addr zona = LimitConnByAddr: 20m; Limit_conn_status 429; server dengarkan 80; server_name testApp.tecmint.com; root/var/www/html/testapp.tecmint.com/build; Indeks Indeks.html; Limit_Conn LimitConnbyAddr 50; #include snippets/error_pages.conf; proxy_read_timeout 600; proxy_connect_timeout 600; proxy_send_timeout 600; Lokasi / TRY_FILES $ URI $ URI / / INDEX.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-forwarded-for $ proxy_add_x_forwarded_for; proxy_http_version 1.1; proxy_set_header upgrade $ http_upgrade; proxy_set_header koneksi "upgrade";  
Batasi koneksi nginx

Simpan file dan tutup.

Kemudian periksa apakah Nginx Konfigurasi baik -baik saja dengan menjalankan perintah berikut:

$ sudo nginx -t 

Selanjutnya, muat ulang Nginx Layanan untuk mempengaruhi perubahan terbaru:

$ sudo systemctl Reload nginx 

Memeriksa Batas Koneksi Nginx

Saat klien melebihi jumlah maksimum koneksi yang diizinkan, Nginx mengembalikan A “429 terlalu banyak permintaan"Kesalahan untuk klien dan mendaftarkan entri seperti yang di bawah ini di file log kesalahan:

2022/03/15 00:14:00 [Kesalahan] 597443#0: *127 membatasi koneksi dengan zona "limitconnbyaddr", klien: x.X.X.x, server: testapp.Tecmimt.com, permintaan: "Dapatkan/statis/css/utama.63fdefff.bingkah.CSS.Peta http/1.1 ", host:" testApp.Tecmimt.com " 
Kesalahan batas koneksi nginx

Membatasi jumlah koneksi Nginx ke aplikasi

Anda juga dapat membatasi jumlah koneksi untuk server yang diberikan adalah dengan menggunakan $ server_name variabel:

Hulu API_Service Server 127.0.0.1: 9051; Server 10.1.1.77: 9052;  limit_conn_zone $ server_name zona = limitbyservers: 10m; Limit_conn_status 429; server dengarkan 80; server_name testApp.tecmint.com; root/var/www/html/testapp.tecmint.com/build; Indeks Indeks.html; Limit_conn LimitByServers 2000; #include snippets/error_pages.conf; proxy_read_timeout 600; proxy_connect_timeout 600; proxy_send_timeout 600; Lokasi / TRY_FILES $ URI $ URI / / INDEX.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-forwarded-for $ proxy_add_x_forwarded_for; proxy_http_version 1.1; proxy_set_header upgrade $ http_upgrade; proxy_set_header koneksi "upgrade";  

Konfigurasi ini memungkinkan Nginx Untuk membatasi jumlah total koneksi ke server virtual yang memberi daya pada aplikasi TestApp.tecmint.com, ke 2000 koneksi.

Catatan: Membatasi koneksi berdasarkan IP klien memiliki kelemahan. Anda mungkin akhirnya membatasi koneksi untuk lebih dari satu pengguna, terutama jika banyak pengguna yang mengakses aplikasi Anda berada di jaringan yang sama dan beroperasi di belakang a Nat - Semua koneksi mereka akan berasal dari alamat IP yang sama.

Dalam skenario seperti itu, Anda dapat menggunakan satu atau lebih variabel yang tersedia di nginx yang dapat mengidentifikasi klien di tingkat aplikasi, contohnya adalah a Cookie Sesi.

Anda mungkin juga menyukai artikel terkait Nginx berikut:

  • Cara Membuat Halaman Kesalahan 404 Kustom di Nginx
  • Cara mengontrol akses berdasarkan alamat IP klien di nginx
  • Cara mensembakan konten di nginx
  • Cara mengaktifkan http/2.0 di nginx
  • Cara menggunakan nginx sebagai penyeimbang beban http di linux

Itu saja untuk saat ini! Di bagian selanjutnya dari seri ini, kami akan membahas teknik manajemen lalu lintas yang berguna lainnya di Nginx - membatasi tingkat permintaan. Sampai saat itu, tetaplah bersama kami.