Linux E X P R E S

Facebook

Jak nakonfigurovat server na NVA (nginx, Varnish, Apache) architektuře pro WordPress

wordpress_1.png

Plánujete rozsáhlejší WordPress projekt? Nevíte, kde sehnat kvalitní hosting? Co takto si nakonfigurovat vlastní, na NVA architektuře. NVA značí použití tří hlavních nástrojů - nginx jako vstupní vrstva, Varnish pro cachování a Apache2 pro dynamické generování obsahu.


Pojďme si, v tomto článku, přiblížit základy takového nastavení serveru. Bude se jednat o základní funkční nastavení pro mírně pokročilého správce sítě a trochu té vlastní invence může pak už každý přidat sám.

Trochu teorie

V článku nebudou vysvětlovány základy nastavení jednotlivých služeb, takových návodů je na internetu spoustu. Spíše se zaměříme na myšlenku využití těchto tří nástrojů dohromady a vytvoření tak svižného cachovaného prostředí.

HTTP request

V následujícím diagramu je popsána základní myšlenka cachování pomocí nginx, Varnish a Apache pro WordPress webové stránky. Pojďme si projít proces krok po kroku.

nginx-schema.png

Bod 1

Server dostane požadavek a jako první do cesty mu naběhne nginx, který rozhodne, co se s požadavkem udělá. Toto rozhodnutí závisí převážně na hodnotách COOKIE, které request obsahuje nebo na základě cesty. Pokud se nginx rozhodně, že by se měla odpověď serveru nacházet v cachové vrstvě, postoupí se k bodu 2, dotáže se tedy Varnish cache. Pokud se jedná např. o přihlášeného uživatele, člověka, který má v košíku zboží (které je uloženo v cookie), je potřeba stránku dynamicky vygenerovat pomocí webového serveru apache a postoupí se na bod 4.

Bod 2

Do cachovací vrstvy se odešlou data. Varnish pak už podle hashe (klíče) vyhledá daný požadavek ve své paměti. Pokud jej najde, ihned vrací odpověď do nginxu (bod 6). Pokud v paměti nic nenajde, postupuje se na bod 3, čímž je dotaz na server apache.

Bod 3

Dotaz na server apache, kde se vygeneruje obsah stránky. Konfigurace tohoto serveru může být prakticky totožná s jakýmkoliv standardním bezpečným nastavením.

Bod 4

Pokud nginx uzná, že by dotaz neměl být cachovaný, přeskočí se cache a jde se přímo na dynamické generování obsahu.

Bod 5

Apache vrací vygenerované HTML stránky do Varnish. Ten si jej na základě hlavičky “cache-control” na určitou dobu uloží do paměti pro další využití.

Bod 6

Varnish vrací odpověď na nginx.

Bod 7

Váže se k bodu 4, kdy nginx ihned přejde na generování obsahu a přeskakuje cachovací vrstvu. Tato odpověď je zpátky poslána nginxu.

Bod 8

Uživatel dostává zpět vygenerovaný HTML kód a HTTP odpověď serveru.

Obrázky a jiné statické soubory

Statické soubory, jako jsou obrázky, pdf, zipy a podobné by neměly procházet Varnish cachováním, jelikož se jedná o větší soubory, které by cachováním zabíraly místo na serveru a cachovat je ani není třeba. Také nemá smysl tyto dotazy posílat na apache, protože ten by je vrátil v nezměněné podobě zpět do nginxu a prodloužil by tak o pár milisekund odezvu. Nejjednodušší a nejefektivnější volba je tedy nechat statické soubory zpracovávat právě nginx. Ve vzorovém příkladu nastavení virtual hostu níže v textu je toto nastavení uvedené.

SSL certifikáty

Nejefektivnější volbou pro nakonfigurování SSL je opět již zmíněný “švýcarák” nginx. Zde stačí nakonfigurovat dva virtuální hosty, s čímž jeden bude obsahovat SSL certifikát (klidně Let’s Encrypt) a bude naslouchat na portu 443. Druhý virtuální host bude naslouchat na portu 80 a přesměrovávat dotazy přes stavový řádek 301 na SSL zabezpečení.

Pojďme to nastavit ...

Pojďme si projít všechny služby tak, abyste dokázali nastavit funkční setup. Veškeré nastavení popsané je otestované na Ubuntu 16 LTS. Ostatní linuxové OS budou mít podobné nastavení.

Apache

Nejdříve nainstalujeme Apache službu. Příkazem:

apt-get -y install apache2

Dále je potřeba nainstalovat rpaf pro posílání reálné IP adresy:

apt-get -y install libapache2-mod-rpaf

A povolit některé apache moduly:

a2enmod rewrite
a2enmod expires
a2enmod deflate
a2enmod headers
a2enmod rpaf

Defaultně Apache naslouchá na portu 80, tam chceme ale mít nginx. Musíme tedy v příkazové řádce spustit tento příkaz pro změnu portu na 8080:

sed -i "s/Listen 80/Listen 8080/g" /etc/apache2/ports.conf

Nastavený Apache virtual host může mít PHP nakonfigurován přes php-fpm nebo přes php modul přímo v Apachi, který je jednodušší na nakonfigurování, nicméně je méně variabilní.

Takové nejjednodušší nastavení by mohlo vypadat takto:

<script src="https://gist.github.com/glosjakub/ea0494a673efcc097efac1e18d14a7cd.js"></script>

Varnish

Varnish nainstalujeme příkazem:

apt-get -y install varnish

A následně upravíme /etc/varnish/default.vcl, aby vypadal takto:

<script src="https://gist.github.com/glosjakub/46a815430d7ded3295b7fc33eee5b825.js"></script>

Veškeré podrobné popisy k jednotlivým funkcím najdete přímo v kódu. Je třeba zmínit, že skript ignoruje utm parametry, respektuje no-cache header, dovoluje PURGE pouze ze stejného serveru a je možné vymazat cache jak pro doménu, tak i pro individuální stránku.

Nginx

V první linii však musíme správně nastavit nginx. Nainstalujeme ho příkazem:

apt-get -y install nginx

Podle mnoha návodů na internetu (i jednoho v dalších zdrojích) nastavte workery, gzip a další věci spojené s nginx serverem, případně nechte defaultní hodnoty.

Následně vytvoříme soubor /etc/nginx/conf.d/custom.conf a přidáme následující řádky. Tím definujeme porty, na kterých budou služby naslouchat. Konkrétně 8080 pro Apache a defaultní 6081 pro Varnish.

<script src="https://gist.github.com/glosjakub/eb6519c177453d634c15e26d2f879192.js"></script>

Nastavení jednoho virtuálního hostu pak může vypadat následovně.

<script src="https://gist.github.com/glosjakub/92837abd4318d8845cb0b42ac3315d1e.js"></script>

Opět je v textu gistu popsáno, co dané příkazy dělají. Velice zkráceně - v první části se nastavují obecná pravidla jako je název domény, rootová složka, různé headery, dále se kontrolují cesty, cookie a přípony souborů a podle toho se směřují požadavky na různé služby.

WordPress

Aby byl zajištěn aktuální obsah na webu, je potřeba na server posílat PURGE dotazy k pročištění cache. Pro to jsme pro vás napsali php třídu, kterou můžete libovolně umístit buď do své WordPress šablony, nebo z ní udělat plugin. Skript odchytává různé akce WordPressu a posílá buď dotaz na vyčištění specifické stránky, nebo celé domény.

<script src="https://gist.github.com/glosjakub/c4e9d875912633b8caf2cc3aa87f9719.js"></script>

Případně existuje několik pluginů v repozitáři, které jdou využít. Je jím Varnish HTTP Purge, Purge Varnish Cache. Ten náš je ale osvědčený a velice jednoduchý. :)

Firmy poskytující toto řešení

Zahraniční firma, která je postavena na tomto řešení je jedna z největších společností hostujících WordPress weby - je jím WP Engine (https://wpengine.com/). Ti používají tento systém na celé své infrastruktuře. Samozřejmě okořeněné o mnohé bezpečnostní prvky a vychytávky. Cena hostingu je však poměrně astronomická. V českém prostředí pak můžeme najít dostupnějšího obdobného poskytovatele WP Neuron (https://wpneuron.com/cs/), který taktéž funguje na stejném principu.

Závěrem

Jak bylo v úvodu zmíněno, veškeré informace v tomto článku jsou určené pro mírně pokročilého správce sítě. Je potřeba do nich přidat trochu svých nápadů, vylepšení a můžete nastavit poměrně kvalitní hostingové prostředí. Není zmíněno nastavení php-fpm a MySQL, to by ale vydalo na celý další článek.

Pokud budete chtít získat více informací o webhostingových službách, můžete se podívat na webhosting srovnávač.

Diskuze (6) Nahoru