NGINX-ൽ കണക്ഷനുകളുടെ നിരക്ക് (അഭ്യർത്ഥനകൾ) എങ്ങനെ പരിമിതപ്പെടുത്താം


ഞങ്ങളുടെ NGINX ട്രാഫിക് മാനേജ്uമെന്റ് സീരീസിന്റെ ഭാഗമായ ഞങ്ങളുടെ അവസാന ലേഖനത്തിൽ, NGINX-ലെ കണക്ഷനുകളുടെ എണ്ണം എങ്ങനെ പരിമിതപ്പെടുത്താമെന്ന് ഞങ്ങൾ ചർച്ച ചെയ്തു. ഈ ഗൈഡിൽ, NGINX-ലെ അഭ്യർത്ഥനകളുടെ നിരക്ക് എങ്ങനെ പരിമിതപ്പെടുത്താമെന്ന് ഞങ്ങൾ നോക്കും.

ഒരു നിശ്ചിത കാലയളവിൽ ഒരു ക്ലയന്റിന് നടത്താനാകുന്ന HTTP അഭ്യർത്ഥനകളുടെ എണ്ണം നിയന്ത്രിക്കാൻ ഉപയോഗിക്കുന്ന ഒരു ട്രാഫിക് മാനേജ്മെന്റ് സാങ്കേതികതയാണ് നിരക്ക് പരിമിതപ്പെടുത്തൽ - നിരക്ക് പരിധികൾ സെക്കൻഡ് പെർ അഭ്യർത്ഥനകളിൽ (അല്ലെങ്കിൽ RPS) കണക്കാക്കുന്നു.

ഒരു അപേക്ഷയുടെ ലോഗിൻ പേജിനായുള്ള GET അഭ്യർത്ഥന അല്ലെങ്കിൽ ഒരു ലോഗിൻ ഫോമിലെ ഒരു POST അഭ്യർത്ഥന അല്ലെങ്കിൽ ഒരു API എൻഡ് പോയിന്റിലെ ഒരു POST എന്നിവ ഒരു അഭ്യർത്ഥനയുടെ ഉദാഹരണമാണ്.

നിങ്ങളുടെ വെബ് ആപ്ലിക്കേഷനുകളിലേക്കോ API സേവനങ്ങളിലേക്കോ അഭ്യർത്ഥനകളുടെ നിരക്ക് പരിമിതപ്പെടുത്തുന്നതിന് നിരവധി കാരണങ്ങളുണ്ട്, ഒന്ന് സുരക്ഷയാണ്: ദുരുപയോഗം ചെയ്യുന്ന ദ്രുത അഭ്യർത്ഥനകളിൽ നിന്ന് പരിരക്ഷിക്കുക.

NGINX-ലെ കണക്ഷനുകളുടെ പരിമിത നിരക്ക്

limit_req_zone നിർദ്ദേശം ഉപയോഗിച്ച് നിരക്ക് പരിമിതപ്പെടുത്തുന്നതിനുള്ള പാരാമീറ്ററുകൾ നിർവചിച്ചുകൊണ്ട് ആരംഭിക്കുക. ക്ലയന്റുകളെ തിരിച്ചറിയുന്നതിനുള്ള ഒരു കീയാണ് ആവശ്യമായ പാരാമീറ്ററുകൾ, കീയുടെ അവസ്ഥയും അത് എത്ര തവണ അഭ്യർത്ഥന-നിയന്ത്രിത URL ആക്uസസ് ചെയ്uതു എന്നതും നിരക്കും സംഭരിക്കുന്ന പങ്കിട്ട മെമ്മറി സോൺ ആണ്.

limit_req_zone നിർദ്ദേശം HTTP സന്ദർഭത്തിൽ സാധുവാണ്.

limit_req_zone $binary_remote_addr zone=limitreqsbyaddr:20m rate=10r/s;

കൂടാതെ, HTTP, സെവർ, ലൊക്കേഷൻ സന്ദർഭങ്ങൾ എന്നിവയിൽ സാധുതയുള്ള limit_req_status നിർദ്ദേശം ഉപയോഗിച്ച് നിരസിച്ച അഭ്യർത്ഥനകൾക്ക് തിരികെ നൽകുന്ന ഒരു പ്രതികരണ സ്റ്റാറ്റസ് കോഡ് സജ്ജമാക്കുക.

limit_req_status 429;

HTTP, സെവർ, ലൊക്കേഷൻ സന്ദർഭങ്ങൾ എന്നിവയ്ക്കുള്ളിൽ അഭ്യർത്ഥന നിരക്ക്-പരിമിതപ്പെടുത്തൽ പ്രവർത്തനക്ഷമമാക്കാൻ ഇപ്പോൾ നിങ്ങൾക്ക് limint_conn നിർദ്ദേശം ഉപയോഗിക്കാം. ഇത് ഒരു മെമ്മറി സോൺ ഒരു പാരാമീറ്ററായും മറ്റ് ഓപ്ഷണൽ പാരാമീറ്ററുകളായും എടുക്കുന്നു.

limit_req zone=limitreqsbyaddr;

ഇനിപ്പറയുന്ന കോൺഫിഗറേഷൻ ഉദാഹരണം ഒരു വെബ് ആപ്ലിക്കേഷൻ API-യിലേക്കുള്ള അഭ്യർത്ഥന നിരക്ക് പരിമിതപ്പെടുത്തുന്നു. പങ്കിട്ട മെമ്മറി വലുപ്പം 20 MB ആണ്, അഭ്യർത്ഥന നിരക്ക് പരിധി സെക്കൻഡിൽ 10 അഭ്യർത്ഥനകളാണ്.

upstream api_service {
    server 127.0.0.1:9051;
    server 10.1.1.77:9052;
}
limit_req_zone $binary_remote_addr zone=limitreqsbyaddr:20m rate=10r/s;
limit_req_status 429;

server {
    listen 80;
    server_name testapp.linux-console.net;
    root /var/www/html/testapp.linux-console.net/build;
    index index.html;

    #include snippets/error_pages.conf;
    proxy_read_timeout 600;
    proxy_connect_timeout 600;
    proxy_send_timeout 600;
    location / {
        try_files $uri $uri/ /index.html =404 =403 =500;
    }
    location /api {
        limit_req zone=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 Connection "upgrade";

       
   }
}

നിങ്ങളുടെ കോൺഫിഗറേഷൻ ഫയൽ സംരക്ഷിച്ച് അത് അടയ്ക്കുക.

ഇനിപ്പറയുന്ന കമാൻഡ് ഉപയോഗിച്ച് NGINX കോൺഫിഗറേഷൻ വാക്യഘടന ശരിയാണോ എന്ന് പരിശോധിക്കുക:

$ sudo nginx -t

അതിനുശേഷം, NGINX സേവനം വീണ്ടും ലോഡുചെയ്യുക, ഏറ്റവും പുതിയ മാറ്റങ്ങൾ പ്രയോഗിക്കുക:

$ sudo systemctl reload nginx

/api/ ആക്uസസ് ചെയ്യുന്ന ഒരൊറ്റ ക്ലയന്റ് സെക്കൻഡിൽ 10 അഭ്യർത്ഥനകളുടെ നിരക്ക് പരിധി കവിഞ്ഞാൽ, NGINX ക്ലയന്റിന് \429 വളരെയധികം അഭ്യർത്ഥനകൾ പിശക് നൽകുന്നു.

ഇത് പിശക് ലോഗിൽ സംഭവം രേഖപ്പെടുത്തുകയും ചെയ്യുന്നു.

2022/04/29 00:30:38 [error] 3145846#0: *131039 limiting requests, excess: 0.990 by zone "limitreqsbyaddr", client: 192.168.1.10, server: testapp.linux-console.net, request: "GET /api/v1/app/meta-data HTTP/1.1", host: "testapp.linux-console.net", referrer: "https://testapp.linux-console.net/"

ചിലപ്പോൾ നിങ്ങളുടെ ആപ്ലിക്കേഷന്റെയോ API യുടെയോ സ്വഭാവമനുസരിച്ച്, ഒരു ക്ലയന്റ് ഒരേസമയം നിരവധി അഭ്യർത്ഥനകൾ നടത്തേണ്ടതുണ്ട്, തുടർന്ന് കൂടുതൽ ഉണ്ടാക്കുന്നതിന് മുമ്പ് അതിന്റെ നിരക്ക് കുറച്ച് സമയത്തേക്ക് കുറയ്ക്കുക. NGINX-ന് ഏതെങ്കിലും അധിക അഭ്യർത്ഥനകൾ ഒരു ക്യൂവിൽ ബഫർ ചെയ്യാനും അവ ഉടനടി പ്രോസസ്സ് ചെയ്യാനും കഴിയും.

limit_req നിർദ്ദേശം ഉപയോഗിച്ച് നിങ്ങൾക്ക് burst പാരാമീറ്റർ ഉപയോഗിച്ച് നിരക്ക്-പരിമിതപ്പെടുത്തലിൽ ഈ സ്വഭാവം പ്രവർത്തനക്ഷമമാക്കാം. കാലതാമസമില്ലാതെ ക്യൂയിംഗ് പ്രവർത്തനക്ഷമമാക്കാൻ, nodelay പാരാമീറ്റർ ചേർക്കുക.

limit_req zone=limitreqsbyaddr burst=20 nodelay;

ഒരു ക്ലയന്റിന്റെ IP അടിസ്ഥാനമാക്കിയുള്ള നിരക്ക് പരിമിതപ്പെടുത്തൽ ഒരു സ്നാഗ് ഉണ്ട്, പ്രത്യേകിച്ചും ഒരേ നെറ്റ്uവർക്കിൽ നിന്ന് നിങ്ങളുടെ ആപ്ലിക്കേഷൻ ആക്uസസ് ചെയ്യുന്നതും NAT-ന് പിന്നിൽ പ്രവർത്തിക്കുന്നതുമായ ഉപയോക്താക്കൾക്ക്. ഈ സാഹചര്യത്തിൽ, അവരുടെ എല്ലാ അഭ്യർത്ഥനകളും ഒരേ ഐപി വിലാസത്തിൽ നിന്നാണ് ഉത്ഭവിക്കുന്നത്. അത്തരമൊരു സാഹചര്യത്തിൽ, ഒരു സെഷൻ കുക്കി പോലുള്ള ക്ലയന്റുകളെ തിരിച്ചറിയാൻ നിങ്ങൾക്ക് മറ്റ് വേരിയബിളുകൾ ഉപയോഗിക്കാം.

അഭ്യർത്ഥനകളുടെ നിരക്ക് പരിമിതപ്പെടുത്തുന്നതിനെക്കുറിച്ചുള്ള കൂടുതൽ വിവരങ്ങൾക്ക്, NGINX വെബ്സൈറ്റിൽ ഈ NGINX നിരക്ക് പരിമിതപ്പെടുത്തൽ പരിശോധിക്കുക. അടുത്തതായി, NGINX-ൽ ബാൻഡ്uവിഡ്ത്ത് ഉപയോഗം എങ്ങനെ പരിമിതപ്പെടുത്താം എന്ന് ഞങ്ങൾ കവർ ചെയ്യും.