Hvernig á að takmarka fjölda tenginga (beiðna) í NGINX


NGINX er með ýmsar einingar til að leyfa notendum að stjórna umferð á vefsíður sínar, vefforrit, auk annarra vefauðlinda. Ein af lykilástæðunum fyrir því að takmarka umferð eða aðgang er að koma í veg fyrir misnotkun eða árásir af ákveðnu tagi eins og DoS (Denial of Service) árásir.

Það eru þrjár helstu leiðir til að takmarka notkun eða umferð í NGINX:

  1. Takmörkun á fjölda tenginga (beiðna).
  2. Takmarka hlutfall beiðna.
  3. Takmarka bandbreidd.

Ofangreindar NGINX umferðarstjórnunaraðferðir, allt eftir notkunartilvikum, er hægt að stilla til að takmarka út frá skilgreindum lykli, sú algengasta er IP tölu viðskiptavinar. NGINX styður einnig aðrar breytur eins og setukaka og margt fleira.

Í þessum fyrsta hluta þriggja hluta seríunnar okkar munum við ræða hvernig á að takmarka fjölda tenginga í NGINX til að vernda vefsíður þínar/forrit.

  • Hvernig á að takmarka fjölda tenginga (beiðna) í NGINX – Part 1
  • Hvernig á að takmarka hlutfall tenginga (beiðna) í NGINX – Part 2
  • Hvernig á að takmarka bandbreiddarnotkun í NGINX – Part 3

Hafðu í huga að NGINX mun aðeins íhuga tengingu til að takmarka ef það er með beiðni í vinnslu hjá þjóninum og allur beiðnihausinn hefur þegar verið lesinn. Þess vegna eru ekki allar viðskiptavinatengingar taldar.

Takmörkun á fjölda tenginga í NGINX

Í fyrsta lagi þarftu að skilgreina samnýtt minnissvæði sem geymir tengingarmælingar fyrir ýmsa lykla, með því að nota limit_conn_zone tilskipunina. Eins og áður hefur komið fram getur lykill verið texti, breyta eins og ytri IP tölu viðskiptavinar eða sambland af þessu tvennu.

Þessi tilskipun, sem er gild innan HTTP samhengisins, tekur tvær breytur: lykilinn og svæðið (á sniðinu svæðisnafn:stærð).

limit_conn_zone $binary_remote_addr zone=limitconnbyaddr:20m;

Til að stilla svarstöðukóða sem er skilað við hafnað beiðnum, notaðu limit_conn_status tilskipunina sem tekur HTTP stöðukóða sem færibreytu. Það gildir innan HTTP, netþjóns og staðsetningarsamhengis.

limit_conn_status 429;

Til að takmarka tengingar, notaðu limint_conn tilskipunina til að stilla minnissvæðið sem á að nota og hámarksfjölda leyfilegra tenginga eins og sýnt er í eftirfarandi stillingarbút. Þessi tilskipun er gild innan HTTP, netþjóns og staðsetningarsamhengis.

limit_conn   limitconnbyaddr  50;

Hér er heildaruppsetningin:

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

Vistaðu skrána og lokaðu henni.

Athugaðu síðan hvort NGINX stillingin sé í lagi með því að keyra eftirfarandi skipun:

$ sudo nginx -t

Næst skaltu endurhlaða NGINX þjónustuna til að framkvæma nýlegar breytingar:

$ sudo systemctl reload nginx

Athugar Nginx tengingarmörk

Þegar viðskiptavinur fer yfir hámarksfjölda leyfilegra tenginga, skilar NGINX „429 of margar beiðnir“ villu til viðskiptavinarins og skráir færslu eins og þá hér að neðan í villuskránni:

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"

Takmarka Nginx fjölda tenginga við forrit

Þú getur líka takmarkað fjölda tenginga fyrir tiltekinn netþjón með því að nota $server_name breytuna:

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

Þessi uppsetning gerir NGINX kleift að takmarka heildarfjölda tenginga við sýndarþjóninn sem knýr forritið testapp.linux-console.net við 2000 tengingar.

Athugið: Það hefur galla að takmarka tengingar byggðar á IP viðskiptavinar. Þú gætir endað með því að takmarka tengingar fyrir fleiri en aðeins einn notanda, sérstaklega ef margir notendur sem fá aðgang að forritinu þínu eru á sama neti og starfa á bak við NAT - allar tengingar þeirra munu koma frá sömu IP tölu.

Í slíkri atburðarás geturðu notað eina eða fleiri breytur sem eru tiltækar í NGINX sem geta auðkennt viðskiptavin á forritastigi, dæmi er setukaka.

Þú gætir líka haft gaman af eftirfarandi Nginx tengdum greinum:

  • Hvernig á að búa til sérsniðna 404 villusíðu í NGINX
  • Hvernig á að stjórna aðgangi byggt á IP tölu viðskiptavinar í NGINX
  • Hvernig á að vista efni í skyndiminni í NGINX
  • Hvernig á að virkja HTTP/2.0 í Nginx
  • Hvernig á að nota Nginx sem HTTP álagsjafnvægi í Linux

Það er það í bili! Í næsta hluta þessarar seríu munum við ræða aðra gagnlega umferðarstjórnunartækni í NGINX - takmarka hraða beiðna. Þangað til, vertu hjá okkur.