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


ഉപയോക്താക്കളെ അവരുടെ വെബ്uസൈറ്റുകൾ, വെബ് ആപ്ലിക്കേഷനുകൾ, മറ്റ് വെബ് ഉറവിടങ്ങൾ എന്നിവയിലേക്കുള്ള ട്രാഫിക് നിയന്ത്രിക്കാൻ അനുവദിക്കുന്നതിന് വിവിധ മൊഡ്യൂളുകളുള്ള NGINX ഷിപ്പ് ചെയ്യുന്നു. ട്രാഫിക് അല്ലെങ്കിൽ ആക്സസ് പരിമിതപ്പെടുത്തുന്നതിനുള്ള പ്രധാന കാരണങ്ങളിലൊന്ന്, DoS (സേവനം നിഷേധിക്കൽ) ആക്രമണങ്ങൾ പോലുള്ള ചില തരത്തിലുള്ള ദുരുപയോഗങ്ങൾ അല്ലെങ്കിൽ ആക്രമണങ്ങൾ തടയുക എന്നതാണ്.

NGINX-ൽ ഉപയോഗം അല്ലെങ്കിൽ ട്രാഫിക് പരിമിതപ്പെടുത്തുന്നതിന് മൂന്ന് പ്രധാന വഴികളുണ്ട്:

  1. കണക്ഷനുകളുടെ എണ്ണം പരിമിതപ്പെടുത്തുന്നു (അഭ്യർത്ഥനകൾ).
  2. അഭ്യർത്ഥനകളുടെ നിരക്ക് പരിമിതപ്പെടുത്തുന്നു.
  3. ബാൻഡ്uവിഡ്ത്ത് പരിമിതപ്പെടുത്തുന്നു.

മേൽപ്പറഞ്ഞ NGINX ട്രാഫിക് മാനേജ്uമെന്റ് സമീപനങ്ങൾ, ഉപയോഗ സാഹചര്യത്തെ ആശ്രയിച്ച്, നിർവചിക്കപ്പെട്ട കീയെ അടിസ്ഥാനമാക്കി പരിമിതപ്പെടുത്താൻ കോൺഫിഗർ ചെയ്യാൻ കഴിയും, ഏറ്റവും സാധാരണമായത് ഒരു ക്ലയന്റിന്റെ IP വിലാസമാണ്. ഒരു സെഷൻ കുക്കിയും മറ്റും പോലുള്ള മറ്റ് വേരിയബിളുകളെയും NGINX പിന്തുണയ്ക്കുന്നു.

ഞങ്ങളുടെ മൂന്ന് ഭാഗങ്ങളുള്ള പരമ്പരയുടെ ഈ ആദ്യ ഭാഗത്തിൽ, നിങ്ങളുടെ വെബ്uസൈറ്റുകൾ/ആപ്ലിക്കേഷനുകൾ സംരക്ഷിക്കുന്നതിന് NGINX-ലെ കണക്ഷനുകളുടെ എണ്ണം എങ്ങനെ പരിമിതപ്പെടുത്താമെന്ന് ഞങ്ങൾ ചർച്ച ചെയ്യും.

  • എൻജിഐഎൻഎക്uസിലെ കണക്ഷനുകളുടെ എണ്ണം (അഭ്യർത്ഥനകൾ) എങ്ങനെ പരിമിതപ്പെടുത്താം - ഭാഗം 1
  • എൻജിഐഎൻഎക്uസിലെ കണക്ഷനുകളുടെ നിരക്ക് (അഭ്യർത്ഥനകൾ) എങ്ങനെ പരിമിതപ്പെടുത്താം - ഭാഗം 2
  • എൻജിഐഎൻഎക്uസിൽ ബാൻഡ്uവിഡ്ത്ത് ഉപയോഗം എങ്ങനെ പരിമിതപ്പെടുത്താം - ഭാഗം 3

സെർവർ പ്രോസസ്സ് ചെയ്യുന്ന ഒരു അഭ്യർത്ഥന ഉണ്ടെങ്കിൽ മാത്രമേ NGINX ഒരു കണക്ഷൻ പരിമിതപ്പെടുത്താൻ പരിഗണിക്കുകയുള്ളൂവെന്നും മുഴുവൻ അഭ്യർത്ഥന ശീർഷകവും ഇതിനകം വായിച്ചിട്ടുണ്ടെന്നും ഓർമ്മിക്കുക. അതിനാൽ, എല്ലാ ക്ലയന്റ് കണക്ഷനുകളും കണക്കാക്കില്ല.

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

ആദ്യം, limit_conn_zone നിർദ്ദേശം ഉപയോഗിച്ച് വിവിധ കീകൾക്കായി കണക്ഷൻ മെട്രിക്uസ് സംഭരിക്കുന്ന ഒരു പങ്കിട്ട മെമ്മറി സോൺ നിങ്ങൾ നിർവചിക്കേണ്ടതുണ്ട്. മുമ്പ് സൂചിപ്പിച്ചതുപോലെ, ഒരു കീ എന്നത് ഒരു ടെക്uസ്uറ്റ് ആകാം, ഒരു ക്ലയന്റിൻറെ റിമോട്ട് ഐപി വിലാസം പോലെയുള്ള ഒരു വേരിയബിൾ അല്ലെങ്കിൽ ഇവ രണ്ടും കൂടിച്ചേർന്നതാണ്.

HTTP സന്ദർഭത്തിൽ സാധുതയുള്ള ഈ നിർദ്ദേശം രണ്ട് പാരാമീറ്ററുകൾ എടുക്കുന്നു: കീയും സോണും (Zone_name:size ഫോർമാറ്റിൽ).

limit_conn_zone $binary_remote_addr zone=limitconnbyaddr:20m;

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

limit_conn_status 429;

കണക്ഷനുകൾ പരിമിതപ്പെടുത്തുന്നതിന്, ഇനിപ്പറയുന്ന കോൺഫിഗറേഷൻ സ്uനിപ്പറ്റിൽ കാണിച്ചിരിക്കുന്നതുപോലെ, ഉപയോഗിക്കേണ്ട മെമ്മറി സോണും അനുവദനീയമായ പരമാവധി കണക്ഷനുകളും സജ്ജമാക്കാൻ limint_conn ഡയറക്uടീവ് ഉപയോഗിക്കുക. ഈ നിർദ്ദേശം HTTP, സെർവർ, ലൊക്കേഷൻ സന്ദർഭങ്ങളിൽ സാധുതയുള്ളതാണ്.

limit_conn   limitconnbyaddr  50;

പൂർണ്ണമായ കോൺഫിഗറേഷൻ ഇതാ:

upstream api_service {
    server 127.0.0.1:9051;
    server 10.1.1.77:9052;
}
limit_conn_zone $binary_remote_addr zone=limitconnbyaddr:20m;
limit_conn_status 429;

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

    limit_conn   limitconnbyaddr  50;

    #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 {
        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

Nginx കണക്ഷൻ പരിധി പരിശോധിക്കുന്നു

ഒരു ക്ലയന്റ് അനുവദനീയമായ കണക്ഷനുകളുടെ പരമാവധി എണ്ണം കവിയുമ്പോൾ, NGINX ക്ലയന്റിന് \429 വളരെയധികം അഭ്യർത്ഥനകൾ പിശക് നൽകുകയും പിശക് ലോഗ് ഫയലിൽ ചുവടെയുള്ളത് പോലെയുള്ള ഒരു എൻട്രി രജിസ്റ്റർ ചെയ്യുകയും ചെയ്യുന്നു:

2022/03/15 00:14:00 [error] 597443#0: *127 limiting connections by zone "limitconnbyaddr", client: x.x.x.x, server: testapp.tecmimt.com, request: "GET /static/css/main.63fdefff.chunk.css.map HTTP/1.1", host: "testapp.tecmimt.com"

ആപ്ലിക്കേഷനിലേക്കുള്ള Nginx കണക്ഷനുകളുടെ എണ്ണം പരിമിതപ്പെടുത്തുന്നു

$server_name വേരിയബിൾ ഉപയോഗിച്ച് തന്നിരിക്കുന്ന സെർവറിനായുള്ള കണക്ഷനുകളുടെ എണ്ണം നിങ്ങൾക്ക് പരിമിതപ്പെടുത്താനും കഴിയും:

upstream api_service {
    server 127.0.0.1:9051;
    server 10.1.1.77:9052;
}
limit_conn_zone $server_name zone=limitbyservers:10m;
limit_conn_status 429;

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

     limit_conn  limitbyservers  2000;

    #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 {
        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";
   }
}

testapp.linux-console.net എന്ന ആപ്ലിക്കേഷൻ പവർ ചെയ്യുന്ന വെർച്വൽ സെർവറിലേക്കുള്ള മൊത്തം കണക്ഷനുകളുടെ എണ്ണം 2000 കണക്ഷനുകളായി പരിമിതപ്പെടുത്താൻ ഈ കോൺഫിഗറേഷൻ NGINX-നെ പ്രാപ്തമാക്കുന്നു.

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

അത്തരമൊരു സാഹചര്യത്തിൽ, ആപ്ലിക്കേഷൻ തലത്തിൽ ഒരു ക്ലയന്റിനെ തിരിച്ചറിയാൻ കഴിയുന്ന ഒന്നോ അതിലധികമോ വേരിയബിളുകൾ നിങ്ങൾക്ക് NGINX-ൽ ലഭ്യമാണ്, ഒരു ഉദാഹരണം ഒരു സെഷൻ കുക്കിയാണ്.

ഇനിപ്പറയുന്ന Nginx അനുബന്ധ ലേഖനങ്ങളും നിങ്ങൾക്ക് ഇഷ്ടപ്പെട്ടേക്കാം:

  • NGINX-ൽ ഇഷ്uടാനുസൃത 404 പിശക് പേജ് എങ്ങനെ സൃഷ്uടിക്കാം
  • എൻജിഐഎൻഎക്uസിലെ ക്ലയന്റ് ഐപി വിലാസത്തെ അടിസ്ഥാനമാക്കി ആക്uസസ് എങ്ങനെ നിയന്ത്രിക്കാം
  • എൻജിഐഎൻഎക്uസിൽ ഉള്ളടക്കം കാഷെ ചെയ്യുന്നതെങ്ങനെ
  • Nginx-ൽ HTTP/2.0 എങ്ങനെ പ്രവർത്തനക്ഷമമാക്കാം
  • ലിനക്സിൽ ഒരു HTTP ലോഡ് ബാലൻസറായി Nginx എങ്ങനെ ഉപയോഗിക്കാം

തൽക്കാലം അത്രമാത്രം! ഈ സീരീസിന്റെ അടുത്ത ഭാഗത്ത്, NGINX-ലെ മറ്റൊരു ഉപയോഗപ്രദമായ ട്രാഫിക് മാനേജ്മെന്റ് ടെക്നിക് ഞങ്ങൾ ചർച്ച ചെയ്യും - അഭ്യർത്ഥനകളുടെ നിരക്ക് പരിമിതപ്പെടുത്തുന്നു. അതുവരെ ഞങ്ങളോടൊപ്പം നിൽക്കൂ.