Späť na blog

Svet webových serverov: Apache vs. Nginx

Svet webových serverov: Apache vs. Nginx

Úvod do Apache a Nginx

Webové servery a protokoly sú navrhnuté tak, aby používateľom umožnili prezerať webové stránky. Odosielajú požiadavku na zobrazenie dokumentu, ktorú server prijme. Hostiteľ potom v podstate poskytne dokument alebo informácie prehliadaču. Webový server hrá kľúčovú úlohu pri umožňovaní prezerania a prístupu k webovým stránkam vo vašom prehliadači.

web server

Webový server uľahčujúci komunikáciu medzi klientom a aplikačnými servermi

Existuje mnoho webových serverov, ktoré môžete na tento účel použiť. Medzi najpopulárnejšie patria Nginx a Apache. Tieto servery v skutočnosti hostujú väčšinu webových stránok, ktoré sú v súčasnosti na internete dostupné.

Apache a Nginx sú si v mnohých ohľadoch dosť podobné. Na začiatok, oba webové servery sú open-source. To znamená, že ich môže používať ktokoľvek na svete úplne zadarmo. Existuje však mnoho funkcií, ktoré sú pre každý zo serverov jedinečné. Tieto špeciálne vlastnosti ich robia najvhodnejšími pre rôzne aplikácie a účely.

Aby sme vám pomohli rozhodnúť sa, ktorý webový server je pre vás lepší alebo ideálny, porovnáme Nginx a Apache. Porovnanie sa uskutoční na základe viacerých dôležitých parametrov, ktoré sú pre používateľov webových serverov kľúčové. Začnime!

Základný prehľad

Začneme všeobecným prehľadom oboch webových serverov. Apache aj Nginx si v komunite vybudovali skvelú povesť. Sú uznávané pre svoj výkon a používané viacerými známymi organizáciami po celom svete.

Apache

Apache vyšiel v roku 1995. Robert McCool vyvinul tento HTTP server pod hlavičkou the Apache Software Foundation, odtiaľ pochádza aj jeho názov. Od jeho vydania používajú Apache stovky tisíc ľudí po celom svete.

Jeho obrovská popularita znamená, že s ním často spolupracuje množstvo softvéru a zdrojov tretích strán. Ak teda hľadáte dobrú sieť podpory s množstvom integrácií, Apache je pre vás ten pravý. Apache je pre mnohých ľudí preferovaný aj preto, že je dynamickejší a flexibilnejší. Ponúka tiež širšiu škálu jazykov, ktoré dokáže interpretovať.

Nginx

Nginx je relatívne novší webový server, ktorý vyšiel v roku 2004. Je výsledkom úsilia Igora Syoseva vyriešiť problém, ktorý je dnes známy ako problém C10K. Tento problém vznikol, keď pre servery začalo byť náročné zvládať veľké množstvo prevádzky. Ako začalo internet používať čoraz viac ľudí, servery webových stránok začali byť preťažené. Neschopnosť týchto serverov spracovať niekoľko tisíc pripojení súčasne spôsobovala pády a zlyhania stránok.

Nginx bol vydaný s cieľom pokúsiť sa vyriešiť tento problém. Preto má jeho architektúra neuveriteľne ľahký dizajn, ktorý dokáže pracovať s obmedzenými zdrojmi a hardvérom. Hoci je najvhodnejší na prácu so statickým obsahom, dokáže sa integrovať aj so softvérom, ktorý dokáže vhodne spracovať aj dynamický obsah.

Schopnosti spracovania prevádzky

Teraz, keď máme základnú predstavu o každom zo serverov, môžeme sa ponoriť do ďalších podrobností. Prvou vlastnosťou, ktorou začneme, sú schopnosti spracovania prevádzky a pripojení jednotlivých serverov. Toto je jeden z hlavných bodov, ktoré tieto dve platformy odlišujú. Ich architektúry fungujú na rôznych princípoch, pokiaľ ide o spracovanie viacerých pripojení súčasne.

Apache

Apache používa niečo, čo sa nazýva MPM- Multi-Processing Modules. Administrátori používajú rôzne MPM na manipuláciu a úpravu architektúry spracovania pripojení. Súčasťou príťažlivosti webového servera Apache je flexibilita, ktorú jeho architektúra ponúka. Takáto infraštruktúra založená na moduloch, ktorá rozdeľuje spracovanie do jednotlivých vlákien a skupín vlákien, uľahčuje škálovanie a prispôsobenie sa rôznym typom pripojení.

Pozrime sa na niektoré z jednotlivých modulov používaných v Apache:

  • mpm_prefork

Prvým z nich je mpm_prefork. Ide o spracovateľský modul, ktorý je zodpovedný za spracovanie prichádzajúcich požiadaviek od návštevníkov. Vytvára jedno vlákno alebo podproces na spracovanie jedného pripojenia v danom čase. To znamená, že ak je počet požiadaviek menší ako počet procesov, mpm_prefork je vo svojej funkcii pomerne efektívny.

Požiadavky sa spracovávajú rýchlo, keďže každú z nich spracováva samostatný podproces. To však tiež znamená, že ak počet požiadaviek prekročí počet procesov, môže to veci výrazne spomaliť. V dôsledku toho krok spracovania požiadaviek spotrebúva veľa pamäte RAM.

  • mpm_worker

Ako už vieme, jedno vlákno je zodpovedné za jedno pripojenie. Tento modul ide o krok ďalej a umožňuje vám spravovať viacero vlákien naraz. Ide o oveľa škálovateľnejší modul v porovnaní s mpm_prefork, ktorý má nad určitou hranicou problémy. Nové pripojenia sa môžu okamžite pripojiť k vláknu namiesto toho, aby museli čakať.

  • mpm_event

Mpm_event je zodpovedný za udržiavanie keep-alive pripojení. Primárnym účelom tohto modulu je zabrániť preťaženiu systému v dôsledku keep-alive požiadaviek. Robí to tak, že vyhradí vlákno pre pripojenie aj bez prítomnosti aktívnej požiadavky. Vlákno zostane vyhradené dovtedy, kým je pripojenie aktívne. Všetky prichádzajúce požiadavky sa prenesú na neobsadené vlákna.

Nginx

Na rozdiel od Apache bol Nginx vytvorený s veľmi špecifickým cieľom. Už sme poznali problémy, ktoré vznikali s pripojením a škálovateľnosťou na tejto úrovni. Preto využíva algoritmus, ktorý je asynchrónny a neblokujúci. Nevyhradzuje jednotlivé vlákna pre každé pripojenie. Namiesto toho Nginx vytvára množstvo pracovných procesov, ktoré sú schopné spracovať tisíce pripojení naraz.

Pracovným princípom architektúry Nginx je mechanizmus rýchlej slučky. Tento algoritmus neustále spracováva udalosti a monitoruje ich. To znamená, že procesy sú riadené udalosťami a každý pracovný proces je vyhradený len pre svoje vlastné pripojenia. Všetky pripojenia pracovného procesu sa nachádzajú v slučke udalostí (event loop). Tu koexistujú a sú spracovávané asynchrónne s ostatnými pripojeniami pod týmto konkrétnym pracovným procesom.

Hlavnou výhodou takejto architektúry je, že umožňuje obrovskú kapacitu pre škálovateľnosť. To platí najmä vtedy, ak máte obmedzené zdroje alebo chcete pracovať s minimálnym hardvérom. Aj keď zaznamenáte obrovskú návštevnosť, vplyv na využitie pamäte RAM bude minimálny. Je to preto, že negenerujete samostatné vlákna pre každé pripojenie.

Spracovanie statického a dynamického obsahu

Ďalším parametrom, ktorý môžeme použiť na porovnanie týchto dvoch webových serverov, je spôsob, akým spracovávajú statický a dynamický obsah.

Apache

Apache používa na prácu so statickým obsahom metódu založenú na súboroch. Jeho spracovateľský systém MPM mu umožňuje pracovať s touto konvenčnou metódou.

Pokiaľ ide o spracovanie dynamického obsahu, Apache to dokáže bez potreby pomoci akýchkoľvek externých komponentov. Dynamické procesory môžete povoliť načítaním modulu. Tento modul spracuje obsah analýzou jazyka a následným vložením príslušného procesora do pracovného procesu.

Hlavná výhoda toho, že na spracovanie dynamického obsahu nemusíte používať externé komponenty, je zrejmá pri konfigurácii a koordinácii. Je oveľa jednoduchšie koordinovať iba interné komponenty navzájom.

Nginx

Najväčší rozdiel medzi spôsobom, akým Apache a Nginx spracovávajú obsah, je ten, že Nginx jednoducho nedokáže spracovať dynamický obsah interne. Na spracovanie požiadaviek na dynamický obsah musí byť spárovaný s externým komponentom. To znamená, že budete musieť použiť svoj server Nginx v spojení s externým procesorom. Tento komponent prijme požiadavku na PHP/dynamický obsah, spracuje ho a potom ho pošle späť na server.

Keďže informácie sa musia prenášať medzi týmito dvoma komponentmi, budete musieť koordinovať komunikáciu medzi nimi. Budete musieť určiť, koľko pripojení chcete povoliť, a nakonfigurovať protokol. Budete musieť použiť protokol, ktorý dokáže Nginx prečítať a porozumieť mu, ako napríklad HTTP, FastCGI, SCGI, uWSGI alebo memcache, okrem iných.

Na druhej strane, Nginx si vedie naozaj dobre pri spracovaní statického obsahu. Na to, aby tak urobil, potrebuje pomoc z akýchkoľvek externých zdrojov. Taktiež aktivuje interpret len vtedy, keď ho potrebuje. Toto je jedna z výhod používania Nginx. Interpret nie je zabudovaný v procese. To znamená, že bude prítomný iba na spracovanie dynamického obsahu.

Adresáre s obsahom: Distribuovaná vs. centralizovaná konfigurácia

Každý webový server má svoj vlastný adresár s obsahom. Jedným z najdôležitejších parametrov, podľa ktorých sa posudzujú Apache a Nginx, je to, či povoľujú alebo nepovoľujú konfiguráciu na úrovni adresára.

Apache

V adresároch s obsahom sa nachádzajú určité skryté súbory, ktoré obsahujú direktívy. Ide o súbory .htaccess. S Apache môžete tieto direktívy interpretovať pre každý adresár samostatne. Keď teda odošlete požiadavku, Apache skontroluje cestu k súboru, aby našiel súbor .htaccess. Keď ho nájde, okamžite interpretuje a aplikuje direktívy, ktoré obsahuje. Apache nebude reštartovať server, aby tieto direktívy implementoval.

Vyššie definovaný proces umožňuje decentralizovanú konfiguráciu adresárov vo webovom serveri. Decentralizovaná konfigurácia je užitočná pre prepisovanie URL adries, implementáciu obmedzení prístupu, potvrdzovanie autorizácií a nastavovanie pravidiel ukladania do vyrovnávacej pamäte.

Jednou z výhod súboru .htaccess je, že používateľ, ktorý nemá autentifikáciu, môže kontrolovať a upravovať aspoň niektoré aspekty obsahu, ktorý si prezerá vo svojom prehliadači. To je dôvod, prečo Apache často využívajú poskytovatelia zdieľaného hostingu. Poskytovatelia služieb majú autorizovaný prístup k centrálnej konfigurácii. Klienti môžu vykonávať kontrolu nad určitými adresármi bez toho, aby mali prístup k hlavnej konfigurácii.

Ak chcete, môžete interpretáciu .htaccess v Apache vypnúť.

Nginx

Na rozdiel od Apache, Nginx nepracuje so žiadnymi súbormi .htaccess. Vďaka tomu je pomerne menej flexibilný. Nginx však namiesto toho prináša množstvo vylepšení vo svojom štýle konfigurácie. Na začiatok je schopný spracovávať požiadavky oveľa rýchlejšie ako Apache. Je to preto, že nevyhľadáva, nečíta, neinterpretuje a následne neimplementuje každý súbor .htaccess, ktorý nájde na svojej ceste. Namiesto prehľadávania každého nadradeného adresára vykoná Nginx pre jednu požiadavku iba jedno vyhľadanie adresára.

Nginx má navyše oproti Apache veľkú bezpečnostnú výhodu. Na rozdiel od Apache neodovzdáva žiadnu časť konfigurácie adresárov s obsahom jednotlivým používateľom. Aj keď vy môžete dodržiavať prísne bezpečnostné opatrenia, kto hovorí, že jednotliví používatelia sú schopní robiť to isté? S Nginx si zachovávate kontrolu nad stavom zabezpečenia a konfiguráciou celej siete adresárov.

Interpretácia požiadaviek

Ďalším spôsobom, ako rozlíšiť tieto dva servery, je spôsob, akým interpretujú požiadavky.

Apache

Keď server prijme požiadavku, interpretuje ju a potom ju prepojí s príslušnými systémovými prostriedkami. Interpretuje požiadavku buď ako fyzický prostriedok v súborovom systéme, alebo ako URI umiestnenie.

Pri interpretácii ako fyzického prostriedku používa <Directory> alebo <Files> bloky. Toto je predvolená metóda interpretácie pre server. Vezme koreň dokumentu. Potom nasleduje hostiteľa a číslo portu v požiadavke, aby našiel príslušný súbor v strome dokumentov.

Umiestnenie URI na druhej strane vyžaduje abstraktné vyhodnotenie. Apache preto pre abstraktné prostriedky používa <Location> bloky namiesto práce so súborovým systémom.

Okrem URI existuje celý rad ďalších alternatív k používaniu predvoleného systému založeného na súboroch. Môžete napríklad použiť direktívu Alias na nájdenie alternatívneho umiestnenia na mapovanie. Môžete tiež využiť varianty výrazov, aby bola konfigurácia súborového systému flexibilnejšia.

Nginx

Zatiaľ čo Apache bol stvorený na to, aby bol webovým serverom, Nginx plní dvojitú úlohu ako webový aj proxy server. To je dôvod, prečo Nginx namiesto príklonu k súborovému systému uprednostňuje prácu s URI. Túto preferenciu si môžete predstaviť na základe skutočnosti, že v Nginxe neexistuje spôsob, ako špecifikovať konfiguráciu pre adresár súborového systému. V prípade potreby ju však dokáže preložiť na súborový systém.

Server a location sú konfiguračné bloky, ktoré sa v Nginxe používajú predovšetkým. Prvý z nich interpretuje hostiteľa, ktorý je požadovaný. Druhý porovnáva časti URI za hostiteľom a portom. V dôsledku toho server interpretuje požiadavku ako umiestnenie URI namiesto skutočného súboru v systéme.

Vďaka svojmu interpretačnému systému založenému na URI dokáže Nginx plniť svoju úlohu webového servera, proxy servera a poštového servera. Keďže pri interpretácii požiadavky neodkazuje na súborový systém, je pochopiteľné, prečo neimplementuje ani súbory .htaccess.

Modulové systémy

Hoci Apache aj Nginx ponúkajú podporu modulových systémov pre rozšírenie, v ich vnútornom fungovaní existujú určité zásadné rozdiely.

Apache

S Apache môžete dynamicky načítavať a uvoľňovať moduly počas behu servera. Jadro zostáva v centre procesov a moduly slúžia na rozšírenie funkčnosti. Tieto pripojiteľné moduly môžete použiť na vykonanie celého radu úloh. Možnosti sú s rozsiahlou knižnicou Apache prakticky nekonečné.

V skutočnosti môžete dokonca upraviť funkciu jadra servera pomocou modulov ako  mod_php. Ako sme už spomínali, tento modul vám umožňuje vložiť PHP interpret do jednotlivých pracovných procesov. To je užitočné, keď potrebujete spracovať dynamický obsah.

Tým sa však príbeh nekončí. Môžete tiež pridať moduly na povolenie funkcií, ako je autentifikácia klientov, zabezpečenie servera, ukladanie do vyrovnávacej pamäte, prepisovanie URL adries, proxy servery, obmedzenie rýchlosti, kompresia, ako aj šifrovanie.

Nginx

Modulový systém Nginx je odlišný v tom zmysle, že moduly nemôžete dynamicky načítavať do hlavného servera. Namiesto toho musia byť zhromaždené a skompilované v jadre softvéru. To ponecháva veľa priestoru na zlepšenie, pokiaľ info o flexibilite a jednoduchosti použitia. Hoci distribučné balíky obsahujú niektoré bežné moduly, pre iné moduly budete musieť server zostaviť sami. Preto musíte vedieť, ako udržiavať skompilovaný softvér mimo tradičného balíčkovacieho systému.

Bez ohľadu na to je výhodou tohto neštandardného modulového systému to, že vám poskytuje vysokú mieru špecifickosti. Svoje moduly si môžete prispôsobiť tak, že do nich začleníte iba tie funkcie, ktoré požadujete. Umožňuje vám to zanechať komponenty, ktoré nepotrebujete, a vyhnúť sa tak bezpečnostnému riziku. Zároveň môžete s modulmi Nginx vykonávať rovnaké úlohy ako s Apache. Patrí sem prepisovanie URL adries, protokolovanie, autentifikácia a podobne.

Ekosystém a podpora

Integrácie a softvérová podpora sú pri webových serveroch veľmi dôležité. Ďalej preskúmame kompatibilitu a podporu, ktorá je k dispozícii pre Apache a Nginx.

Apache

Apache je staršia a populárnejšia platforma. Je preto pochopiteľné, že má v porovnaní s Nginxom väčšiu škálu podporných nástrojov a softvéru. Na podporu hlavného servera máte k dispozícii obrovské množstvo dokumentácie od tretích strán. Nielen to, ale môžete ho tiež spárovať s iným softvérom na vykonávanie špecifických úloh. Tieto nástroje môžete pridať buď do svojho projektu, alebo do svojho balíka. Dokážu sa ľahko spustiť v rámci ekosystému Apache.

Nginx

Hoci Nginx v tomto ohľade zaostáva za Apache, určite robí všetko pre to, aby ho dobehol. Čoraz viac ľudí prechádza na Nginx, keď si uvedomujú jeho plný potenciál. Podpora tejto platformy naďalej rastie spolu s jej prirodzeným rastom ako užitočného, rýchlo spracovávajúceho webového servera.

Jednou z hlavných prekážok v oblasti podpory, ktorú musel Nginx prekonať, bolo hľadanie dokumentácie v anglickom jazyku. Je to preto, že väčšina Nginx bola pôvodne napísaná v ruskom jazyku, vrátane väčšiny jeho dokumentácie. Keď sa však server rozšíril a stal sa známejším, v tomto univerzálnom jazyku je teraz k dispozícii množstvo zdrojov od tretích strán.

Spoločné riešenie?

Teraz už oveľa lepšie rozumiete základným komponentom a vnútornému fungovaniu Apache a Nginx. Hoci sa od seba dosť líšia, niektorí používatelia túto skutočnosť využívajú na to, aby získali to najlepšie z oboch svetov. Presne tak – je možné, aby ste Apache a Nginx používali spoločne.

Používatelia zvyčajne používajú Nginx ako reverzné proxy a umiestňujú ho pred Apache. To vám umožní kompenzovať nedostatok rýchlosti pri spracovaní požiadaviek v Apache. Nginx prijíma a spracováva všetky požiadavky v čase, keď je najrýchlejší. Umožňuje vám tiež rýchlo zvládnuť veľké množstvo požiadaviek súčasne bez toho, aby ste museli investovať veľa prostriedkov.

Ďalšou funkciou Nginx, ktorú používatelia využívajú, je jeho schopnosť efektívne spracovávať statický obsah. Aby sme kompenzovali skutočnosť, že Nginx potrebuje na spracovanie dynamického obsahu externý komponent, môžeme PHP a ďalšie relevantné požiadavky presmerovať na Apache prostredníctvom proxy. Apache vykreslí požiadavku do webovej stránky a pošle ju späť Nginx, aby ju mohol poskytnúť klientovi.

Tu je niekoľko zdrojov, ktoré nájdete na našom blogu a ktoré vám pomôžu začať s oboma webovými servermi:

Apache
Nginx

Záver

Koniec koncov, Apache aj Nginx majú svoje silné a slabé stránky. Neexistujú žiadne pevné pravidlá ani odporúčania, ktorý server by ste mali použiť pre svoj projekt. Vy sami najlepšie posúdite, čo je pre vašu aplikáciu najvhodnejšie na základe vašich jedinečných požiadaviek.

Musíte zistiť, v ktorých aspektoch a funkciách nemôžete robiť kompromisy, a podľa toho si vybrať. Ak je ťažké sa rozhodnúť, vždy sa môžete obrátiť na spoločné používanie oboch serverov v prispôsobenom riešení.

Príjemnú prácu s počítačom!

author

Akshay Nagpal

Autor · CloudSigma

Preslav Dobrev je kreatívny dizajnér v spoločnosti CloudSigma, ktorý sa zameriava na konzistentnú firemnú identitu prostredníctvom tradičných a inovatívnych marketingových kanálov. Dokáže brilantne spájať umeleckú víziu so strategickým marketingom, čím vytvára pôsobivé príbehy značky.

Komentáre

Zatiaľ žiadne komentáre. Buďte prvý.