Green Myshko introducerea Nginx, Partea 1
Ce este Nginx atât de bun și de ce a fost atât de pasionat de administratori de sarcină mare? De ce să nu folosim doar Apache?
De ce Apache - rău?
Mai întâi trebuie să explice modul în care să lucreze la toate serverele de rețea. Cei care sunt familiarizați cu programarea de rețea, știu că, de fapt, există trei modele de server:
- Secvențială. Serverul se deschide un socket de ascultare, și așteaptă apare conexiunea (în timp ce așteaptă este în poziția blocat). Când vine vorba de conexiunea, serverul procesează în același context, se închide conexiunea și apoi așteaptă o conexiune. Evident, acest lucru nu este cel mai bun mod, mai ales atunci când se lucrează cu clienții se desfășoară pentru o lungă perioadă de timp și o mulțime de conexiuni. În plus, modelul consecvent există încă multe neajunsuri (de exemplu, incapacitatea de a utiliza mai multe procesoare), și în termeni reali aproape niciodată nu este folosit.
- Multiprocesare (multithreaded). Serverul se deschide un socket de ascultare. Când vine vorba de conexiunea, el este nevoie, și apoi creează (sau alege dintr-un bazin de pre-create), un nou proces sau fir, care poate fi timp arbitrar mult timp pentru a lucra cu compusul, iar după terminarea lucrărilor sau pentru a reveni la piscina. Firul principal, între timp, este gata să accepte o nouă conexiune. Acesta este cel mai popular model deoarece este relativ ușor de implementat, vă permite să efectuați calcule complexe și de durată pentru fiecare client și de a folosi toate procesoarele disponibile. Un exemplu de utilizare a acestuia - Apache Web-server. Cu toate acestea, această abordare are dezavantajele sale: numărul mare de conexiuni concurente a creat o mulțime de fluxuri (sau, mai rău, procese), iar sistemul de operare petrece o mulțime de resurse pe switch-uri de context. Mai ales atunci când clienții rău sunt foarte lent pentru a adopta conținut. Primește sute de fire sau procese implicate doar trimiterea datelor clienților lent, ceea ce creează o povară suplimentară asupra planificatorul sistemului de operare, crește numărul de întreruperi și consumă foarte multă memorie.
- Non-blocare prize / mașină de stat. Serverul se execută într-un singur fir, dar utilizează prize non-blocare și mecanismul de votare. Ie server de pe fiecare iterație buclă fără sfârșit selectează toate priza, care este gata pentru primirea / trimiterea de date prin apel select (). După selectarea socket, serverul trimite date sau a le citi, dar nu așteptați pentru o confirmare și se mută la starea inițială și așteaptă evenimentul într-o altă priză sau procesează următoare, în care a avut loc evenimentul în timpul tratamentului anterior. Acest model este o utilizare foarte eficientă a procesorului și a memoriei, dar este destul de complicat să pună în aplicare. Mai mult decât atât, în acest model, eveniment de manipulare pe un soclu ar trebui să apară foarte repede - în caz contrar, coada se va acumula o mulțime de evenimente, iar în final se va îneca. Este pentru acest model funcționează Nginx. Mai mult decât atât, acesta permite să ruleze mai multe procese de lucru (așa-numitele lucrători), adică Se poate utiliza mai multe procesoare.
Deci, imaginați-vă următoarea situație: pe canalul HTTP-server de 1 Gbit / s la 200 de clienți conectați la canalul de 256 kbit / s:
Ce se întâmplă în cazul Apache? Se creează 200 fire / procese care sunt genereaza relativ repede continut (acesta poate fi atât pagini dinamice și fișiere statice de pe disc citit), dar da încet clienții săi. Sistemul de operare trebuie să facă față cu o mulțime de fire și I / O blocare.
Nginx în această situație își petrece pe fiecare comandă de conectare de mărime mai puține resurse sistemul de operare și memorie. Cu toate acestea, există dezvăluit un model limitat Nginx de rețea: nu poate genera conținut dinamic în interiorul vostru, deoarece acest lucru va duce la blocaje în interiorul Nginx. Desigur, există o soluție: Nginx este în măsură să proxy aceste cereri (cu privire la generarea de conținut) la orice alt server Web (de exemplu, aceeași Apache) sau la server FastCGI.
Luați în considerare mecanismul de ligamente Nginx servi ca server „principal“, Apache și ca un server pentru generarea de conținut dinamic:
Nginx acceptă conexiunea de la client și de citit din ea întreaga interogare. Aici trebuie remarcat faptul că, deși nginx nu a citit întreaga cerere, nu da la „tratament“. Din această cauză, de obicei, „sparte“ practic toți indicatorii de fișiere progres de descărcare - cu toate acestea, este posibil să-l repara cu ajutorul unui modul upload_progress terță parte (acest lucru va necesita aplicatii de modificare).
Odată ce Nginx citit răspunsul întreg, se deschide o conexiune la Apache. Ultimul post realizat (generează conținut dinamic), și apoi dă răspunsul său la Nginx ar putea, că agenții tampon în memorie sau un fișier temporar. Între timp, Apache eliberează resursele.
Nginx următor dă încet conținut la client, în timp ce cheltuielile pe ordinea de mai puține resurse decât Apache.
Acest sistem se numește frontend + backend (frontend + backend) și este folosit foarte des.
pentru că Nginx este doar începutul pentru a câștiga popularitate, există unele probleme cu pachete binare, astfel încât să fie pregătit pentru faptul că va trebui să vă compilați. Asta e, de obicei, nici o problema, trebuie doar să citiți cu atenție producția de --help ./configure și selectați opțiunile de compilare necesare, cum ar fi acestea:
Fișierul de configurare
fișier de configurare Nginx este foarte ușor de utilizat și intuitiv. acesta este de obicei numit nginx.conf și este plasat pe un prefix $ / conf / dacă locația nu a fost înlocuită de compilator. Îmi place să-l pună în / etc / Nginx /, și, de asemenea, face dezvoltatorii toate pachetele menționate mai sus.
Structura fișierului de configurare este după cum urmează:
Rețineți că fiecare directivă trebuie să se termine cu punct și virgulă.
proxy inversă și FastCGI
Deci, ne-am uitat la schema de beneficii de mai sus + backend front-end, sa ocupat de instalare, structura și sintaxa fișierului de configurare, luați în considerare tepet cum să pună în aplicare un proxy inversă în Nginx.
Este foarte simplu! Ca aceasta:
În acest exemplu, toate cererile care intră în locația / va fi aproximat la serverul 1.2.3.4 portul 8080. Acesta poate fi la fel de apache, sau orice alt http-server.
configurația Nginx, în acest caz, este după cum urmează:
O altă opțiune backend - este de a utiliza FastCGI. În acest caz configurație Nginx va arăta astfel:
# Din cauza faptului că lokeysheny cu expresii regulate au o „prioritate“ mai mare aici nu va primi cereri de toate-php.
Pentru a backend de sarcină mai mici, fișiere statice mai bune pentru a da doar prin Nginx - el se descurcă cu această sarcină mai bine, pentru că pentru fiecare cerere se petrece în mod considerabil mai puține resurse (nu este nevoie pentru a genera un nou proces, dar procesul de Nginx consumă mai puțină memorie, de obicei, și poate servi mai multe conexiuni).
În fișierul de configurare se pare ca acest lucru:
Dacă toate static nu este plasat în nici un director special, utilizați o expresie regulată:
Va urma
Aici puteți găsi informații despre Nginx dopolnitelnouyu: