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ů.

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

Technologie: Nginx

Ú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čky Host v HTTP požadavku vybere odpovídající server blok —
    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

  1. K čemu slouží adresáře sites-available a sites-enabled a proč se
    nepoužívá jen jeden adresář s konfiguracemi?
  2. Jaký je rozdíl mezi location / a location = /health a který z nich
    má při shodě přednost?
  3. Proč je vhodné po každé změně konfigurace spustit nginx -t ještě
    před systemctl reload?
  4. Napište server blok, který servíruje statické soubory z
    /var/www/blog/html pro doménu blog.example.cz a vrací 404 pro
    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í.