Nginx – webserver bez vláken
Nginx je malý HTTP server, který dokáže snadno obsloužit velké množství příchozích požadavků a paralelních spojení. Pro jednotlivé požadavky nevytváří nová vlákna, vše obsluhuje v jednom pracovním vlákně (event polling). Vlákna podporuje také, ale ty slouží hlavně k běhu na více procesorech.
Server se hodí například na servírování statického obsahu, ale ani dynamické stránky přes PHP/Python/Perl nejsou problém.
Konfigurační soubory jsou v Debianu uspořádány do adresářů sites-available / sitest-enabled stejně jako u Apache.
Nejčastější nasazení Nginx je jako reverzní proxy server před Apache. Původní domény můžeme přesměrovat zpět do Apache (běžícím na portu 8001), nové nakonfigurovat již přímo pomocí Nginx.
server {
listen 80;
server_name *.example.com *.neco.cz;
location / {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect false;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass http://127.0.0.1:8001;
}
}
Direktiva server_name může obsahovat více domén a také masky. Doména z HTTP požadavku je pak uložena v proměnné $http_host.
Zajímavou konfigurací je Tornado web server bežící za Nginx. Tornado je HTTP server a framework pro vytváření dynamických webových aplikací v Pythonu. Obsahuje všechny důležité komponenty, a co chybí v Tornadu, najdeme jistě jako nezávislý modul pro Python. Za projektem stojí Facebook (překvapil :). Stejně jako Nginx používá i Tornado event polling a sám běží jako plnohodnotný web server, takže opět stačí proxy.
server {
listen 80;
server_name example.com www.example.com;
# remove www
if ($host ~* www\.(.*)) {
set $host_without_www $1;
rewrite ^(.*)$ http://$host_without_www$1 permanent;
}
location ^~ /static/ {
root /var/www/example;
if ($query_string) {
expires max;
}
}
location = /favicon.ico {
rewrite (.*) /static/favicon.ico;
}
location = /robots.txt {
rewrite (.*) /static/robots.txt;
}
access_log /var/log/nginx/dungame.access.log;
location / {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect false;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass http://127.0.0.1:8082;
}
}
V této konfigurací také vidíme jak přepsat adresu s www na adresu bez. Syntaxe přepisování adres v Nginx je docela povedená – přehledná a konzistentní.
Jak zprovoznit PHP přes FastCGI si již snadno najdete na internetu.
Závěrem dodám, že na dedikovaném serveru může Nginx bez problému nahradit Apache. Horší je to s webhostingy, kde je vyžadována uživatelská konfigurace v .htaccess (mod_rewrite apod.). V této oblasti bude jistě nadále neohroženě vládnout Apache :-)