Cara mengehadkan kadar sambungan (permintaan) dalam nginx

Cara mengehadkan kadar sambungan (permintaan) dalam nginx

Dalam artikel terakhir kami yang merupakan sebahagian daripada Siri Pengurusan Lalu Lintas Nginx kami, kami membincangkan cara mengehadkan bilangan sambungan di nginx. Dalam panduan ini, kita akan melihat cara mengehadkan kadar permintaan di Nginx.

Pengaturan kadar adalah teknik pengurusan lalu lintas yang digunakan untuk menyekat bilangan Http meminta pelanggan boleh membuat dalam tempoh masa tertentu - had kadar dikira dalam Permintaan sesaat (atau RPS).

Contoh permintaan adalah Dapatkan Permintaan untuk halaman log masuk permohonan atau a Jawatan minta borang log masuk atau a Jawatan pada API titik akhir.

Terdapat banyak sebab untuk mengehadkan kadar permintaan ke aplikasi web atau perkhidmatan API anda, yang menjadi keselamatan: melindungi daripada permintaan pesat yang kasar.

Mengehadkan kadar sambungan dalam nginx

Mulakan dengan menentukan parameter untuk mengehadkan kadar menggunakan had_req_zone arahan. Parameter yang diperlukan adalah kunci untuk mengenal pasti pelanggan, zon memori bersama yang akan menyimpan keadaan kunci dan berapa kerap ia telah mengakses url permintaan yang terhad, dan kadarnya.

The had_req_zone Arahan sah dalam konteks HTTP.

had_REQ_ZONE $ BINARY_REMOTE_ADDR ZONE = LIMITEREQSBYADDR: 20M kadar = 10R/s; 

Juga, tetapkan kod status tindak balas yang dikembalikan kepada permintaan yang ditolak, menggunakan had_req_status Arahan yang sah dalam konteks HTTP, Sever, dan lokasi.

had_req_status 429; 

Sekarang anda boleh menggunakan limint_conn Arahan untuk membolehkan pengendalian kadar permintaan dalam konteks HTTP, Sever, dan lokasi. Ia memerlukan zon memori sebagai parameter dan parameter pilihan lain.

limit_req zon = limitreqsbyaddr; 

Contoh konfigurasi berikut menunjukkan mengehadkan kadar permintaan ke API Aplikasi Web. Saiz memori bersama ialah 20 mb dan had kadar permintaan ialah 10 permintaan sesaat.

Hulu API_Service Server 127.0.0.1: 9051; pelayan 10.1.1.77: 9052;  had_REQ_ZONE $ BINARY_REMOTE_ADDR ZONE = LIMITEREQSBYADDR: 20M kadar = 10R/s; had_req_status 429; pelayan mendengar 80; Server_name testapp.Tecmint.com; root/var/www/html/testapp.Tecmint.com/membina; Indeks indeks.html; #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  limit_req zon = limitreqsbyaddr; 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";  

Simpan fail konfigurasi anda dan tutupnya.

Kemudian periksa sama ada Nginx Sintaks konfigurasi betul menggunakan arahan berikut:

$ sudo nginx -t 

Selepas itu, muat semula Nginx Perkhidmatan Memohon perubahan terkini:

$ sudo Systemctl Reload nginx 

Setelah had kadar 10 Permintaan sesaat dilampaui oleh akses pelanggan tunggal /API/, Nginx mengembalikan "429 terlalu banyak permintaan"Ralat kepada pelanggan.

Nginx 429 Terlalu Banyak Ralat Permintaan

Ia juga log kejadian dalam log ralat.

2022/04/29 00:30:38 [ERROR] 3145846#0: *131039 Permintaan Mengehadkan, Lebihan: 0.990 oleh Zon "Limitreqsbyaddr", Pelanggan: 192.168.1.10, Pelayan: Testapp.Tecmint.com, permintaan: "Dapatkan/API/V1/App/Meta-Data HTTP/1.1 ", tuan rumah:" testapp.Tecmint.com ", referrer:" https: // testapp.Tecmint.com/" 
Log ralat Nginx

Kadang -kadang bergantung pada sifat permohonan atau API anda, pelanggan perlu membuat banyak permintaan sekaligus, dan kemudian mengurangkan kadarnya untuk jangka waktu sebelum membuat lebih banyak. Nginx juga boleh menimbulkan permintaan berlebihan dalam barisan dan memprosesnya dengan segera.

Anda boleh membolehkan tingkah laku ini dalam pembatasan kadar menggunakan pecah parameter dengan had_req arahan. Untuk membolehkan beratur tanpa kelewatan, tambahkan tanpa kelewatan parameter.

limit_req zon = limitreqsbyaddr burst = 20 nodelay; 

Terdapat snag dengan mengehadkan kadar berdasarkan IP pelanggan, terutamanya untuk pengguna mengakses aplikasi anda dari rangkaian yang sama dan beroperasi di belakang NAT. Dalam kes ini, semua permintaan mereka akan berasal dari alamat IP yang sama. Dalam senario sedemikian, anda boleh menggunakan pembolehubah lain untuk mengenal pasti pelanggan seperti cookie sesi.

Untuk maklumat lanjut mengenai mengehadkan kadar permintaan, lihat kadar nginx ini mengehadkan di laman web nginx. Seterusnya, kami akan merangkumi cara mengehadkan penggunaan jalur lebar di Nginx.