NGINX-de birikmeleriň sanyny (haýyşlary) nädip çäklendirmeli


NGINX ulanyjylara web sahypalaryna, web programmalaryna we beýleki web çeşmelerine traffigi gözegçilikde saklamak üçin dürli modullar bilen iberýär. Trafigi ýa-da girişi çäklendirmegiň esasy sebäplerinden biri, DoS (Hyzmatdan ýüz öwürmek) ýaly hüjümleriň ýa-da hüjümleriň öňüni almakdyr.

NGINX-de ulanylyşy ýa-da traffigi çäklendirmegiň üç esasy usuly bar:

  1. Baglanyşyklaryň (haýyşlaryň) sanyny çäklendirmek.
  2. Islegleriň tizligini çäklendirmek.
  3. Zolak giňligini çäklendirmek.

INokardaky NGINX traffigi dolandyrmak çemeleşmeleri, ulanylyş ýagdaýyna baglylykda kesgitlenen açara esaslanyp çäklendirilip bilner, iň köp ýaýran müşderiniň IP adresi. NGINX, şeýle hem, sessiýa gutapjygy we başga-da köp üýtgeýjini goldaýar.

Üç bölümli seriýamyzyň bu birinji bölüminde, web sahypalaryňyzy/programmalaryňyzy goramak üçin NGINX-de birikmeleriň sanyny nädip çäklendirip boljakdygyny ara alyp maslahatlaşarys.

  • NGINX-de birikmeleriň sanyny (haýyşlary) nädip çäklendirmeli - 1-nji bölüm
  • NGINX-de birikmeleriň tizligini nädip çäklendirmeli - 2-nji bölüm
  • NGINX-de geçirijilik giňligini ulanmagy nädip çäklendirmeli - 3-nji bölüm

NGINX-yň diňe serwer tarapyndan işlenýän we ähli haýyş sözbaşy eýýäm okalýan ýagdaýynda çäklendirmek üçin baglanyşygy göz öňünde tutjakdygyny ýadyňyzdan çykarmaň. Şonuň üçin müşderileriň birikmeleriniň hemmesi sanalmaýar.

NGINX-de birikmeleriň sanyny çäklendirmek

Ilki bilen, limit_conn_zone direktiwasyny ulanyp, dürli düwmeler üçin baglanyşyk ölçeglerini saklaýan umumy ýat zolagyny kesgitlemeli. Öň bellenip geçilişi ýaly, açar tekst, müşderiniň uzakdaky IP adresi ýaly üýtgeýän ýa-da ikisiniň utgaşmasy bolup biler.

HTTP kontekstinde hereket edýän bu görkezme iki parametr alýar: açar we zona (zona_name: ululykda).

limit_conn_zone $binary_remote_addr zone=limitconnbyaddr:20m;

Ret edilen haýyşlara gaýtarylýan jogap statusy koduny bellemek üçin, HTTP status koduny parametr hökmünde alýan limit_conn_status direktiwasyny ulanyň. HTTP, serwer we ýerleşiş şertlerinde hereket edýär.

limit_conn_status 429;

Baglanyşyklary çäklendirmek üçin, ulanyljak ýat zolagyny we aşakdaky konfigurasiýa parçasynda görkezilişi ýaly iň köp rugsat berlen birikmeleri kesgitlemek üçin limint_conn direktiwasyny ulanyň. Bu görkezme, HTTP, serwer we ýerleşiş şertlerinde hereket edýär.

limit_conn   limitconnbyaddr  50;

Ine, doly konfigurasiýa:

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

Faýly ýazdyryň we ýapyň.

Soňra aşakdaky buýrugy işledip NGINX konfigurasiýasynyň gowydygyny ýa-da ýokdugyny barlaň:

$ sudo nginx -t

Ondan soň, soňky üýtgeşmeleri amala aşyrmak üçin NGINX hyzmatyny täzeden açyň:

$ sudo systemctl reload nginx

Nginx birikme çägini barlamak

Müşderi rugsat berlen birikmeleriň iň köp sanyndan ýokary bolsa, NGINX müşderä\429 gaty köp haýyş ýalňyşlygyny gaýtaryp berýär we säwlik ýazgy faýlyndaky ýaly ýazgy ýazýar:

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"

Programma bilen baglanyşyk sanyny Nginx çäklendirmek

Şeýle hem, berlen serwer üçin $server_name üýtgeýjisini ulanmak arkaly baglanyşyk sanyny çäklendirip bilersiňiz:

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

Bu konfigurasiýa NGINX-a testapp.linux-console.net programmasyny işleýän wirtual serwere birikmeleriň umumy sanyny 2000 birikme bilen çäklendirmäge mümkinçilik berýär.

Bellik: Müşderiniň IP-si esasynda baglanyşyklary çäklendirmek erbet tarapy bar. Diňe birden köp ulanyjy üçin baglanyşyklary çäklendirip bilersiňiz, esasanam programmaňyza girýän köp ulanyjy şol bir torda bolsa we bir NAT-yň arkasynda işleýän bolsa - ähli baglanyşyklary şol bir IP adresinden gelip çykar.

Şeýle ssenariýada, NGINX-da bar bolan bir müşderini programma derejesinde kesgitläp biljek bir ýa-da birnäçe üýtgeýjini ulanyp bilersiňiz, mysal üçin sessiýa gutapjygy.

Şeýle hem, Nginx bilen baglanyşykly aşakdaky makalalary halap bilersiňiz:

  • NGINX-da 404 säwlik sahypasyny nädip döretmeli
  • NGINX-de müşderiniň IP adresi esasynda elýeterliligi nädip dolandyrmaly
  • NGINX-de mazmuny nädip keşde saklamaly
  • Nginx-de HTTP/2.0 nädip işletmeli
  • Nginx-i Linux-da HTTP ýük balansy hökmünde nädip ulanmaly

Häzirlikçe! Bu tapgyryň indiki bölüminde, NGINX-de islegleriň tizligini çäklendirýän başga bir peýdaly ýol hereketini ara alyp maslahatlaşarys. Oňa çenli biziň bilen galyň.