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.

Odhadovaná délka studia: 50 minut · Stav: nehotovo

Technologie: Apache

Ú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
    nebo mpm_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 Nginx server_name,
  • DocumentRoot — obdoba Nginx root,
  • <Directory> blok — nastavuje pravidla pro konkrétní adresář na disku;
    AllowOverride All povoluje přebití konfigurace souborem .htaccess
    (viz níže), Require all granted povoluje 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

  1. 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?
  2. K čemu slouží soubor .htaccess a proč ho Nginx záměrně nepodporuje?
  3. Uveďte situaci, kdy byste doporučili nasadit Apache místo Nginx, a
    situaci, kdy naopak Nginx.
  4. Jaký je apache ekvivalent příkazu nginx -t a 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í.