Modul 5 — Webové servery a reverzní proxy
21. Nginx: základní konfigurace a servírování statického obsahu
Instalace a struktura konfigurace Nginx, bloky server a location a servírování statických souborů.
Úvod a kontext
Webový server je software, který naslouchá na síťovém portu (typicky 80
pro HTTP, 443 pro HTTPS) a odpovídá na HTTP požadavky — ať už servíruje
statické soubory (HTML, obrázky, CSS), nebo předává požadavek jiné
aplikaci. Nginx (čte se "engine-x") je dnes nejrozšířenější webový
server na světě díky nízké spotřebě paměti, vysokému výkonu při velkém
počtu souběžných spojení a přehledné konfiguraci. Tato lekce ukazuje
instalaci, základní strukturu konfigurace a servírování statického
obsahu — nezbytný základ před tím, než se Nginx použije jako reverzní
proxy (další lekce).
Teorie
Instalace
Na Debianu/Ubuntu:
sudo apt update
sudo apt install nginx
Po instalaci Nginx automaticky běží jako systemd služba:
sudo systemctl status nginx
sudo systemctl enable nginx # spouštět i po restartu serveru
Výchozí stránka je pak dostupná na http://localhost/.
Struktura konfigurace
Hlavní konfigurační soubor je /etc/nginx/nginx.conf, ten ale typicky jen
nastavuje globální parametry a načítá další soubory ze složky
/etc/nginx/conf.d/ nebo (na Debianu/Ubuntu) /etc/nginx/sites-available/
+ /etc/nginx/sites-enabled/. Konvence na Debianu/Ubuntu:
- konfigurace jednotlivých webů se píší do
sites-available/nazev-webu, - symbolický odkaz v
sites-enabled/daný web aktivuje:
sudo ln -s /etc/nginx/sites-available/muj-web /etc/nginx/sites-enabled/
Díky tomu lze web dočasně vypnout smazáním symlinku, aniž by se smazala
samotná konfigurace.
Blok server
Konfigurace jednoho webu (tzv. "virtual host") se definuje blokem
server:
server {
listen 80;
server_name example.cz www.example.cz;
root /var/www/example.cz/html;
index index.html;
}
listen 80— port, na kterém tento blok naslouchá,server_name— doménová jména, pro která tento blok platí (Nginx podle
hlavičkyHostv HTTP požadavku vybere odpovídajícíserverblok —
jeden Nginx proces tak může obsluhovat desítky různých webů),root— adresář na disku, ze kterého se servírují soubory,index— výchozí soubor, pokud požadavek míří na adresář (/→
/var/www/example.cz/html/index.html).
Blok location
Uvnitř server bloku lze pravidla dál rozlišit podle cesty v URL pomocí
bloků location:
server {
listen 80;
server_name example.cz;
root /var/www/example.cz/html;
location / {
try_files $uri $uri/ =404;
}
location /static/ {
expires 30d;
add_header Cache-Control "public";
}
location = /health {
return 200 "OK";
}
}
location /— platí pro všechny cesty, které neodpovídají žádnému
specifičtějšímu bloku,try_files $uri $uri/ =404— zkusí nejdřív soubor přesně podle URL
($uri), pak adresář ($uri/), a pokud nic neexistuje, vrátí404,location /static/— specifičtější pravidlo pro danou cestu, zde
nastavuje cachovací hlavičky pro statické soubory,location = /health— přesná shoda (jen/health, ne
/health/cokoliv), typicky pro healthcheck endpoint.
Nginx vybírá nejspecifičtější odpovídající location blok, ne první,
na který narazí v pořadí v souboru — přesné shody (=) mají přednost před
prefixovými, delší prefix má přednost před kratším.
Testování a reload konfigurace
Před nasazením změny je vždy vhodné ověřit syntaxi:
sudo nginx -t
Výstup syntax is ok / test is successful potvrzuje, že konfigurace je
validní. Poté se změna aplikuje bez přerušení aktivních spojení:
sudo systemctl reload nginx
reload (na rozdíl od restart) donutí Nginx znovu načíst konfiguraci,
ale nezavře existující spojení — pro produkční servery je proto vždy
preferovaný před plným restartem.
Praktický příklad
Kompletní nasazení jednoduchého statického webu:
# 1. Vytvoření adresáře a obsahu
sudo mkdir -p /var/www/example.cz/html
echo '<h1>Vítejte na example.cz</h1>' | sudo tee /var/www/example.cz/html/index.html
# 2. Vytvoření konfigurace
sudo tee /etc/nginx/sites-available/example.cz <<'EOF'
server {
listen 80;
server_name example.cz www.example.cz;
root /var/www/example.cz/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
EOF
# 3. Aktivace webu
sudo ln -s /etc/nginx/sites-available/example.cz /etc/nginx/sites-enabled/
# 4. Ověření syntaxe a reload
sudo nginx -t
sudo systemctl reload nginx
Po dokončení je web dostupný na http://example.cz/ (za předpokladu, že
DNS záznam domény ukazuje na IP adresu serveru — viz lekce o DNS). Ověření
z příkazové řádky bez potřeby DNS, přímým dotazem na server s explicitní
hlavičkou Host:
curl -H "Host: example.cz" http://ip-adresa-serveru/
Shrnutí
Nginx konfiguruje jednotlivé weby jako server bloky rozlišené podle
server_name a portu, uvnitř kterých location bloky určují chování pro
konkrétní cesty URL. Konvence sites-available + sites-enabled
umožňuje web aktivovat/deaktivovat symlinkem bez mazání konfigurace.
Každá změna se má nejdřív ověřit nginx -t a pak aplikovat přes
systemctl reload, které na rozdíl od restartu nepřeruší aktivní
spojení.
Kontrolní otázky
- K čemu slouží adresáře
sites-availableasites-enableda proč se
nepoužívá jen jeden adresář s konfiguracemi? - Jaký je rozdíl mezi
location /alocation = /healtha který z nich
má při shodě přednost? - Proč je vhodné po každé změně konfigurace spustit
nginx -tještě
předsystemctl reload? - Napište
serverblok, který servíruje statické soubory z
/var/www/blog/htmlpro doménublog.example.cza vrací404pro
neexistující soubory.
Lekce na sebe nejsou zamčené — libovolnou lekci můžete otevřít i označit jako hotovou v jakémkoliv pořadí.