Správa linuxového serveru: Webový server Nginx

Nginx je rostoucí hvězdou mezi alternativami k nejpoužívanějšímu webovému serveru Apache. Stejně jako lighttpd nebo Cherokee patří i Nginx k lehkým, nenáročným, ale přesto velice výkonným serverům. V tomto díle vám jej přiblížím.

Úvod

Projekt Nginx pochází z Ruska, napsal jej Igor Sysoev a je dostupný pod velmi liberální BSD licencí. Nginx je dle statistik v současné době druhým nejpopulárnějším linuxovým webovým serverem (pokud počítáte webové servery obecně, pak je třetí, hned za IIS od Microsoftu). Pokud jste si prošli minulý díl, pak prakticky všechny základní charakteristiky sdílí s webovým serverem lighttpd, tj. je rychlý, výkonný a má minimální spotřebu paměti. Výborně se tedy hodí jak pro provoz náročných aplikací, tak pro provoz na menších serverech či osobních VPS.

Je schopen fungovat také jako reverzní proxy, tedy předávat požadavky jinému webserveru a vracet klientovi odpověď, čímž se výborně se hodí pro rozložení zátěže (load balancing) náročné aplikace na více fyzických (či virtuálních) webových serverů. Zde je třeba dodat, že projektů pro load balancing existuje více, a sice reverzní proxy Pound či HAProxy (toto jsou skutečně pouze reverzní proxy, nejsou schopny zastávat funkci webového serveru a nabízet nějaký obsah samy o sobě). Funkcionalitu reverzní proxy obsahují ovšem i jiné webové servery, např. Apache (v modulu mod_proxy) a lighttpd (opět modul proxy).

Zajímavostí je, že Nginx je schopen pracovat i jako POP3/IMAP poštovní proxy s patřičnou podporou SSL a TLS.

Instalace

Nginx je běžnou součástí linuxových distribucí, takže stačí najít v repozitářích balíček s odpovídajícím názvem. V Debianu postačí k instalaci použít následující příkaz:

aptitude install nginx

Základní konfigurace

V Debianu je konfigurace Nginx opět lehce přizpůsobená. Jádrem je konfigurační soubor /etc/nginx/nginx.conf, avšak nastavení je rozděleno ještě do dvou dalších adresářů. Nastavení v souborech v /etc/nginx/conf.d budou načtena při startu Nginx (resp. bude naincludována hlavním konfiguračním souborem). Konfiguraci jednotlivých virtuálních serverů (virtual host) můžete rozdělit do souborů v /etc/nginx/sites-available, přičemž aktivní virtuální servery je pak třeba symlinkovat do /etc/nginx/sites-enabled. Je to podobné jako u Apache, jen zatím chybí shellové nástroje pro snadnější aktivaci a deaktivaci jednotlivých serverů, takže si budete muset vystačit s ručním vytvářením symbolických odkazů. Příslušné skripty budou k dispozici patrně až pro další vydání Debianu, které přijde po Debian Squeeze (pokud používáte Debian unstable, což na server nelze doporučit, měli byste mít tyto nástroje v balíčku s Nginx už teď).

Z hlediska konfigurace je třeba brát v úvahu, že Nginx je primárně reverzní proxy, takže HTTP server se v konfiguraci bere jako samostatný modul (dostupný v sekci http). Sekce jsou v tomto případě bloky uvozené klíčovým slovem a oddělené pomocí složených závorek:

http {

   volby

}

Jednotlivé sekce mohou mít vnořené podsekce. V případě HTTP serveru je hierarchie následující: http -> server -> location. Sekcí server a location může být přirozeně více.

Základní chování Nginx se nastavuje mimo sekci http. Definují jej zejména následující volby (tento úsek pochází z výchozí konfigurace Debianu):

user www-data;
worker_processes  1;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
    # multi_accept on;
}

Volba user nastavuje uživatele, pod kterým budou Nginx procesy běžet. Podstatný je počet procesů (worker_processes), který je vhodné nastavit podle počtu dostupných jader procesoru. V úseku výše můžete také vidět sekci modulu events, kde se skrývá podstatná volba worker_connections, která určuje, kolik klientů může najednou obsloužit jeden proces. Celkový počet najednou obsluhovaných klientů je tedy roven součinu worker_processes a worker_connections.

Samotné nastavení sekcí server (která odpovídá virtuálnímu serveru) a location (která definuje jednotlivá umístění či typy souborů a jejich vlastnosti a přístupová práva) je poměrně názorně naznačeno v /etc/nginx/sites-enabled/default.

Základní konfigurace virtuální serveru může vypadat třeba takto:

server {
    listen 1.2.3.4:80;
    server_name www.domain.com;
    location / {
        root   /var/www;
    }
}

Nastavení IP adresy a portu pro naslouchání by mělo být jasné, stejně jako jméno serveru. Všimněte si, že kořenový adresář (document root v Apachi) se nastavuje pomocí location.

Pokročilejší konfigurace je velmi dobře popsána na wiki Nginx (viz odkazy v závěru článku), včetně příkladů pro virtuální servery, load balancing i použití SSL (to je už dokonce v konfiguraci výchozího virtuálního serveru v Debianu připraveno, tedy pouze zakomentováno) apod.

Moduly a Nginx

Nginx má k dispozici řadu modulů rozšiřující jeho funkcionalitu, avšak na rozdíl od Apache není možné moduly snadno přidávat nebo odebírat - moduly totiž musejí být zvoleny při kompilaci (jsou pak zakompilovány do příslušné binárky). Pokud byste tedy chtěli nějaký modul, který není zakompilován v binárce, kterou dodává vaše distribuce, není jiná možnost než Nginx překompilovat ručně.

Nginx a PHP

Nginx přistupuje k PHP stejně jako lighttpd, tedy přes FastCGI. Na rozdíl od Lighttpd však Nginx neobsahuje nástroj pro spuštění FastCGI procesů, musíte si tedy vypomoci nástrojem spawn-fcgi:

aptitude install spawn-fcgi

Stejně jako v případě Lighttpd je třeba upravit nastavení PHP interpretu odkomentováním řádky cgi.fix_pathinfo=1 v souboru /etc/php5/cgi/php.ini.

Následně je třeba spustit FastCGI procesy, které bude moci Nginx využít k běhu PHP aplikací. To je bohužel nutné udělat ručně:

spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -g www-data -f /usr/bin/php5-cgi -P /var/run/fastcgi-php.pid

Abyste zajistili spuštění FastCGI procesů po startu, můžete tuto řádku přidat do /etc/rc.local, což zajistí provedení příkazu po každém spuštění systému. Jistou výhodou tohoto přístupu je mj. možnost změnit konfiguraci PHP bez restartu webového serveru - postačí pouze restart FastCGI procesů.

Posledním krokem je editace příslušného virtuálního serveru (např. v souboru /etc/nginx/sites-available/default), kde vložíte nebo odkomentujete a upravíte následující část:

location ~ \.php$ {
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  /var/www$fastcgi_script_name;
}

Zde je potřeba upravit zejména řádku s fastcgi_param, kde místo /var/www uveďte cestu ke kořenu webové prezentace (document root) daného virtuálního serveru.

V konfiguraci je potřeba přizpůsobit ještě jednu věc, a sice přidat index.php jako jeden z možných indexových souborů:

location / {
     root   /var/www;
     index  index.php index.html index.htm;
}

Tím by mělo být nastavení PHP v Nginx hotovo, stačí jej už jen otestovat a začít používat.

Který server vybrat?

V předchozích dílech byly představeny prakticky všechny nejpoužívanější webové servery, tj. Apache, Nginx, Lighttpd a Cherokee. Každý z těchto serverů má svoje přednosti a charakteristiky. Nemyslím si, že existuje obecná „kuchařka“, jak vybrat ten správný server, neboť výběr silně závisí na vlastnostech, které potřebujete, dále pak na tom, co na daném serveru chcete nasadit, jaký hardware máte k dispozici, a hlavně, jak velkou zátěž bude váš server generovat.

Nakonec vám asi nezbude než si jednotlivé servery otestovat právě ve vašem prostředí a v případě projektů, které chcete nasadit, a na základě výsledků testování se pak rozhodnete. Pokud budete testovat s využitím jakéhokoliv benchmarku (např. nástroje ab, který byl představen v tomto díle), určitě neberte v úvahu pouze naměřené hodnoty, ale také zátěž CPU a obsazení paměti během testu. Může se totiž klidně stát, že server, který bude o pár milisekund pomalejší, bude zatěžovat CPU či paměť třeba jen z poloviny oproti svému konkurentovi.

Jak už jsem nakousl v minulém díle, řada webových aplikací je stavěna s ohledem na provoz na nejrozšířenějším webovém serveru, tedy na Apachi. „Kompatibilita“ aplikace s jinými servery se pak odvíjí od toho, jak moc (a zdali vůbec) aplikace využívá soubory .htaccess a pravidla pro rewrite URL. To jsou dvě hlavní oblasti rozdílů mezi webovými servery, .htaccess je specifikum Apache, nicméně pravidla pro řízení přístupu v něm obsažená lze snadno přidat do konfigurace jiného webového serveru, jen bude potřeba zohlednit rozdíly v syntaxi. Přepis URL je o něco horší, neboť tam je syntax o něco složitější, ale ani to není neřešitelný úkol. U řady projektů je možné použít vyhledávač a s trochou štěstí se dostat přímo k pravidlům, která již někdo vámi zvolenému serveru přizpůsobil.