Apache vs. nginx: který webový server zvolit pro VPS
Praktické srovnání Apache a nginx: architektura, .htaccess, PHP, statické soubory, konfigurace a kdy dává smysl kombinace obou. Bez marketingu.
Apache HTTP Server a nginx jsou dva nejrozšířenější open-source webové servery. Oba jsou stabilní, rychlé a zvládnou většinu webů. Rozdíly jsou hlavně v architektuře, způsobu konfigurace a tom, jak se chovají při velkém počtu spojení. Tady je srovnání, které vám pomůže vybrat.
Architektura
Apache zpracovává požadavky přes MPM moduly (Multi-Processing Modules):
prefork– jeden proces na spojení, nutný promod_php,worker– vlákna v procesech,event– vlákna + asynchronní obsluha keep-alive spojení; doporučená volba s PHP-FPM.
nginx je od začátku postavený na událostech: několik worker procesů (obvykle jeden na jádro), z nichž každý obsluhuje tisíce spojení neblokujícím způsobem. Paměťová náročnost proto při rostoucím počtu spojení roste jen pomalu.
V praxi moderní Apache s mpm_event výrazně zmenšil rozdíl, který byl vidět v dobách prefork. Nginx ale zůstává úspornější při velkém množství pomalých nebo nečinných spojení.
Konfigurace a .htaccess
Hlavní praktický rozdíl.
Apache podporuje soubory .htaccess – konfiguraci přímo v adresářích webu. Výhoda: uživatel bez root přístupu si upraví přesměrování nebo ochranu heslem. Proto je Apache standard na sdíleném hostingu a mnoho PHP aplikací (WordPress, starší frameworky) dodává hotový .htaccess.
Nevýhoda: Apache při každém požadavku prochází adresáře a hledá .htaccess, což stojí výkon. Na vlastním serveru je lepší pravidla dát do konfigurace virtual hostu a .htaccess vypnout (AllowOverride None).
nginx nic jako .htaccess nemá. Veškerá konfigurace je centrální a změny vyžadují nginx -t a reload. Je to bezpečnější a rychlejší, ale pravidla z .htaccess musíte přepsat ručně.
Příklad – „pěkné URL“ pro PHP aplikaci:
# Apache .htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [L]
# nginx
location / {
try_files $uri $uri/ /index.php?$query_string;
}
PHP
| Apache | nginx | |
|---|---|---|
mod_php (PHP v procesu serveru) |
ano, ale jen s prefork |
ne |
| PHP-FPM přes FastCGI | ano (mod_proxy_fcgi) |
ano (fastcgi_pass) |
| Různé verze PHP pro různé weby | přes PHP-FPM | přes PHP-FPM |
Na novém serveru doporučujeme v obou případech PHP-FPM. Oddělí PHP od webového serveru, umožní ladit počet PHP workerů zvlášť a provozovat víc verzí PHP současně.
Statické soubory a reverse proxy
Nginx je velmi efektivní při servírování statických souborů a jako reverse proxy před aplikacemi v Node.js, Pythonu nebo Go. Konfigurace proxy_pass je přímočará a nginx má zabudované cachování odpovědí (proxy_cache).
Apache to zvládne také (mod_proxy, mod_cache), jen konfigurace bývá upovídanější.
Moduly
Apache načítá moduly dynamicky: a2enmod rewrite, a2enmod headers a restart. Výběr modulů je široký (autentizace, WebDAV, mod_security …).
Nginx moduly z velké části kompiluje přímo do binárky. Dynamické moduly existují, ale balíček z distribuce nabízí jen určitou sadu (v Ubuntu jako balíčky libnginx-mod-*).
Správa na Ubuntu
| Úkol | Apache | nginx |
|---|---|---|
| Instalace | apt install apache2 |
apt install nginx |
| Konfigurace webů | /etc/apache2/sites-available/ |
/etc/nginx/sites-available/ |
| Povolit web | a2ensite web.conf |
ln -s do sites-enabled |
| Test konfigurace | apache2ctl configtest |
nginx -t |
| Načíst změny | systemctl reload apache2 |
systemctl reload nginx |
| Logy | /var/log/apache2/ |
/var/log/nginx/ |
Kombinace: nginx před Apache
Častý vzor: nginx na portu 80/443 vyřizuje TLS a statické soubory, Apache za ním na 127.0.0.1:8080 zpracovává PHP aplikace s .htaccess. Dává to smysl při migraci z hostingu, kdy nechcete přepisovat pravidla. U nové instalace je jednodušší vybrat jen jeden server – každá vrstva navíc je další konfigurace a další místo, kde se může něco pokazit.
Při kombinaci nezapomeňte v Apache povolit mod_remoteip, jinak bude v logech jen 127.0.0.1.
Kdy zvolit Apache
- migrujete web ze sdíleného hostingu a spoléháte na
.htaccess, - aplikace výslovně vyžaduje Apache nebo jeho moduly,
- tým s Apache umí a nemá důvod měnit.
Kdy zvolit nginx
- nový projekt, hlavně s Node.js, Pythonem nebo Go za reverse proxy,
- hodně statického obsahu nebo hodně souběžných spojení,
- malý VPS, kde se počítá každý megabajt RAM.
Pozor na souběh
Na jednom serveru nemůžou oba naslouchat na portu 80. Pokud po instalaci druhého serveru vidíte chybu Address already in use, jeden z nich vypněte (sudo systemctl disable --now apache2) nebo ho přesuňte na jiný port.
Volba není otázkou „lepšího“ serveru. Oba jsou zralé nástroje; rozhoduje, jakou aplikaci provozujete a s čím umíte pracovat.