Cara Membatasi Tingkat Koneksi (Permintaan) di Nginx

Cara Membatasi Tingkat Koneksi (Permintaan) di Nginx

Dalam artikel terakhir kami yang merupakan bagian dari seri manajemen lalu lintas NGINX kami, kami membahas cara membatasi jumlah koneksi di NGINX. Dalam panduan ini, kita akan melihat cara membatasi tingkat permintaan Nginx.

Pembatasan tingkat adalah teknik manajemen lalu lintas yang digunakan untuk membatasi jumlah Http Meminta yang dapat dilakukan klien dalam periode waktu tertentu - batas tingkat dihitung dalam Permintaan per detik (atau RPS).

Contoh permintaan adalah a MENDAPATKAN meminta halaman masuk aplikasi atau a POS meminta pada formulir masuk atau a POS pada API titik akhir.

Ada banyak alasan untuk membatasi tingkat permintaan ke aplikasi web Anda atau layanan API, satu adalah keamanan: melindungi terhadap permintaan cepat yang kasar.

Membatasi laju koneksi di nginx

Mulailah dengan mendefinisikan parameter untuk membatasi tingkat menggunakan Limit_req_zone pengarahan. Parameter yang diperlukan adalah kunci untuk mengidentifikasi klien, zona memori bersama yang akan menyimpan status kunci dan seberapa sering ia mengakses URL yang dibatasi permintaan, dan tarifnya.

Itu Limit_req_zone Petunjuk valid dalam konteks HTTP.

limit_req_zone $ Binary_remote_addr zona = limitreqsbyaddr: tarif 20m = 10r/s; 

Juga, tetapkan kode status respons yang dikembalikan ke permintaan yang ditolak, menggunakan Limit_req_status Petunjuk mana yang valid dalam konteks HTTP, Sever, dan Lokasi.

Limit_req_status 429; 

Sekarang Anda dapat menggunakan limint_conn Petunjuk untuk mengaktifkan pembatasan tingkat permintaan dalam konteks HTTP, Sever, dan Lokasi. Dibutuhkan zona memori sebagai parameter dan parameter opsional lainnya.

limit_req zona = limitreqsbyaddr; 

Contoh konfigurasi berikut menunjukkan membatasi tingkat permintaan ke API aplikasi web. Ukuran memori bersama adalah 20 MB dan batas tingkat permintaan adalah 10 permintaan per detik.

Hulu API_Service Server 127.0.0.1: 9051; Server 10.1.1.77: 9052;  limit_req_zone $ Binary_remote_addr zona = limitreqsbyaddr: tarif 20m = 10r/s; Limit_req_status 429; server dengarkan 80; server_name testApp.tecmint.com; root/var/www/html/testapp.tecmint.com/build; Indeks Indeks.html; #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  limit_req zona = limitreqsbyaddr; 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";  

Simpan file konfigurasi Anda dan tutup.

Kemudian periksa apakah Nginx Sintaks konfigurasi benar menggunakan perintah berikut:

$ sudo nginx -t 

Setelah itu, muat ulang Nginx Layanan Menerapkan perubahan terbaru:

$ sudo systemctl Reload nginx 

Setelah batas tarif 10 Permintaan per detik terlampaui oleh klien tunggal yang mengakses /API/, Nginx mengembalikan A "429 terlalu banyak permintaan"Kesalahan untuk klien.

Nginx 429 Terlalu Banyak Kesalahan Permintaan

Itu juga mencatat insiden di log kesalahan.

2022/04/29 00:30:38 [Kesalahan] 3145846#0: *131039 Permintaan yang membatasi, kelebihan: 0.990 oleh zona "limitreqsbyaddr", klien: 192.168.1.10, Server: TestApp.tecmint.com, permintaan: "Dapatkan/API/V1/APP/META-DATA HTTP/1.1 ", host:" testApp.tecmint.com ", rujukan:" https: // testapp.tecmint.com/" 
Log kesalahan nginx

Terkadang tergantung pada sifat aplikasi atau API Anda, klien perlu membuat banyak permintaan sekaligus, dan kemudian mengurangi tarifnya untuk jangka waktu tertentu sebelum membuat lebih banyak. Nginx juga dapat buffer kelebihan permintaan dalam antrian dan memprosesnya segera.

Anda dapat mengaktifkan perilaku ini dalam membatasi tingkat menggunakan meletus parameter dengan limit_req pengarahan. Untuk mengaktifkan antrian tanpa penundaan, tambahkan Tidak ada penundaan parameter.

limit_req zone = limitreqsbyaddr burst = 20 nodelay; 

Ada hambatan dengan batasan tarif berdasarkan IP klien, terutama untuk pengguna yang mengakses aplikasi Anda dari jaringan yang sama dan beroperasi di belakang NAT. Dalam hal ini, semua permintaan mereka akan berasal dari alamat IP yang sama. Dalam skenario seperti itu, Anda dapat menggunakan variabel lain untuk mengidentifikasi klien seperti cookie sesi.

Untuk informasi lebih lanjut tentang membatasi tingkat permintaan, lihat laju NGINX yang membatasi di situs web NGINX. Selanjutnya, kami akan membahas cara membatasi penggunaan bandwidth Nginx.