Configurarea Nginx pentru performanță și securitate

În acest tutorial, vom analiza cum putem configura serverul web Nginx pentru un mediu de producție.


Un server web dintr-un mediu de producție este diferit de un server web într-un mediu de testare din punct de vedere al performanței, securității și așa mai departe.

În mod implicit, există întotdeauna o setare de configurare gata de utilizare pentru un server web Nginx după ce l-ați instalat cu succes. Cu toate acestea, configurația implicită nu este suficient de bună pentru un mediu de producție. Prin urmare, ne vom concentra asupra modului de configurare a Nginx pentru a funcționa mai bine în timpul creșterii grele și normale a traficului și a modului de a-l proteja de utilizatorii care intenționează să îl abuzeze.

Dacă nu ați instalat Nginx pe mașina dvs., puteți verifica cum se face aici. Vă arată cum instalați Nginx pe o platformă Unix. Alegeți să instalați Nginx prin fișierele sursă, deoarece Nginx pre-construit nu vine cu unele dintre modulele utilizate în acest tutorial.

cerinţe

Trebuie să aveți următoarele instalate pe mașina dvs. și asigurați-vă că rulați acest tutorial pe orice platformă bazată pe Debian, cum ar fi Ubuntu.

  • Ubuntu sau orice altă platformă bazată pe Debian
  • wget
  • Vim (editor de text)

De asemenea, trebuie să rulați sau să executați unele comenzi din acest tutorial ca utilizator rădăcină prin intermediul comenzii sudo.

Înțelegerea structurii de configurare a Nginx

În această secțiune vom analiza următoarele:

  • Structura Nginx
  • Secțiuni precum un eveniment, HTTP și e-mail
  • Sintaxa valabilă a Nginx

La sfârșitul acestei secțiuni, veți înțelege structura configurației Nginx, scopul sau rolurile secțiunilor, precum și modul de definire a directivelor valabile în interiorul secțiunilor.

Fișierul complet de configurare Nginx are o structură logică care este compusă din directive grupate într-un număr de secțiuni precum secțiunea eveniment, secțiunea http, secțiunea mail etc..

Fișierul principal de configurare este situat la /etc/nginx/nginx.conf în timp ce alte fișiere de configurare sunt localizate la / etc / nginx.

Contextul principal

Această secțiune sau context conține directive în afara secțiunilor specifice, cum ar fi secțiunea mail.

Orice alte directive, cum ar fi user nginx; , Lucrător_procese 1; , Error_log /var/log/nginx/error.log avertizare; și pid /var/run/nginx.pid pot fi plasate în secțiunea sau contextul principal.

Dar unele dintre aceste directive, cum ar fi lucrătorii_procese pot exista și în secțiunea eveniment.

secţiuni

Secțiunile din Nginx definește configurația pentru modulele Nginx.

De exemplu, secțiunea http definește configurația pentru modulul ngx_http_core, secțiunea eveniment definește configurația pentru ngx_event_module în timp ce secțiunea mail definește configurația pentru ngx_mail_module.

Puteți verifica aici pentru o listă completă de secțiuni din Nginx.

directivă

Directivele din Nginx sunt alcătuite dintr-un nume variabil și o serie de argumente, cum ar fi următoarele:

Work_processes este un nume variabil în timp ce automatul servește drept argument.

muncitor_procesează auto;

Directivele se încheie cu un semicon așa cum se arată mai sus.

În cele din urmă, fișierul de configurare Nginx trebuie să respecte un anumit set de reguli. Următoarele sunt sintaxa valabilă a configurației Nginx:

  • Directivele valide încep cu un nume variabil, apoi sunt urmate de unul sau mai multe argumente
  • Toate directivele valabile se încheie cu un semicolon;
  • Secțiunile sunt definite cu bretele cretate {}
  • O secțiune poate fi încorporată într-o altă secțiune
  • Configurația în afara oricărei secțiuni face parte din configurația globală Nginx.
  • Liniile care încep cu semnul hash # sunt comentarii.

Reglarea Nginx pentru performanță

În această secțiune, vom configura Nginx să funcționeze mai bine în timpul traficului intens și al intensității traficului.

Vom analiza modul de configurare:

  • Muncitorii
  • Activitate I / O de disc
  • Activitate de rețea
  • Tampoanele
  • Comprimare
  • Caching
  • Pauză

Totuși, în mediul virtual activat, tastați următoarele comenzi pentru a schimba în directorul Nginx și lista conținutului acestuia.

cd nginx && ls

Căutați dosarul conf. În acest folder se află fișierul nginx.conf.

Vom folosi acest fișier pentru a configura Nginx

Acum executați următoarele comenzi pentru a naviga în folderul conf și deschideți fișierul nginx.conf cu editorul vim

cd conf
sudo vim nginx.conf

Mai jos este o captură de ecran cu aspectul implicit al fișierului nginx.conf.

Muncitorii

Pentru a permite Nginx să funcționeze mai bine, trebuie să configuram lucrătorii în secțiunea evenimente. Configurarea lucrătorilor Nginx vă permite să procesați conexiunile de la clienți în mod eficient.

Presupunând că nu ați închis editorul vim, apăsați butonul i de pe tastatură pentru a edita fișierul nginx.conf.

Copiați și lipiți următoarele în secțiunea evenimente, așa cum se arată mai jos:

evenimente {
muncitor_procesează auto;
lucrători_conectări 1024;
muncitor_rlimit_nofil 20960;
multi_accept on;
mutex_accept on;
mutex_accept_delay 500ms;
folosiți epoll;
epoll_events 512;
}

working_proceses: Această directivă controlează numărul de lucrători din Nginx. Valoarea acestei directive este setată pe auto pentru a permite Nginx să determine numărul de nuclee disponibile, discuri, încărcarea serverului și subsistemul de rețea. Cu toate acestea, puteți descoperi numărul de nuclee executând comanda lscpu pe terminal.

lucrător_conectări: Această directivă stabilește valoarea numărului de conexiuni simultane care poate fi deschis de un lucrător. Valoarea implicită este 512, dar o setăm la 1.024 pentru a permite unui lucrător să accepte o conexiune mult simultană de la un client.

worker_rlimit_nofile: Această directivă este legată cumva de conexiunile de la muncitor. Pentru a gestiona conexiunea simultană mare, o setăm la o valoare mare.

multi_accept: Această directivă permite unui lucrător să accepte multe conexiuni la coadă la un moment dat. O coadă în acest context înseamnă pur și simplu o secvență de obiecte de date care așteaptă să fie procesate.

mutex_accept: Această directivă este dezactivată implicit. Dar, deoarece am configurat mulți lucrători în Nginx, trebuie să-l activăm așa cum se arată în codul de mai sus pentru a permite lucrătorilor să accepte conexiuni noi unul câte unul.

mutex_accept_delay: Această directivă stabilește cât timp trebuie să aștepte un lucrător înainte de a accepta o nouă conexiune. După ce accept_mutex este activat, un blocator mutex este atribuit unui lucrător pentru un interval de timp specificat de accept_mutex_delay. Când intervalul de timp este terminat, următorul lucrător din linie este gata să accepte conexiuni noi.

use: Această directivă specifică metoda de procesare a unei conexiuni de la client. În acest tutorial, am decis să setăm valoarea la epoll, deoarece lucrăm pe o platformă Ubuntu. Metoda epoll este cea mai eficientă metodă de procesare pentru platformele Linux.

epoll_events: Valoarea acestei directive specifică numărul de evenimente pe care Nginx le va transfera pe kernel.

I / O de disc

În această secțiune, vom configura activitatea I / O asincronă în Nginx pentru a-i permite să efectueze un transfer de date eficient și să îmbunătățească eficacitatea cache-ului.

Disk I / O se referă pur și simplu la operațiuni de scriere și citire între hard disk și RAM. Vom folosi Trimite fișier() funcționează în interiorul kernelului pentru a trimite fișiere mici.

Puteți utiliza secțiunea http, secțiunea locație și secțiunea server pentru directive în acest domeniu.

Secțiunea locație, secțiunea server poate fi încorporată sau plasată în secțiunea http pentru a face lizibilitatea configurației.

Copiați și lipiți următorul cod în secțiunea de locație încorporată în secțiunea HTTP.

locație / pdf / {
sendfile pornit;
aio on;
}

locație / audio / {
directio 4m
directio_alignment 512
}

sendfile: Pentru a utiliza resursele sistemului de operare, setați valoarea acestei directive pe. sendfile transferă date între descriptorii de fișiere în spațiul kernel-ului OS fără a le trimite la bufferele de aplicații. Această directivă va fi folosită pentru a servi fișiere mici.

directio: Această directivă îmbunătățește eficacitatea memoriei cache, permițând trimiterea și citirea și scrierea directă a aplicației. directio este o caracteristică a sistemului de fișiere a fiecărui sistem de operare modern. Această directivă va fi folosită pentru a servi fișiere mai mari precum videoclipuri.

Aio: Această directivă permite multi-threading atunci când este setată pentru operarea de scriere și citire. Multi-threading este un model de execuție care permite executarea mai multor thread-uri separat unele de altele, în timp ce împărtășesc resursele procesului lor de găzduire.

directio_alignment: Această directivă atribuie o valoare a dimensiunii blocului pentru transferul de date. Aceasta a avut legătură cu directiva directio.

Stratul de rețea

În această secțiune, vom folosi directive cum ar fi tcp_nodelay și tcp_nopush pentru a împiedica pachetele mici să aștepte un interval de timp specificat de aproximativ 200 de milisecunde înainte de a fi trimise simultan.

De obicei, atunci când pachetele sunt transferate în „bucăți”, acestea tind să satureze rețeaua foarte încărcată. Deci, John Nagle a construit un algoritm de tamponare pentru a rezolva această problemă. Scopul algoritmului de tamponare al lui Nagle este de a împiedica pachetele mici să sature rețeaua foarte încărcată.

Copiați și lipiți următorul cod în secțiunea HTTP.

http {

tcp_nopush on;
tcp_nodelay on;

}

tcp_nodelay: implicit, această directivă este dezactivată pentru a permite pachetelor mici să aștepte o perioadă specificată înainte de a fi trimise deodată. Pentru a permite trimiterea tuturor datelor simultan, această directivă este activată.

tcp_nopush: Deoarece am activat directiva tcp_nodelay, pachetele mici sunt trimise simultan. Cu toate acestea, dacă totuși doriți să folosiți algoritmul de tamponare al lui John Nagle, putem de asemenea să activăm tcp_nopush să adauge pachete între ele și să le trimiteți toate simultan.

Tampoanele

Să aruncăm o privire la modul de configurare a tampoanelor de solicitare din Nginx pentru a gestiona solicitările în mod eficient. Un tampon este o stocare temporară unde datele sunt păstrate o perioadă de timp și procesate.

Puteți copia mai jos în secțiunea server.

Server {

client_body_buffer_size 8k;
client_max_body_size 2m;
client_body_in_single_buffer activat;
client_body_temp_pathtemp_files 1 2;
client_header_buffer_size 1m;
large_client_header_buffers 4 8k;

}

Este important să înțelegem ce fac acele linii tampon.

client_body_buffer_size: Această directivă stabilește dimensiunea bufferului pentru organismul de solicitare. Dacă intenționați să rulați serverul web pe sisteme pe 64 de biți, trebuie să setați valoarea la 16k. Dacă doriți să rulați serverul web pe sistemul pe 32 de biți, setați valoarea pe 8k.

client_max_body_size: Dacă intenționați să gestionați încărcări mari de fișiere, trebuie să setați această directivă pe cel puțin 2 m sau mai mult. În mod implicit, este setat la 1m.

client_body_in_file_only: Dacă ați dezactivat directiva client_body_buffer_size cu simbolul hashtag # și această directivă client_body_in_file_only este setat, Nginx va salva apoi bufferele de solicitare într-un fișier temporar. Acest lucru nu este recomandat pentru un mediu de producție.

client_body_in_single_buffer: Uneori, nu tot corpul de solicitare este stocat într-un tampon. Restul acestuia este salvat sau scris într-un fișier temporar. Cu toate acestea, dacă intenționați să salvați sau să memorați tamponul complet de solicitare într-un singur tampon, trebuie să activați această directivă.

client_header_buffer_size: Puteți utiliza această directivă pentru a seta sau aloca un buffer pentru anteturile cererii. Puteți seta această valoare la 1 m.

large_client_header_buffers: Această directivă este utilizată pentru setarea numărului și dimensiunii maxime pentru citirea anteturilor de cerere mari. Puteți seta numărul maxim și dimensiunea bufferului la 4 și 8k cu exactitate.

Comprimare

Comprimarea cantității de date transferate prin rețea este un alt mod de a vă asigura că serverul dvs. web funcționează mai bine. În această secțiune, vom folosi directive cum ar fi gzip, gzip_comp_level și gzip_min_length pentru a comprima datele.

Lipiți următorul cod în secțiunea http, așa cum se arată mai jos:

http {

gzip pornit;
gzip_comp_level 2;
gzip_min_length 1000;
gzip_types text / xml text / css;
gzip_http_version 1.1;
gzip_vary pornit;
gzip_disable "MSIE [4-6] \.";

}

gzip: Dacă doriți să activați compresia, setați valoarea acestei directive. În mod implicit, este dezactivat.

gzip_comp_level: Puteți folosi această directivă pentru a stabili nivelul de compresie. Pentru a nu pierde resursele procesorului, nu trebuie să setați nivelul de compresie prea mare. Între 1 și 9, puteți seta nivelul de compresie la 2 sau 3.

gzip_min_length: Setați lungimea minimă de răspuns pentru compresie prin câmpul antetului lungimii conținutului. Puteți să-l setați la mai mult de 20 de octeți.

gzip_types: Această directivă vă permite să alegeți tipul de răspuns pe care doriți să-l comprimați. În mod implicit, textul / html de tip de răspuns este întotdeauna comprimat. Puteți adăuga un alt tip de răspuns, cum ar fi text / css, așa cum se arată în codul de mai sus.

gzip_http_version: Această directivă vă permite să alegeți versiunea HTTP minimă a unei solicitări pentru un răspuns comprimat. Puteți utiliza valoarea implicită care este 1.1.

gzip_vary: Când directiva gzip este activată, această directivă adaugă câmpul de antet Vary: Accept Encoding la răspuns.

gzip_disabled: Unele browsere precum Internet Explorer 6 nu au suport pentru compresia gzip. Această directivă folosește câmpul antet de solicitare a User-Agent pentru a dezactiva compresia pentru anumite browsere.

Caching

Utilizați funcțiile de memorie în cache pentru a reduce numărul de ori pentru a încărca aceleași date de mai multe ori. Nginx furnizează caracteristici pentru a memora în cache conținut static de metadate prin directiva open_file_cache.

Puteți plasa această directivă în secțiunea server, locație și http.

http {

open_file_cache max = 1.000 inactiv = 30s;
open_file_cache_valid 30s;
open_file_cache_min_uses 4;
open_file_cache_errors activat;

}

open_file_cache: Această directivă este dezactivată implicit. Activați-l dacă doriți implementarea caching-ului în Nginx. Această directivă stochează metadate de fișiere și directoare solicitate frecvent de utilizatori.

open_file_cache_valid: Această directivă conține informații de rezervă din directiva open_file_cache. Puteți utiliza această directivă pentru a stabili o perioadă valabilă, de obicei în câteva secunde după care informațiile legate de fișiere și directoare sunt re-validate din nou.

open_file_cache_min_uses: Nginx, de obicei, șterge informațiile din directiva open_file_cache după o perioadă de inactivitate bazată pe open_file_cache_min_uses. Puteți utiliza această directivă pentru a seta un număr minim de acces pentru a identifica ce fișiere și directoare sunt accesate în mod activ.

open_file_cache_errors: Puteți folosi această directivă pentru a permite Nginx să cacheze erori, cum ar fi „permisul refuzat” sau „nu pot accesa acest fișier” atunci când sunt accesate fișierele. Deci, oricând accesează o resursă de către un utilizator care nu are dreptul să o facă, Nginx afișează același raport de eroare „permisiunea refuzată”.

Pauză

Configurați expirarea timpului utilizând directive precum keepalive_timeout și keepalive_requests pentru a împiedica conexiunile care așteaptă mult timp să piardă resurse.

În secțiunea HTTP, copiați și inserați următorul cod:

http {

keepalive_timeout 30s;
keepalive_requests 30;
send_timeout 30s;

}

keepalive_timeout: mențineți conexiunile în viață timp de aproximativ 30 de secunde. Valoarea implicită este de 75 de secunde.

keepalive_requests: Configurați o serie de solicitări pentru a menține vie pentru o anumită perioadă de timp. Puteți seta numărul de solicitări la 20 sau 30.

keepalive_disable: dacă doriți să dezactivați conexiunea keepalive pentru un anumit grup de browsere, utilizați această directivă.

send_timeout: Setați un interval de timp pentru transmiterea datelor către client.

Configurare de securitate pentru Nginx

Următoarele aspecte se concentrează exclusiv asupra modului de configurare în siguranță a unui Nginx în locul unei aplicații web. Astfel, nu vom analiza atacurile bazate pe web cum ar fi injecția SQL ș.a..

În această secțiune vom analiza cum să configurați următoarele:

  • Limitați accesul la fișiere și directoare
  • Configurați jurnalele pentru a monitoriza activitățile dăunătoare
  • Prevenirea DDoS
  • Dezactivați listarea directoarelor

Limitați accesul la fișiere și directoare

Să ne uităm la modul de restricționare a accesului la fișiere și directoare sensibile prin următoarele metode.

Prin utilizarea autentificării HTTP

Putem restricționa accesul la fișiere sau zone sensibile care nu sunt destinate vizualizării publice, solicitând autentificarea utilizatorilor sau chiar a administratorilor. Rulați următoarea comandă pentru a instala o utilitate de creare a fișierelor cu parolă dacă nu ați instalat-o.

apt-get install -y apache-utils

Apoi, creați un fișier cu parolă și un utilizator folosind instrumentul htpasswd așa cum se arată mai jos. Instrumentul htpasswd este furnizat de utilitatea apache2-utils.

sudo htpasswd -c / etc / apache2 / .htpasswd

Puteți confirma dacă ați creat cu succes o utilizator și o parolă aleatorie prin următoarea comandă

pisica etc / apache2 / .htpasswd

În secțiunea locație, puteți lipi următorul cod pentru a solicita utilizatorilor autentificarea folosind directiva auth_basic.

locație / admin {

basic_auth "Zona de administrare";
auth_basic_user_file / etc / apache2 / .htpasswd;

}

Prin utilizarea directivei Allow

În plus față de directiva basic_auth, putem folosi directiva permise pentru a restricționa accesul.

În secțiunea locație, puteți utiliza următorul cod pentru a permite adreselor IP specificate să acceseze zona sensibilă.

locație / admin {
permite 192.168.34.12;
permite 192.168.12.34;
}

Configurați jurnalele pentru a monitoriza activitățile dăunătoare

În această secțiune, vom configura jurnalele de eroare și de acces pentru a monitoriza în mod specific solicitările valide și invalide. Puteți examina aceste jurnaluri pentru a afla cine s-a conectat la un moment dat sau care utilizator a accesat un anumit fișier etc..

error_log: Vă permite să configurați logarea într-un anumit fișier, cum ar fi syslog sau stderr. De asemenea, puteți specifica nivelul mesajelor de eroare pe care doriți să le înregistrați.

access_log: Permite scrierea solicitării utilizatorilor în fișierul access.log

În secțiunea HTTP, puteți utiliza următoarele.

http {

access_log logs / access.log combinat;
error_log logs / Warn.log avertizare;

}

Preveniți DDOS

Puteți proteja Nginx de un atac DDOS prin următoarele metode:

Limitarea cererilor utilizatorilor 

Puteți folosi directivele limit_req_zone și limit_req pentru a limita rata unei solicitări trimise de utilizatori în câteva minute.

Adăugați următorul cod în secțiunea de locație încorporată în secțiunea server.

limit_req_zone $ binary_remote_addr zone = 1: rata 10m = 30r / m;

Server {
locație /admin.html {
zona limita_req = una;
}

}

Limitați numărul de conexiuni 

Puteți utiliza directivele limit_conn și limit_conn_zone pentru a limita conexiunea la anumite locații sau zone. De exemplu, codul de mai jos primește 15 conexiuni de la clienți pentru o anumită perioadă.

Următorul cod va merge la secțiunea locație.

limit_conn_zone $ binary_remote_addr zone = addr: 10m;

Server {

locație / produse / {
limit_conn addr 10;

}
}

Încheiați conexiunile lente   

Puteți utiliza directive de timeout, cum ar fi client_body_timeout și client_header_timeout pentru a controla cât timp va aștepta Nginx pentru scrierea din corpul și antetul clientului..

Adăugați următoarele în secțiunea server.

Server {
client_body_timeout 5s;
client_header_timeout 5s;
}

Ar fi, de asemenea, o idee bună să opriți atacurile DDoS la margine, folosind soluții bazate pe cloud, așa cum se menționează aici.

Dezactivați listarea directoarelor

Puteți folosi directiva auto_index pentru a preveni listarea directoarelor, așa cum se arată în codul de mai jos. Trebuie să o setați la valoarea dezactivată pentru a dezactiva înregistrarea în director.

Locație / {
auto_index dezactivat;
}

Concluzie

Am configurat serverul web Nginx pentru a-l efectua eficient și a-l proteja de abuzurile excesive într-un mediu de producție. Dacă utilizați Nginx pentru aplicații web orientate către Internet, atunci ar trebui să luați în considerare și utilizarea unui CDN și securitate bazată pe cloud pentru o mai bună performanță și securitate.

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me
    Like this post? Please share to your friends:
    Adblock
    detector
    map