Modul 5 — Webové servery a reverzní proxy
23. Apache HTTP Server — kdy a proč ho použít místo Nginx
Architektura Apache HTTP Serveru, moduly a soubory .htaccess a praktické srovnání s Nginx pro rozhodování, který server nasadit.
Úvod a kontext
Apache HTTP Server (často jen "Apache" nebo historicky "httpd") je starší
a dodnes velmi rozšířený webový server — na rozdíl od Nginx z minulých
dvou lekcí vznikl už v polovině 90. let a byl dlouho nejpoužívanějším
webovým serverem vůbec. I když dnes Nginx v mnoha nasazeních Apache
předstihl, existují reálné situace, kdy je Apache stále lepší nebo nutná
volba — typicky kvůli sdíleným hostingům, konfiguraci na úrovni adresáře
přes .htaccess, nebo starším aplikacím, které jsou na Apache přímo
navázané (např. specifickým chováním modulů). Tato lekce vysvětluje, jak
se Apache liší architekturou a kdy dává smysl volba mezi oběma servery.
Teorie
Architektura: moduly a procesy vs. asynchronní model
Klíčový architektonický rozdíl mezi Apache a Nginx:
- Apache (ve výchozím a nejběžnějším nastavení, tzv.
mpm_prefork
nebompm_worker) obsluhuje každé spojení samostatným procesem nebo
vláknem. Je to jednodušší model na pochopení a ladění, ale při velkém
počtu souběžných spojení spotřebovává výrazně víc paměti — každé
spojení má vlastní paměťový prostor. - Nginx používá asynchronní, událostmi řízený model — jeden proces
(worker) umí obsluhovat tisíce spojení současně bez vytváření nového
procesu/vlákna pro každé z nich. Proto Nginx při vysoké zátěži
(desetitisíce souběžných spojení) obvykle spotřebovává výrazně méně
paměti a CPU.
Tento rozdíl je hlavní důvod, proč se Nginx v posledních letech stal
výchozí volbou pro nové nasazení s vysokou zátěží, zatímco Apache zůstává
silný tam, kde jde spíš o flexibilitu konfigurace než o extrémní výkon.
Moduly (mod_*)
Apache je vysoce modulární — velká část funkcionality (přepisování URL,
autentizace, komprese, PHP) se zapíná/vypíná jako samostatné moduly:
sudo a2enmod rewrite # zapne modul pro přepisování URL
sudo a2enmod ssl # zapne podporu HTTPS
sudo a2dismod status # vypne modul (opak a2enmod)
sudo systemctl reload apache2
a2enmod/a2dismod jsou pomocné skripty specifické pro
Debian/Ubuntu balíčky Apache — vytváří/ruší symlinky do
/etc/apache2/mods-enabled/, obdoba sites-available/sites-enabled z
Nginx lekce, jen pro moduly místo webů.
Konfigurace virtuálních hostů
Konfigurace jednoho webu (VirtualHost) je koncepčně podobná Nginx
server bloku:
<VirtualHost *:80>
ServerName example.cz
ServerAlias www.example.cz
DocumentRoot /var/www/example.cz/html
<Directory /var/www/example.cz/html>
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/example.cz-error.log
CustomLog ${APACHE_LOG_DIR}/example.cz-access.log combined
</VirtualHost>
ServerName/ServerAlias— obdoba Nginxserver_name,DocumentRoot— obdoba Nginxroot,<Directory>blok — nastavuje pravidla pro konkrétní adresář na disku;
AllowOverride Allpovoluje přebití konfigurace souborem.htaccess
(viz níže),Require all grantedpovoluje přístup všem.
Aktivace na Debianu/Ubuntu je analogická Nginx:
sudo a2ensite example.cz
sudo systemctl reload apache2
.htaccess — konfigurace na úrovni adresáře
Jedna z klíčových vlastností, kterou Nginx nemá a Apache ano: soubor
.htaccess umístěný přímo v adresáři s webovým obsahem umožňuje měnit
konfiguraci bez přístupu k hlavní konfiguraci serveru a bez restartu:
# .htaccess v kořeni webu
RewriteEngine On
RewriteRule ^stary-clanek$ /novy-clanek [R=301,L]
ErrorDocument 404 /404.html
Toto je důvod, proč je Apache dodnes velmi rozšířený na sdílených
hostinzích — poskytovatel hostingu nemusí dávat zákazníkům přístup k
hlavní konfiguraci serveru (což by ohrozilo ostatní zákazníky na stejném
serveru), ale .htaccess jim umožní si přesměrování, vlastní chybové
stránky nebo autentizaci nastavit sami. Nginx tuto možnost úmyslně nemá —
jeho konfiguraci lze měnit jen centrálně, a to je právě jeden z důvodů,
proč je rychlejší (nemusí při každém požadavku kontrolovat, jestli
existuje .htaccess v aktuálním a všech nadřazených adresářích).
Kdy zvolit Apache, kdy Nginx
Praktické vodítko pro rozhodování:
| Situace | Doporučení |
|---|---|
Sdílený hosting, zákazníci potřebují měnit konfiguraci sami (.htaccess) |
Apache |
| Vysoký počet souběžných spojení, minimální spotřeba paměti | Nginx |
| Starší aplikace navázaná na konkrétní Apache moduly | Apache |
| Reverzní proxy / load balancer před moderní aplikací | Nginx |
| Čistě statický obsah s maximálním výkonem | Nginx |
Potřeba mod_php (PHP přímo v procesu webového serveru) |
Apache |
V praxi se obě řešení i kombinují — Nginx jako reverzní proxy vpředu
(TLS terminace, statický obsah, load balancing) a Apache za ním jako
aplikační vrstva tam, kde aplikace závisí na specifických Apache
modulech. Pro nový projekt bez takových závislostí je dnes Nginx obvykle
výchozí volbou.
Praktický příklad
Základní nasazení statického webu na Apache, analogické k příkladu z
Nginx lekce, pro přímé srovnání syntaxe:
sudo apt install apache2
sudo mkdir -p /var/www/example.cz/html
echo '<h1>Vítejte na example.cz (Apache)</h1>' | sudo tee /var/www/example.cz/html/index.html
sudo tee /etc/apache2/sites-available/example.cz.conf <<'EOF'
<VirtualHost *:80>
ServerName example.cz
ServerAlias www.example.cz
DocumentRoot /var/www/example.cz/html
<Directory /var/www/example.cz/html>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
EOF
sudo a2ensite example.cz.conf
sudo apache2ctl configtest
sudo systemctl reload apache2
apache2ctl configtest je obdoba nginx -t — ověří syntaxi konfigurace
předtím, než se aplikuje, a zabrání tak nahrání rozbité konfigurace, která
by shodila celý server.
Shrnutí
Apache obsluhuje spojení procesovým/vláknovým modelem, zatímco Nginx
používá asynchronní model efektivnější při velkém počtu souběžných
spojení — to je hlavní architektonický rozdíl mezi oběma servery. Apache
naopak nabízí silnější modularitu (a2enmod) a jedinečnou možnost
konfigurace na úrovni adresáře přes .htaccess bez nutnosti zásahu do
centrální konfigurace, díky čemuž zůstává standardem na sdílených
hostinzích. Volba mezi nimi by měla vycházet z konkrétních požadavků
(výkon vs. flexibilita konfigurace), ne z automatického předpokladu, že
novější nástroj je vždy lepší.
Kontrolní otázky
- V čem se liší způsob, jakým Apache a Nginx obsluhují velký počet
souběžných spojení, a proč to ovlivňuje spotřebu paměti? - K čemu slouží soubor
.htaccessa proč ho Nginx záměrně nepodporuje? - Uveďte situaci, kdy byste doporučili nasadit Apache místo Nginx, a
situaci, kdy naopak Nginx. - Jaký je apache ekvivalent příkazu
nginx -ta k čemu slouží?
Lekce na sebe nejsou zamčené — libovolnou lekci můžete otevřít i označit jako hotovou v jakémkoliv pořadí.