Reglaj fin Nginx. Protecție, optimizare. Server web Nginx și apache - ce este și cum funcționează această combinație?

Serverul web Nginx este unul dintre cele mai populare servere web cu performanțe foarte înalte și procesare rapidă a cererilor statice de la utilizatori. La setare corectă Puteți obține performanțe foarte înalte de la acest server web. Nginx este foarte rapid la manipularea fișierelor statice, fie el pagini html sau alte tipuri de resurse.

Într-unul dintre articolele anterioare ne-am uitat deja la stabilirea parametrilor săi principali, în acest articol vreau să mă opresc mai mult asupra performanței și pregătirii serverului web pentru utilizare în condiții de luptă. Cu privire la distribuție Linux, atunci astăzi vom lua în considerare CentOS, acest sistem este adesea folosit pe servere și pot apărea unele dificultăți la configurarea Nginx. În continuare ne vom uita la configurarea Nginx CentOS, să vorbim despre cum să activam suportul complet pentru http2, viteza paginii googleși configurați fișierul de configurare principal.

Arhivele oficiale CentOS includ Nginx și cel mai probabil este deja instalat pe sistemul dumneavoastră. Dar dorim ca site-ul să funcționeze folosind protocolul http2, care vă permite să transferați toate datele cu o singură conexiune, iar acest lucru crește performanța. Pentru a funcționa prin http2, va trebui să configurați un certificat SSL, dar acest lucru este deja scris în articolul de obținere a unui certificat Lets Encrypt Nginx. Dar asta nu este tot. Pentru a trece de la SSL obișnuit la HTTP2.0, majoritatea browserelor folosesc acum protocolul ALPN și este acceptat începând cu OpenSSL 1.02. În timp ce în depozite există doar OpenSSL 1.01. Prin urmare, trebuie să instalăm o versiune de Nginx construită cu OpenSSL 1.02. Puteți utiliza Broken Repo pentru asta:

sudo yum -y instalează yum-utils
# sudo yum-config-manager --add-repo https://brouken.com/brouken.repo

Dacă utilizați depozitul EPEL, atunci trebuie să indicați că nu trebuie să luați Nginx din acesta:

sudo yum-config-manager --save --setopt=epel.exclude=nginx*;

Acum, pentru a instala versiunea corectă de Nginx, trebuie doar să tastați:

sudo yum install nginx

Cel mai ultima versiune Nginx 1.13.2, cu suport complet ALPN. În continuare, să trecem la configurare.

2. Configurarea Nginx

Primul pas este să luați în considerare structura fișierului de configurare. La prima vedere, totul aici poate părea foarte confuz, dar totul este destul de logic:

opțiuni globale
evenimente()
http(
Server (
Locație()
}
Server()
}

Mai întâi există opțiuni globale, care stabilesc parametrii de bază ai programului, de exemplu, pe ce utilizator va fi lansat și numărul de procese. Urmează o secțiune evenimente, care descrie modul în care Nginx va răspunde la conexiunile de intrare, urmat de secțiunea http, care combină toate setările referitoare la muncă protocol http. Conține o secțiune Server, fiecare astfel de secțiune este responsabilă pentru un domeniu separat, secțiunea server conține secțiuni Locație, fiecare dintre acestea fiind responsabil pentru un anumit Solicitare URL, vă rugăm să rețineți că nu este un fișier de pe server, ca în Apache, ci URL-ul solicitării.

De bază setări globale o vom face în fișierul /etc/nginx/nginx.conf. În continuare, să ne uităm la ce vom schimba exact și ce valori este recomandabil să setăm. Să începem cu opțiunile globale:

  • utilizator- utilizatorul în numele căruia va fi lansat serverul trebuie să fie proprietarul directorului cu fișierele site-ului, iar php-fpm trebuie să fie rulat în numele lui;
  • procese_lucrători- numărul de procese Nginx care vor fi lansate trebuie setat exact câte nuclee aveți, de exemplu, eu am 4;
  • worker_cpu_affinity- acest parametru vă permite să atribuiți fiecărui proces un nucleu de procesor separat, setați valoarea la auto, astfel încât programul însuși să aleagă la ce să se atașeze;
  • worker_rlimit_nofile - suma maxima fișierele pe care programul le poate deschide, fiecare conexiune are nevoie de cel puțin două fișiere și fiecare proces va avea numărul de conexiuni pe care îl specificați, deci formula este: worker_proceses * worker_connections * 2, parametrul conexiuni_lucrători Să ne uităm la asta mai jos;
  • pcre_jit- activați această opțiune pentru a accelera procesarea expresii obisnuite folosind compilarea JIT;

În secțiunea de evenimente ar trebui să configurați doi parametri:

  • conexiuni_lucrători- numărul de conexiuni pentru un proces trebuie să fie suficient pentru a procesa conexiunile de intrare. În primul rând, trebuie să știm câte dintre aceste conexiuni de intrare există, pentru aceasta ne uităm la statisticile de pe server ip_address/nginx_status. Vom vedea mai jos cum să-l activăm. În linia Active Connections vedem numărul compuși activi cu serverul, trebuie să țineți cont și de faptul că sunt luate în considerare și conexiunile cu php-fpm. Apoi, acordați atenție câmpurilor acceptate și gestionate, primul afișează conexiunile procesate, al doilea - numărul celor acceptate. Valorile trebuie să fie aceleași. Dacă diferă, înseamnă că nu există suficiente conexiuni. Vezi exemplele, prima imagine este problema, a doua este ordinea. Pentru configurația mea, cifra optimă poate fi 200 de conexiuni (800 în total, luând în considerare 4 procese):

  • multi_accept- permite programului să accepte mai multe conexiuni simultan, de asemenea, accelerează lucrul, când cantitati mari conexiuni;
  • accept_mutex- setați valoarea acestui parametru la off, astfel încât toate procesele să primească imediat notificare despre noile conexiuni;

De asemenea, se recomandă utilizarea directivei de utilizare epoll în secțiunea evenimente, deoarece aceasta este metoda eficienta procesează conexiunile de intrare pentru Linux, dar această metodă este folosită în mod implicit, așa că nu văd niciun rost să o adaug manual. Să ne uităm la câțiva parametri din secțiunea http:

  • Trimite fișier- utilizați metoda de trimitere a datelor sendfile. Cea mai eficientă metodă pentru Linux.
  • tcp_nodelay, tcp_nopush- trimite anteturile și corpul cererii într-un singur pachet, funcționează puțin mai repede;
  • keepalive_timeout- timeout pentru menținerea unei conexiuni cu clientul, dacă nu aveți scripturi foarte lente, atunci vor fi suficiente 10 secunde, setați valoarea cât este necesar pentru ca utilizatorul să poată fi conectat la server;
  • reset_timedout_connection- întrerupeți conexiunile după un timeout.
  • open_file_cache- cache informații despre deschide fișiere. De exemplu, open_file_cache max=200000 inactive=120s; max - numărul maxim de fișiere în cache, timpul de stocare în cache.
  • open_file_cache_valid- când trebuie să verificați relevanța fișierelor. De exemplu: open_file_cache_valid 120s;
  • open_file_cache_min_uses- memorați cache numai fișierele care au fost deschise cantitate specificată o singura data;
  • open_file_cache_errors- amintiți-vă erorile de deschidere a fișierelor.
  • dacă_modificată- stabilește cum vor fi procesate anteturile if-modified-since. Cu acest antet, browserul poate primi un răspuns 304 dacă pagina nu s-a schimbat de atunci ultima vizualizare. Opțiuni posibile: nu trimite - off, trimite dacă ora se potrivește exact - exact, trimite dacă ora se potrivește exact sau mai mult - înainte;

Asa va arata configurarea nginx conf:

utilizator nginx;
lucrător_procese 4;
worker_cpu_affinity auto;
worker_rlimit_nofile 10000;
pcre_jit on;

error_log /var/log/nginx/error.log warn;
load_module „module/ngx_pagespeed.so”;

evenimente (
multi_accept pe;
accept_mutex dezactivat;
conexiuni_muncitor 1024;
}

sendfile activat;
tcp_nopush activat;
tcp_nodelay activat;

open_file_cache max=200000 inactiv=20s;
open_file_cache_valid 120s;
open_file_cache_errors activat;

reset_timedout_connection activat;
client_body_timeout 10;
keepalive_timeout 65;

includ /etc/nginx/sites-enabled.*.conf

3. Configurarea http2

Nu voi descrie în detaliu configurarea secțiunii de server, deoarece am făcut deja acest lucru în articolul despre instalarea Nginx în Ubuntu și nu am nimic de adăugat aici, Configurare SSL Acesta este un subiect destul de larg și va fi discutat și într-un articol separat. Dar pentru a configura http2 trebuie să aveți deja SSL. Apoi, pur și simplu ajustați directiva listen în secțiunea serverului dvs.:

asculta 194.67.215.125:443 default_server;

ascultați 194.67.215.125:443 http2 default_server;

Ca aceasta într-un mod simplu puteți activa http2 dacă l-ați instalat înainte versiunea corecta Nginx.

4. Setarea Viteza paginii

Google Pagespeed este un modul Nginx care efectuează diverse optimizări pentru a se asigura că paginile se încarcă mai repede, serverul web rulează mai eficient și utilizatorii experimentează mai puțin disconfort. Aceasta include stocarea în cache, optimizarea cod html, optimizarea imaginii, combinarea javascript și cod cssși mult mai mult. Toate acestea se fac la nivel Nginx, deci este mai eficient decât dacă ați face-o în PHP. Dar există un dezavantaj: modulul elimină antetul Ultima modificare.

Faptul este că PageSpeed ​​​​setează o linie cache foarte lungă pentru toate fișierele și adaugă hash-ul său la numele fișierului. În acest fel, viteza de încărcare a resurselor este mult mai mare, deoarece browserul va solicita doar fișiere cu noul hash, iar LastModified este eliminat, astfel încât utilizatorii să poată vedea modificările dacă se modifică vreun fișier. Acum să vedem cum să instalăm modulul. Va trebui să-l construim din codul sursă.

Mai întâi instalați instrumentele pentru asamblare, este foarte important, dacă nu le instalați, atunci veți primi o eroare și nu veți ști ce să faceți:

yum install wget gcc cmake unzip gcc-c++ pcre-devel zlib-devel

Descărcați și extrageți sursele Nginx pentru versiunea dvs., de exemplu 1.13.3:

wget -c https://nginx.org/download/nginx-1.13.3.tar.gz
# tar -xzvf nginx-1.13.3.tar.gz

Setări serverul nginx nu include reasamblarea și înlocuirea programului din depozit, pur și simplu folosim aceste surse pentru a construi modulul. Descărcați și extrageți sursele PageSpeed:

wget -c https://github.com/pagespeed/ngx_pagespeed/archive/v1.12.34.2-stable.zip
# unzip v1.12.34.2-stable.zip

Descărcați și despachetați biblioteca de optimizare PageSpeed ​​în folderul cu sursele modulului:

cd ngx_pagespeed-1.12.34.2-stable/
# wget -c https://dl.google.com/dl/page-speed/psol/1.12.34.2-x64.tar.gz
# tar -xvzf 1.12.34.2-x64.tar.gz

Descărcați și despachetați sursele OpenSSL 1.02:

wget -c https://www.openssl.org/source/openssl-1.0.2k.tar.gz -O /opt/lib/$OPENSSL.tar.gz
# tar xvpzf openssl-1.0.2k.tar.gz

Acum trebuie să asamblam modulul. Mai întâi, uitați-vă la opțiunile cu care este construit actualul Nginx:

Acum să mergem la folderul cu Nginx, să înlocuim toate opțiunile primite, opțiunea --add-dynamic-module pentru PageSpeed, OpenSSL și să încercăm să construim:

cd nginx-1.13.3
# ./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx .conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx .pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache /nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path= /var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --cu-http_flv_module --cu-http_gunzip_module --cu-http_gzip_static_module --cu-http_mp4_module --cu-http_random_index_module --cu-http_realip_module --cu-http_secure_link_module --cu-http_slice_module -cu-http_slice_module-http_ ule --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt="- O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic" --cu- ld-opt= --with-openssl=$HOME/openssl-1.0.2k --add-dynamic-module=$HOME/ngx_pagespeed-1.12.34.2-stable $(PS_NGX_EXTRA_FLAGS)
# face

Dacă totul a fost făcut corect, atunci în ieșire veți primi modulul ngx_pagespeed.so în folderul obj, trebuie să îl copiați în folderul /etc/nginx/modules:

cp ngx_pagespeed.so /etc/nginx/modules/ngx_pagespeed.so

Creați un folder pentru cache:

mkdir -p /var/ngx_pagespeed_cache
# chown -R nginx:nginx /var/ngx_pagespeed_cache

Acum adăugați următoarea linie pentru a activa modulul în /etc/nginx/nginx.conf:

load_module „module/ngx_pagespeed.so”;

Bună, dragă utilizator Habrahabr. Discuția mea va fi despre cum să pregătim terenul pentru proiectele locale de dezvoltare web în sala de operație sistem Ubuntu 16.04.1 LTS.

În acest articol aș dori să risipesc și să clarific posibile dificultăți legate de instalarea și configurarea software-ului care este necesar pentru dezvoltare web modernă, pe care dezvoltatorii începători îl pot întâlni și nu numai.

Tehnologii care vor fi folosite în articol: nginx, php-fpm.

Înainte de a începe povestea, vreau să remarc că toate aceste acțiuni le-am făcut pe un sistem „gol”.
Voi lucra cu managerul de pachete aptitude. De asemenea, recomand să actualizați indexul pachetelor și pachetele în sine înainte de a instala software-ul. În acest articol vom face acești pași împreună.

Merge!

Instalarea unui manager de pachete aptitudini, index și actualizări de pachet

Instalare:

Sudo apt install aptitude
Actualizăm indexul.

Actualizare de aptitudini Sudo
Actualizăm pachetele (comanda va actualiza toate pachetele pentru care există versiuni noi; dacă pachetele trebuie eliminate, se va face).

Sudo aptitude complet upgrade

Instalare și configurare nginx(versiunea >= 1.10.0)

Instalăm.

Sudo aptitude instalează nginx
Hai să lansăm.

Serviciul Sudo nginx începe
Verificăm versiunea pentru a ne asigura că nu am instalat una veche, adică mai mică decât 1.10.0.

Instalarea și lansarea au fost finalizate, acum să mergem la directorul în care este instalat nginx-ul nostru și să ne uităm la structura acestuia. Directorul nginx se află pe această cale:

Cd /etc/nginx/
Puteți vizualiza conținutul unui director cu comanda ls cu steaguri -la va fi mai convenabil să vizualizați conținutul directorului (de fapt, această comandă cu steaguri specifice poate fi descrisă mai detaliat și mai precis, dar avem un alt subiect astăzi).

Ls-la
Suntem interesati de acest moment cele două directoare pe care le vedeți în captură de ecran. Acestea sunt directoarele disponibile pentru site-uri și site-urile activate.

Să mergem la directorul site-available și să începem configurarea gazdei noastre virtuale (site).

Cd /etc/nginx/sites-available
Înainte de a începe să creăm fișierul de configurare, să verificăm ce avem în acest director. In cazul meu, directorul nu este gol, contine deja fisiere de configurare, le-am sters ca sa nu va induc in eroare.

Digresiune importantă

În cazul instalării nginx „de la zero”, tocmai „de la zero”, de când dezinstalați nginx cu comanda
sudo apt-get remove nginx sau sudo apt remove nginx rămân fișierele de configurare și dacă brusc nu înțelegeți de ce nginx nu funcționează și doriți să-l reinstalați (de obicei, începătorii recurg la acest lucru utilizatorii Linux), atunci nici după reinstalare nu va funcționa corect, deoarece fișierele de configurare vechi (nu sunt șterse după eliminare cu comanda remove) conțin setări incorecte, acestea vor trebui șterse sau configurate corect, abia atunci nginx va funcționa.

Recomand ștergerea cu comanda sudo apt-get purge nginx sau sudo apt purge nginx. Dacă utilizați manager de pachete aptitudine, atunci comanda sudo aptitude purge nginx elimină întregul pachet cu toate dependențele și fișierele de configurare.


În acest director va exista un fișier implicit, numit implicit. Va contine un fisier de configurare cu un exemplu, cu comentarii, il poti studia dupa bunul plac, sau il poti sterge complet (poti oricand sa faci referire la documentatia oficiala).

Ls-la

Să ne creăm propriul fișier de configurare, care va corespunde numelui de domeniu al site-ului nostru local (sau unul real, dacă îi cunoașteți deja numele). Acest lucru este convenabil, în viitor, când există multe fișiere de configurare, vă va scuti de confuzie în ele. Pentru mine acest fișier se va numi project.local.

Sudo touch project.local
Să vedem ce s-a întâmplat.

Acum să-l deschidem în editor, îl voi deschide în nano.

Sudo nano project.local
Vedem că este gol. Acum să trecem la crearea fișierului nostru. Trebuie să aduceți configurația în formular așa cum este scris mai jos. Voi descrie doar directivele vitale ale acestui dosar, nu voi descrie restul, deoarece acest lucru nu este important în acest moment, la urma urmei, avem un subiect setări de bază. Aceste setări „diapozitive” sunt suficiente pentru a dezvolta proiecte la nivel local, nu numai mici, ci și destul de mari. În articolele următoare voi descrie separat fiecare dintre directivele utilizate (așa se numesc liniile, de exemplu server_name) din acest fișier.

Vedeți comentariile chiar în fișierul de configurare.

Server (ascultă 80; # port asculta pe nginx server_name project.local; # Numele domeniului legate de curent gazdă virtuală root /home/stavanger/code/project.local; # directorul în care se află proiectul, calea către indexul punctului de intrare index.php; # add_header Access-Control-Allow-Origin *; # serviți fișierele statice direct locația ~* \.(jpg|jpeg|gif|css|png|js|ico|html)$ ( access_log off; expiră max; log_not_found off; ) locație / ( # add_header Access-Control-Allow- Origine *; try_files $uri $uri/ /index.php?$query_string ) locație ~* \.php$ ( try_files $uri = 404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix :/var/run/php/php7.0-fpm.sock # conectați socketul php-fpm fastcgi_index.php SCRIPT_FILENAME $document_root$fastcgi_script_name include fastcgi_params;
Salvați fișierul. Acum trebuie să verificăm dacă există erori în el. Putem face asta ca o echipă.

Sudo nginx -t
Dacă vedem astfel de informații ca în captura de ecran, atunci totul este corect și putem continua configurarea. Dacă primiți erori, merită să verificați din nou fișierul de configurare.

Acum trebuie să activăm fișierul de configurare, în directorul /etc/nginx/sites-enabled/ trebuie să creăm un link simbolic ( legătură simbolică). Dacă ați instalat nginx de la zero, atunci în acest director există un link simbolic către fișierul implicit, despre care a fost discutat mai sus, îl puteți șterge dacă nu aveți nevoie de el. Accesați directorul dorit.

Cd /etc/nginx/sites-enabled/
Acum suntem în directorul potrivit. Să creăm linkul nostru simbolic. Pentru a crea, utilizați comanda ln cu indicatorul -s, apoi vom indica calea către proiectul nostru.config local.

Sudo ln -s /etc/nginx/sites-available/project.local
Să ne uităm la linkul simbolic creat.

Pentru a ne asigura că încă facem totul corect, să rulăm din nou comanda.

Fişier gazde

Acest fișier se află la /etc/hosts. Prezența intrărilor în acesta vă permite să rulați nginx folosind localhost ca domeniu. În acest fișier puteți atribui aliasuri alternative, de exemplu pentru proiectul nostru project.local, vom atribui domeniul project.local.

Deschideți fișierul în editorul nano.

Sudo nano /etc/hosts
Veți avea alte informații în acest fișier, ignorați-l. Trebuie doar să adăugați o linie ca în captura mea de ecran.

Instalare php-fpm (>=7.0)

sudo aptitude instalează php-fpm
Control versiunea instalată, pentru orice eventualitate, deși în Ubuntu 16.04.1 versiunea 7.0 este în depozite.

PHP-fpm7.0 -v

Să ne asigurăm că totul este în regulă. Să începem php-fpm.

Serviciul Sudo php7.0-fpm începe
Dacă editați configurațiile, nu uitați să reporniți demonul. Așa face. Dar nu vom avea nevoie.

Reporniți serviciul Sudo php7.0-fpm
Aceasta finalizează instalarea și configurarea php-fpm. Într-adevăr, asta-i tot. Aceasta nu este magică calea către socket-ul php-fpm a fost deja specificată în fișierul de configurare. Desigur, este posibil să aveți nevoie de câteva extensii php pentru dezvoltare proiecte personale, dar le puteți furniza așa cum sunt necesare.

Acum să mergem la directorul cu proiectul nostru, îl am pe această cale.

Cd /home/stavanger/code/project.local
Să mergem la directorul de mai sus și să facem permisiunile 777 (adică vom face drepturi depline director cu proiectul nostru de proiect.local). Acest lucru ne va scuti de probleme inutile în viitor.

Cd .. sudo chmod -R 777 proiect.local
Aceasta completează configurarea software-ului, să creăm un fișier de test în directorul nostru de lucru project.local și să ne asigurăm că totul funcționează. Voi crea un fișier index.php cu acest conținut.

Mergem la browser și vedem că totul funcționează excelent pentru noi! interpret PHP inclusiv.

În ceea ce privește cititorii, Stavanger.

14 august 2009 la 19:29

Configurarea nginx

  • Nginx

Subiectul configurării corecte a nginx este foarte mare și, mă tem, nu se poate încadra în cadrul unui articol despre Habré. În acest text am încercat să vorbesc despre structura generală a configurației, detalii și detalii mai interesante pot apărea mai târziu. :)

Un bun punct de plecare pentru configurarea nginx este configurația care vine cu distribuția, dar multe dintre capabilitățile acestui server nici măcar nu sunt menționate în el. Un exemplu mult mai detaliat este pe site-ul lui Igor Sysoev: sysoev.ru/nginx/docs/example.html. Totuși, să încercăm mai bine să ne construim configurația de la zero, cu bridge și poeteses. :)

Să începem cu setările generale. În primul rând, vom indica utilizatorul în numele căruia va rula nginx (este rău să funcționeze ca root, toată lumea știe :))

Acum, să spunem lui nginx câte procese de lucru să apară. De obicei, un număr de procese egal cu numărul de nuclee de procesor de pe serverul dvs. este o alegere bună, dar merită să experimentați cu această setare. Dacă se așteaptă o sarcină mare pe hard disk, puteți face un proces pentru fiecare hard disk fizic, deoarece toată munca va fi încă limitată de performanța sa.

Lucrător_procese 2;

Să clarificăm unde să scriem jurnalele de erori. Apoi, pentru serverele virtuale individuale, acest parametru poate fi suprascris, astfel încât în ​​acest jurnal să apară doar erori „globale”, de exemplu, legate de pornirea serverului.

Notificare Error_log /spool/logs/nginx/nginx.error_log; # Nivelul de notificare „notificare” poate fi desigur modificat

Acum vine secțiunea „evenimente” foarte interesantă. În acesta puteți seta numărul maxim de conexiuni pe care un proces de lucru le va procesa simultan și metoda care va fi utilizată pentru a primi notificări asincrone despre evenimentele din sistemul de operare. Desigur, puteți selecta doar acele metode care sunt disponibile pe sistemul de operare și au fost incluse în timpul compilării.

Aceste setări pot avea un impact semnificativ asupra performanței serverului dvs. Acestea trebuie selectate individual, în funcție de sistemul de operare și hardware. Pot să dau doar câteva reguli generale.

Module pentru lucrul cu evenimente:
- select și poll sunt de obicei mai lente și încarcă procesorul destul de greu, dar sunt disponibile aproape peste tot și funcționează aproape întotdeauna;
- kqueue și epoll - mai eficiente, dar disponibile numai pe FreeBSD și, respectiv, Linux 2.6;
- rtsig este o metodă destul de eficientă și este suportată chiar și de Linux-uri foarte vechi, dar poate cauza probleme cu un număr mare de conexiuni;
- /dev/poll - din câte știu eu, funcționează în sisteme ceva mai exotice, precum Solaris, și este destul de eficient acolo;

parametrul worker_connections:
- Numărul maxim total de clienți serviți va fi egal cu worker_processes * worker_connections;
- Uneori, chiar și cele mai extreme valori pot funcționa pozitiv, cum ar fi 128 de procese, 128 de conexiuni per proces sau 1 proces, dar cu parametrul worker_connections=16384. În acest din urmă caz, totuși, cel mai probabil va trebui să reglați sistemul de operare.

Evenimente (
conexiuni_muncitor 2048;
utilizați kqueue; # Avem BSD :)
}

Următoarea secțiune este cea mai mare și conține cele mai interesante lucruri. Aceasta este o descriere a serverelor virtuale și a unor parametri comuni tuturor acestora. Voi omite setările standard care sunt în fiecare configurație, cum ar fi căile către jurnale.

HTTP(
# Tot codul de mai jos va fi în această secțiune %)
# ...
}

În această secțiune pot exista niște parametri destul de interesanți.

Apelul de sistem sendfile este relativ nou pentru Linux. Vă permite să trimiteți date în rețea fără a fi nevoie să le copiați în spațiul de adrese al aplicației. În multe cazuri, acest lucru îmbunătățește semnificativ performanța serverului, așa că cel mai bine este să activați întotdeauna opțiunea sendfile.

Parametrul keepalive_timeout este responsabil pentru timpul maxim de menținere a unei conexiuni keepalive dacă utilizatorul nu solicită nimic pentru aceasta. Luați în considerare modul în care site-ul dvs. trimite solicitări și ajustați această setare. Pentru site-urile care folosesc activ AJAX, este mai bine să păstrați conexiunea mai mult timp pentru paginile statice pe care utilizatorii le vor citi mult timp, este mai bine să întrerupeți conexiunea mai devreme; Rețineți că, menținând o conexiune keepalive inactivă, luați o conexiune care ar putea fi utilizată diferit. :)

Keepalive_timeout 15;

Separat, merită evidențiate setările proxy nginx. Cel mai adesea, nginx este folosit tocmai ca server proxy, deci sunt destul de importante. În special, este logic să setați dimensiunea tamponului pentru cererile proxy nu mai puțin decât dimensiunea de răspuns așteptată de la serverul backend. Cu backend-uri lente (sau, dimpotrivă, foarte rapide), este logic să schimbați intervalele de timp pentru așteptarea unui răspuns din partea backend-ului. Amintiți-vă, cu cât aceste timeout-uri sunt mai lungi, cu atât utilizatorii dvs. vor aștepta mai mult un răspuns dacă backend-ul este lent.

Proxy_buffers 8 64k;
proxy_intercept_errors activat;
proxy_connect_timeout 1s;
proxy_read_timeout 3s;
proxy_send_timeout 3s;

Un mic truc. În cazul în care nginx servește mai mult de o gazdă virtuală, este logic să se creeze o „gazdă virtuală implicită” care va procesa cererile în cazurile în care serverul nu poate găsi o altă alternativă folosind antetul Host din cererea clientului.

# gazdă virtuală implicită
Server (
asculta 80 implicit;
nume_server gazdă locală;
nega totul;
}

Aceasta poate fi urmată de una (sau mai multe) secțiuni „server”. Fiecare dintre ele descrie o gazdă virtuală (cel mai adesea, bazată pe nume). Pentru proprietarii mai multor site-uri pe o singură găzduire sau pentru hosteri, poate exista ceva de genul unei directive

Includeți /spool/users/nginx/*.conf;

Restul va descrie cel mai probabil gazda lor virtuală direct în configurația principală.

Server (
asculta 80;

# Vă rugăm să rețineți că directiva server_name poate specifica mai multe nume în același timp.
nume_server myserver.ru myserver.com;
access_log /spool/logs/nginx/myserver.access_log cronometrat;
error_log /spool/logs/nginx/myserver.error_log warn;
# ...

Să setăm codarea implicită pentru ieșire.

Charset utf-8;

Și să spunem că nu vrem să acceptăm cereri de la clienți care au o lungime mai mare de 1 megaoctet.

Client_max_body_size 1m;

Să activăm SSI pentru server și să cerem să rezervăm nu mai mult de 1 kilobyte pentru variabilele SSI.

Si on;
ssi_value_length 1024;

Și, în final, vom descrie două locații, dintre care una va duce la backend, la Apache care rulează pe portul 9999, iar a doua va trimite imagini statice din sistemul de fișiere local. Pentru două locații, acest lucru nu are sens, dar pentru un număr mai mare dintre ele are sens, de asemenea, să definiți imediat o variabilă în care va fi stocat directorul rădăcină a serverului și apoi să o utilizați în descrierile locațiilor.

Nginx este un server web și un proxy de e-mail care este disponibil public din 2004. Dezvoltarea proiectului a început în 2002 în limba rusă, numele sună ca engine-ex. Fiind creația celebrului programator Igor Sysoev, Nginx a fost inițial destinat companiei Rambler. Este conceput pentru sistemele de operare aparținând grupului Unix-like. Ansamblul a fost testat cu succes pe OpenBSD, FreeBSD, Linux, Mac OS X, Solaris. Pe platforma Microsoft Windows, Nginx a început să lucreze odată cu apariția versiunii de asamblare binar 0.7.52.

Statisticile pentru martie 2011 indică faptul că numărul de site-uri deservite de Nginx a depășit deja pragul de 22 de milioane. Astăzi, Nginx este folosit de proiecte cunoscute precum Rambler, Begun, Yandex, SourceForge.net, WordPress.com, vkontakte.ru și altele. Alături de lighttpd, Nginx este folosit pentru a servi conținut static generat de o aplicație web „incomodă” care funcționează „sub autoritatea” unui alt server web.
Dar înainte de a pătrunde în jungla caracteristicilor funcționale ale lui Nginx, ar fi util să ne amintim ce este un server web în general și un server proxy în special.

Server web și server proxy

server web este un server care acceptă solicitări HTTP de la browsere web și alți clienți și emite răspunsuri HTTP la acestea. Acestea din urmă sunt de obicei reprezentate de o pagină HTML, flux media, imagine, fișier sau alte date. Un server web se referă atât la software care îndeplinește funcții de server web, cât și la hardware. Schimbul de date și informații solicitate se realizează prin protocolul HTTP.

Lista de funcții suplimentare ale serverelor web include: autorizarea și autentificarea utilizatorilor, înregistrarea accesului acestora la resurse, suport HTTPS pentru comunicații securizate cu clienții și altele. Cel mai des folosit server web pe sisteme de operare asemănătoare Unix este Apache. Nginx ocupă în prezent locul trei în lista preferințelor clienților.

Server proxy permite clienților să facă indirect cereri de căutare către serviciile de rețea. Adică, este un server specializat în redirecționarea cererilor clienților către alte servere. Conectându-se la un server proxy și solicitând o resursă situată pe un alt server, clientul are posibilitatea de a păstra anonimatul și de a proteja computerul de atacurile de rețea. Serverul proxy furnizează clientului datele solicitate fie din propriul cache (dacă există), fie prin primirea lor de la serverul specificat. În unele cazuri (pentru a atinge obiectivele de mai sus), răspunsul serverului, precum cererea clientului, poate fi schimbat de serverul proxy.

Cel mai simplu server proxy este Network Address Translator sau NAT. În 2000, proxy NAT a fost integrat în distribuția Windows. Serverele proxy, ca orice fenomen, au două fețe ale monedei, adică pot fi folosite atât pentru bine, cât și pentru rău. De exemplu, cu ajutorul lor, cei care se tem de sancțiuni pentru acțiunile lor nepotrivite online își ascund adresele IP...

Gama funcțională Nginx:

  • întreținerea pe server a fișierelor index, interogări statice, generarea de descriptori cache a fișierelor deschise, listă de fișiere;
  • proxy accelerat, distribuție elementară a sarcinii, toleranță la erori;
  • suport pentru cache în timpul proxy-ului accelerat și FastCGI;
  • suport pentru FastCGI (accelerat) și servere memcached;
  • modularitate, filtre, inclusiv reluare (interval de octeți) și compresie (gzip);
  • Autentificare HTTP, răspunsuri fragmentate, filtru SSI;
  • executarea paralelă a mai multor subinterogări pe o pagină procesată prin FastCGI sau un proxy în filtrul SSI;
  • Suport StartTLS și SSL;
  • capacitatea de a suporta Perl încorporat;
  • autentificare simplă (UTILIZATOR/PASS, LOGIN);
  • redirecționarea serverului (proxy IMAP/POP3) a utilizatorului către backend-ul IMAP/POP3 utilizând un server de autentificare extern (HTTP).

Pentru cei care nu sunt familiarizați cu această terminologie, descrierea funcționalității Nginx poate părea foarte vagă. Dar când vorbim despre modalitățile specifice de utilizare a acestui server web, acesta va începe treptat să se disipeze.

Arhitectură și configurație

Procesele de lucru din Nginx servesc simultan mai multe conexiuni, oferindu-le apeluri cu OS (sistem de operare) epoll (Linux), select și kqueue (FreeBSD). Datele primite de la client sunt analizate folosind o mașină de stări. Cererea analizată este procesată de un lanț de module specificat de configurare. Răspunsul către client este generat în buffere, care pot indica o secțiune a unui fișier sau pot stoca date în memorie. Secvența transferului de date către client este determinată de lanțurile în care sunt grupate tampoanele.

Din punct de vedere structural, serverul HTTP Nginx este împărțit în servere virtuale, care la rândul lor sunt împărțite în locații. Un server virtual sau o directivă poate fi specificat cu porturi și adrese pentru primirea conexiunilor. Pentru locație, puteți specifica un URI exact, o parte dintr-un URI sau o expresie obișnuită. Pentru gestionarea memoriei online, se folosesc pool-uri, care sunt o secvență de blocuri de memorie preselectate. Un bloc, alocat inițial pentru pool, are o lungime de la 1 la 16 kilobytes. Este împărțit în zone - ocupate și neocupate. Pe măsură ce acesta din urmă se umple, alocarea unui nou obiect este asigurată de formarea unui nou bloc.

Clasificarea geografică a clienților după adresa lor IP se realizează în Nginx folosind un modul special. Sistemul de arbore Radix vă permite să lucrați rapid cu adrese IP, ocupând un minim de memorie.

Beneficiile Nginx

Nginx este considerat un server HTTP foarte rapid. În loc de Apache sau împreună cu acesta, Nginx este folosit pentru a accelera procesarea cererilor și pentru a reduce sarcina pe server. Faptul este că majoritatea utilizatorilor nu au nevoie de capabilitățile enorme inerente arhitecturii modulare Apache. Trebuie să plătiți pentru această funcționalitate nerevendicată cu un consum semnificativ de resurse de sistem. Site-urile obișnuite, de regulă, sunt caracterizate de o „dominare” clară a fișierelor statice (imagini, fișiere de stil, JavaScript), mai degrabă decât de scripturi. Nu este necesară nicio funcționalitate specială pentru a transfera aceste fișiere către un vizitator de resurse, deoarece sarcina este foarte simplă. Aceasta înseamnă că serverul web pentru procesarea unor astfel de solicitări trebuie să fie simplu și ușor, precum Nginx.

Modalități de utilizare a Nginx

Pe un port/IP separat. Dacă resursa este saturată cu imagini sau fișiere pentru descărcare, Nginx poate fi configurat pe un port sau IP separat și să distribuie conținut static prin intermediul acestuia. Pentru a face acest lucru, va trebui, totuși, să schimbați puțin link-urile de pe site. Dacă există un număr mare de solicitări către fișiere statice, este logic să creați un server separat și să instalați Nginx pe el.

Proxy accelerat. Cu această opțiune, toate solicitările vizitatorilor ajung mai întâi la Nginx. Nginx procesează cererile de fișiere statice (de exemplu, o imagine, un fișier HTML simplu, JavaScript sau CSS) în mod independent. Dacă un utilizator accesează un anumit script, el va redirecționa solicitarea către departamentul Apache. Nu este nevoie să faceți nicio transformare cu codul site-ului.

Dacă canalul de la server la vizitator și invers este lent, această utilizare a Nginx poate da un efect suplimentar. Nginx trece cererea primită de la vizitator către Apache pentru procesare. După procesarea cererii, Apache redirecționează pagina către Nginx și încheie conexiunea cu un sentiment de realizare. Nginx poate trimite acum o pagină unui utilizator atât timp cât dorește, practic fără a consuma resurse de sistem. Lucrarea Apache în locul său ar fi însoțită de o încărcare nerezonabilă a memoriei atunci când rulează aproape inactiv. Apropo, acest caz de utilizare pentru Nginx are alt nume: "frontend către Apache".

Nginx plus FastCGI. Apache poate să nu fie deloc necesar dacă interpretul limbii în care sunt scrise scripturile site-ului acceptă tehnologia FastCGI. Astfel de limbi includ, de exemplu, PHP, Perl și o serie de altele. Cu toate acestea, în acest caz, poate fi necesar să modificați codurile de script.

Există multe materiale detaliate despre cum să instalați și să configurați Nginx pe Internet. Puteți afla mai multe despre Nginx pe site-ul web al dezvoltatorului său Igor Sysoev.

Nginx este un server web popular și puternic și un proxy invers.

Nginx are multe avantaje, dar setările sale sunt destul de complexe și nu întotdeauna clare pentru începători. Acest ghid vă va ajuta să înțelegeți parametrii de bază, sintaxa și fișierele de configurare ale lui Nginx.

Notă: Acest tutorial a fost realizat pe Ubuntu 12.04.

Ierarhia directorului Nginx

Nginx stochează fișierele de configurare în directorul /etc/nginx.

Acest director conține mai multe directoare și fișiere de configurare modulare.

cd /etc/nginx
ls -F

conf.d/ koi-win naxsi.rules scgi_params uwsgi_params
fastcgi_params mime.types nginx.conf site-available/win-utf
koi-utf naxsi_core.rules proxy_params site-uri activate/

Utilizatorii Apache sunt deja familiarizați cu directoarele disponibile pentru site-uri și site-uri activate. Aceste directoare definesc configurațiile site-ului. Fișierele sunt de obicei create și stocate în site-uri disponibile; site-uri activate stochează numai configurațiile site-urilor activate. Pentru a face acest lucru, trebuie să creați un link simbolic de la site-uri disponibile la site-uri activate.

Directorul conf.d poate fi folosit și pentru a stoca configurații. Fiecare fișier cu o extensie .conf va fi citit când Nginx pornește. Sintaxa unor astfel de fișiere nu trebuie să conțină erori.

Aproape toate fișierele rămase sunt stocate în /etc/nginx, care conține informații de configurare pentru anumite procese sau componente suplimentare.

Fișierul principal de configurare Nginx este nginx.conf.

fișierul nginx.conf

Fișierul nginx.conf citește fișierele de configurare corespunzătoare și le combină într-un singur fișier de configurare atunci când serverul pornește.

Deschideți fișierul:

sudo nano /etc/nginx/nginx.conf

utilizator www-data;
lucrător_procese 4;
pid /var/run/nginx.pid;
evenimente (
conexiuni_muncitor 768;
#multi_accept pe;
}
http(
. . .

Primele rânduri oferă informații generale despre Nginx. Utilizatorul de linie www-data specifică utilizatorul cu care este pornit serverul.

Directiva pid specifică unde vor fi stocate PID-urile procesului pentru uz intern. Linia worker_processes determină numărul de procese pe care Nginx le poate suporta simultan.

De asemenea, puteți specifica jurnalele în această parte a fișierului (de exemplu, jurnalul de erori este definit folosind directiva error_log).

Urmează informațiile generale despre server se află secțiunea de evenimente. Acesta gestionează gestionarea conexiunilor Nginx. Este urmat de blocul http. Înainte de a continua cu configurațiile serverului web, trebuie să înțelegem cum este formatat fișierul de configurare Nginx.

Structura fișierului de configurare Nginx

Fișierul de configurare Nginx este împărțit în blocuri.

Primul bloc este evenimente, urmat de http și începe ierarhia principală a configurațiilor.

Detaliile de configurare ale unui bloc http sunt stratificate folosind blocuri închise care moștenesc proprietăți de la blocul în care se află. Blocul http stochează majoritatea configurațiilor generale Nginx, care sunt împărțite în blocuri de server, care la rândul lor sunt împărțite în blocuri de locații.

Când configurați Nginx, este important să rețineți următoarea regulă: cu cât este mai mare nivelul de configurare, cu atât mai multe blocuri moștenesc această configurație; cu cât nivelul de configurare este mai scăzut, cu atât este mai „individual”. Adică, dacă parametrul X trebuie utilizat în fiecare bloc de server, atunci un astfel de parametru trebuie plasat în blocul http.

Dacă te uiți cu atenție la fișier, vei observa că acesta conține multe opțiuni care determină comportamentul programului în ansamblu.

De exemplu, pentru a configura compresia fișierelor, trebuie să setați următorii parametri:

gzip on;
gzip_disable „msie6”;

Aceasta va activa suportul gzip pentru comprimarea datelor trimise către client și va dezactiva gzip pentru Internet Explorer 6 (deoarece acest browser nu acceptă comprimarea datelor).

Dacă un parametru ar trebui să aibă o valoare diferită în mai multe blocuri de server, atunci un astfel de parametru poate fi setat la cel mai înalt nivel și apoi suprascris în blocurile de server în sine. Ca rezultat, Nginx va executa parametrul de cel mai jos nivel.

Această stratificare a configurațiilor evită nevoia de a gestiona mai multe fișiere identice. De asemenea, dacă uitați să definiți opțiuni la un nivel inferior, Nginx va implementa pur și simplu opțiunile implicite.

Blocul http din fișierul nginx.conf se termină astfel:

includ /etc/nginx/conf.d/*.conf;
includ /etc/nginx/sites-enabled/*;

Aceasta înseamnă că blocurile de server și locație, care definesc setările pentru anumite site-uri și adrese URL, vor fi stocate în afara acestui fișier.

Acest lucru permite o arhitectură de configurare modulară în care pot fi create noi fișiere pentru a servi site-uri noi. De asemenea, vă permite să grupați fișiere similare.

Închideți fișierul nginx.conf. Acum trebuie să studiați setările site-urilor individuale.

Blocuri virtuale Nginx

Blocurile de server din Nginx sunt analoge cu gazdele virtuale Apache (dar pentru comoditate, ele sunt numite și gazde virtuale). În esență, blocurile de server sunt caracteristicile tehnice ale site-urilor web individuale găzduite pe un singur server.

În directorul site-uri disponibile puteți găsi fișierul implicit de blocare a serverului care vine cu serverul. Acest fisier contine toate datele necesare intretinerii site-ului.

site-uri cd-disponibile
sudo nano implicit

root /usr/share/nginx/www;
index index.html index.htm;
nume_server gazdă locală;
Locație/(

}
locație /doc/ (

alias /usr/share/doc/;
autoindex activat;
permite 127.0.0.1;
nega totul;

Fișierul implicit este foarte bine comentat, dar în exemplul de mai sus comentariile sunt omise pentru simplitate și comoditate.

Blocul server include toate setările plasate între acolade:

Server (
. . .
}

Acest bloc este plasat în fișierul nginx.conf aproape de sfârșitul blocului http folosind directiva include.

Directiva rădăcină specifică directorul în care va fi stocat conținutul site-ului. Nginx va căuta în acest director fișierele solicitate de utilizator. În mod implicit, acesta este /usr/share/nginx/www.

Vă rugăm să rețineți: toate liniile se termină cu punct și virgulă. Acesta este modul în care Nginx separă o directivă de alta. Dacă nu există punct și virgulă, Nginx va citi cele două directive (sau mai multe directive) ca o singură directivă cu argumente suplimentare.

Directiva index specifică fișierele care vor fi folosite ca index. Serverul web va verifica fișierele în ordinea în care sunt listate. Dacă nu a fost solicitată nicio pagină, blocul serverului va găsi și va returna fișierul index.html. Dacă nu poate găsi acel fișier, va încerca să proceseze index.htm.

directiva nume_server

Directiva server_name conține o listă de nume de domenii care vor fi servite de acest bloc de server. Numărul de domenii este nelimitat; domeniile din listă trebuie separate prin spații.

Un asterisc (*) la începutul sau la sfârșitul unui domeniu specifică un nume cu o mască, unde asteriscul se potrivește cu o parte (sau mai multe părți) din nume. De exemplu, numele *.example.com se potrivește cu numele forum.example.com și www.animals.example.com.

Dacă adresa URL solicitată se potrivește cu mai multe directive server_name, va răspunde mai întâi cu cea care se potrivește exact.

Dacă adresa nu găsește potriviri, va căuta cel mai lung nume mascat care se termină cu un asterisc. Dacă nu găsește un astfel de nume, va returna prima potrivire a expresiei regulate.

Numele de server care folosesc expresii regulate încep cu un tilde (~). Din păcate, acest subiect depășește scopul acestui articol.

Blocuri de locație

Locația/linia indică faptul că directivele din paranteze se vor aplica tuturor resurselor solicitate care nu se potrivesc cu niciun alt bloc de locație.

Astfel de blocuri pot conține o cale uri (de exemplu /doc/). Pentru a stabili o potrivire completă între locație și uri, se folosește simbolul =. Caracterul ~ se potrivește cu expresiile regulate.

Un tilde activează modul diferențiat între majuscule și minuscule, în timp ce un tilde cu un asterisc activează modul care nu ține seama de majuscule.

Dacă cererea se potrivește pe deplin cu blocul de locație, atunci serverul oprește căutarea și folosește un astfel de bloc. Dacă serverul nu găsește un bloc de locație care se potrivește complet, compară URI-ul cu parametrii directivelor de locație. Nginx va selecta un bloc care folosește combinația de caractere ^~ și care se potrivește cu URI.

Dacă opțiunea ^~ nu este utilizată, Nginx va selecta cea mai apropiată potrivire și va efectua o căutare a expresiei regulate pentru a încerca să se potrivească cu unul dintre modelele disponibile. Dacă găsește o astfel de expresie, o folosește. Dacă nu există o astfel de expresie, atunci serverul utilizează potrivirea URI găsită anterior.

Ca o notă finală, Nginx preferă potrivirile exacte. Dacă nu există astfel de potriviri, caută o expresie regulată și apoi caută URI. Pentru a schimba prioritatea de căutare a unui URI, utilizați combinația de caractere ^~.

directiva try_files

Directiva try_files este un instrument foarte util care verifică fișierele într-o anumită ordine și utilizează primul fișier găsit pentru a procesa cererea.

Acest lucru vă permite să utilizați parametri suplimentari pentru a defini modul în care Nginx va servi cererile.

Fișierul de configurare implicit are linia:

try_files $uri $uri/ /index.html;

Aceasta înseamnă că atunci când se primește o solicitare care este servită de un bloc de locație, Nginx va încerca mai întâi să servească uri ca fișier (acest comportament este specificat de variabila $uri).

Dacă serverul nu găsește o potrivire pentru variabila $uri, va încerca să folosească uri ca director.

Folosind o bară oblică finală, serverul verifică existența unui director, de exemplu $uri/.

Dacă nu este găsit niciun fișier sau director, Nginx execută fișierul implicit (în acest caz index.html în directorul rădăcină al blocului server). Fiecare directivă try_files folosește ultimul parametru ca alternativă, deci fișierul trebuie să existe în sistem.

În cazul în care serverul web nu găsește o potrivire în parametrii anteriori, poate returna o pagină de eroare. Pentru a face acest lucru, utilizați semnul egal și codul de eroare.

De exemplu, dacă locația/blocul nu poate găsi resursa solicitată, ar putea returna o eroare 404 în loc de un fișier index.html:

try_files $uri $uri/ =404;

Pentru a face acest lucru, trebuie să puneți un semn egal și să setați codul de eroare ca ultimul parametru (=404).

Opțiuni suplimentare

Directiva alias permite Nginx să servească pagini de blocare a locației în afara unui director dat (de exemplu, în afara rădăcină).

De exemplu, fișierele solicitate din /doc/ vor fi difuzate din /usr/share/doc/.

Directiva autoindex on vă permite să activați listarea directoarelor Nginx pentru o anumită directivă de locație.

Liniile de autorizare și refuzare controlează accesul la directoare.

Concluzie

Serverul web Nginx este bogat în funcții și foarte puternic, dar terminologia și opțiunile sale pot fi confuze.

Odată ce înțelegeți configurațiile Nginx și învățați cum să lucrați cu ele, veți beneficia de toate beneficiile acestui instrument puternic și ușor.

Etichete: ,