Modul 7 · 7.2
Webový server s nginx
Modul 7: Doména, webový server a https · Čas čítania: 12 minút
Cieľ lekcie: Po tejto lekcii dokážete nainštalovať nginx, nastaviť webovú stránku a reverse proxy pomocou server blocku, bezpečne otestovať a znovu načítať konfiguráciu a správne nastaviť práva vášho webrootu.
Kľúčové pojmy: nginx, server block, sites-available a sites-enabled, conf.d, listen, server_name, root, index, try_files, default server, nginx -t, reload, reverse proxy, proxy_pass, Host, X-Forwarded-For, X-Forwarded-Proto, webroot, PHP-FPM
Čo robí webový server
Webový server počúva na porte 80 (http) a 443 (https), prijíma požiadavky z prehliadačov a niečo vráti: súbor z disku (statická stránka) alebo odpoveď programu, ktorý beží za ním (PHP, aplikácia v Node.js, kontajner). V druhom prípade sa webový server nazýva reverse proxy: stojí vpredu, stará sa o https a požiadavku odovzdá aplikácii, ktorá počúva iba na 127.0.0.1.
V Linuxe sú najznámejšími webovými servermi nginx a Apache, a Caddy (lekcia 7.4) je moderná alternatíva, ktorá si certifikáty rieši sama. Táto lekcia používa nginx: je v každej distribúcii, šetrí pamäť a je štandardom v mnohých návodoch.
Inštalácia a prvý pohľad
anna@web1:~$ sudo apt install nginx
anna@web1:~$ systemctl status nginx
anna@web1:~$ curl -I http://localhost
HTTP/1.1 200 OK
Server: nginx/1.26.3
Content-Type: text/html(Číslo verzie je len príklad.) Nezabudnite na firewall: porty 80 a 443 musia byť otvorené (lekcia 5.2). Keď teraz otvoríte http://192.0.2.10, uvidíte uvítaciu stránku nginx.
Konfigurácia sa nachádza v /etc/nginx/:
| Cesta | Čo obsahuje |
|---|---|
nginx.conf | hlavný súbor; väčšinou ho nechávate tak |
sites-available/ | jeden súbor pre každú stránku (Debian a Ubuntu) |
sites-enabled/ | odkazy (symlinky) na stránky, ktoré sú zapnuté |
conf.d/*.conf | samostatné nastavenia, ktoré sa načítajú vždy |
snippets/ | časti, ktoré opakovane používate vo viacerých stránkach |
sites-available a sites-enabled sú zvykom Debianu a Ubuntu: stránku tak zapnete alebo vypnete vytvorením alebo odstránením odkazu, bez mazania samotného súboru.
Prvá stránka
Vytvorte priečinok pre stránku a testovaciu stránku:
anna@web1:~$ sudo mkdir -p /var/www/example.com
anna@web1:~$ echo '<h1>Het werkt</h1>' | sudo tee /var/www/example.com/index.htmlPotom vytvorte server block: popis jednej stránky.
# /etc/nginx/sites-available/example.com
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html;
location / {
try_files $uri $uri/ =404;
}
access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/example.com.error.log;
}Čítajte ho takto:
listen 80;alisten [::]:80;zabezpečia, že nginx počúva na IPv4 aj IPv6. Ak druhý riadok vynecháte, váš záznam AAAA nebude fungovať (lekcia 7.1).server_nameurčuje, pre ktoré názvy tento blok platí. nginx sa pri každej požiadavke pozrie na názov, ktorý prehliadač žiada (hlavička Host), a vyberie zodpovedajúci blok.rootje priečinok so súbormi,indexsúbor, ktorý sa zobrazí pri priečinku.try_filesskúsi požadovaný súbor, potom priečinok, a inak vráti 404. Bez takéhoto riadku môže chybná konfigurácia zobraziť viac, než chcete.- Vlastné logy pre každú stránku výrazne uľahčujú hľadanie (lekcia 6.2).
Zapnite stránku, odstráňte predvolenú stránku, otestujte a znovu načítajte:
anna@web1:~$ sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
anna@web1:~$ sudo rm /etc/nginx/sites-enabled/default
anna@web1:~$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
anna@web1:~$ sudo systemctl reload nginx
anna@web1:~$ curl -I http://example.com
HTTP/1.1 200 OKUrobte si z nginx -t pred každým reloadom pevný zvyk. Pri chybe vám povie, ktorý súbor a ktorý riadok, a vaša bežiaca stránka zostane nedotknutá. Ak reštartujete bez testu, nginx sa s chybou už nespustí a všetky vaše stránky budú nedostupné (lekcia 6.1).
Default server: čo dostane neznámy názov?
Čo sa stane, keď niekto pristúpi k vášmu serveru pod názvom, ktorý nie je v žiadnom server_name, alebo jednoducho cez IP adresu? Vtedy nginx vyberie default server: blok s default_server za listen, alebo inak prvý blok, na ktorý narazil. Ak o tom nepremýšľate, je to teda jedna z vašich skutočných stránok.
Čistejšie riešenie je samostatný blok, ktorý takéto požiadavky odmietne:
# /etc/nginx/sites-available/000-default
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
return 444;
}444 je špeciálny kód nginx: spojenie sa zatvorí bez odpovede. Skenery, ktoré prechádzajú IP adresy, tak nič neuvidia. Pre https (port 443) funguje default server trochu inak, pretože k nemu patrí certifikát; k tomu sa vrátime v lekcii 7.3.
nginx ako reverse proxy
Ak beží aplikácia na 127.0.0.1:3000 (lekcia 6.3) alebo kontajner na 127.0.0.1:3001 (lekcia 9.3), nginx ju sprístupní navonok:
server {
listen 80;
listen [::]:80;
server_name app.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}Štyri riadky proxy_set_header sú dôležité. Bez Host aplikácia nevie, pod akým názvom je navštívená. Bez X-Forwarded-For vidí aplikácia každú návštevu prichádzať z 127.0.0.1 (proxy) namiesto skutočnej adresy návštevníka. Bez X-Forwarded-Proto si aplikácia myslí, že všetko ide cez http, a niekedy vytvára odkazy alebo cookies pre http, hoci vaša stránka beží cez https. Mnohé aplikácie majú nastavenie, ktorým týmto hlavičkám dôverujú („trusted proxy“); zadajte tam iba 127.0.0.1, inak môže každý návštevník poslať falošnú adresu.
Aplikácie, ktoré používajú websockety (živé aktualizácie, napríklad Uptime Kuma), potrebujú ešte dva riadky: proxy_http_version 1.1; a odovzdanie Upgrade a Connection. Dokumentácia aplikácie zvyčajne presne uvádza, ktoré.
Práva webrootu
nginx v Debiane a Ubuntu spúšťa svoje pracovné procesy ako používateľ www-data. Ten musí vaše súbory vedieť čítať, ale nemal by ich môcť zapisovať. Dobré rozdelenie (lekcia 3.1):
anna@web1:~$ sudo chown -R anna:www-data /var/www/example.com
anna@web1:~$ sudo find /var/www/example.com -type d -exec chmod 750 {} \;
anna@web1:~$ sudo find /var/www/example.com -type f -exec chmod 640 {} \;Vy (anna) spravujete súbory, skupina www-data smie čítať, ostatní nič. Ak stránka musí niekam zapisovať, napríklad do priečinka na nahrávanie súborov, dajte právo zápisu pre www-data iba tomuto priečinku. Nikdy chmod 777 (lekcia 10.2). Ak dostanete 403 Forbidden, pozrite sa do chybového logu stránky: nájdete tam permission denied s cestou.
Niekoľko ďalších zvykov:
- Žiadne tajomstvá vo webroote. Zálohy (
site.zip), súbory.enva priečinky.gittam nepatria; ak sa tam predsa omylom ocitnú, dajú sa stiahnuť. Ďalšia poistka:location ~ /\. { deny all; }blokuje všetky súbory, ktoré začínajú bodkou (okrem toho, čo výslovne povolíte, napríklad/.well-known/, pozri lekciu 7.3 a 7.4). - Skrytie verzie.
server_tokens off;vnginx.confodstráni číslo verzie z hlavičkyServera z chybových stránok. Nie je to skutočné zabezpečenie, ale skenery tak získajú menej informácií.
PHP v skratke
Pri stránkach v PHP (napríklad WordPress) komunikuje nginx s PHP-FPM, samostatnou službou. V Debiane nainštalujete php-fpm a do server blocku pridáte blok location ~ \.php$ s include snippets/fastcgi-php.conf; a fastcgi_pass unix:/run/php/php8.4-fpm.sock; (číslo verzie sa líši podľa vydania). Kurz WordPressu sa tomu venuje podrobnejšie.
V AlmaLinux a Rocky Linux
Tam sites-available neexistuje: každú stránku uložíte ako samostatný súbor do /etc/nginx/conf.d/<naam>.conf. nginx beží ako používateľ nginx namiesto www-data a predvolený webroot je /usr/share/nginx/html. SELinux štandardne nedovolí nginx pripojiť sa k aplikácii za proxy_pass; povolíte to pomocou setsebool -P httpd_can_network_connect 1. Súbory mimo bežných priečinkov potrebujú SELinux label (semanage fcontext a restorecon).
Zhrnutie
- nginx poskytuje súbory alebo ako reverse proxy odovzdáva požiadavky aplikácii na
127.0.0.1. - Jeden server block pre každú stránku v
sites-available, zapnutie odkazom vsites-enabled; počúvajte na80aj[::]:80. - Vždy
nginx -tpredsystemctl reload nginx. - Vlastný default server s
return 444zabráni tomu, aby neznámy názov alebo holá IP adresa zobrazili niektorú z vašich stránok. - Ako reverse proxy odovzdávate
Host,X-Forwarded-ForaX-Forwarded-Proto; webroot je čitateľný prewww-data, nie zapisovateľný, a bez tajomstiev.
Kvíz
Úloha
Úloha O7.2: Vaša prvá stránka. Nainštalujte nginx (alebo použite Caddy z lekcie 7.4), vytvorte server block pre (sub)doménu, ktorá smeruje na váš server, s listen pre IPv4 a IPv6, vlastnými logmi a vlastným default serverom. Otestujte pomocou nginx -t, znovu načítajte a overte pomocou curl -I cez IPv4 aj IPv6. Nastavte práva webrootu ako v lekcii. Vyplňte kontrolný zoznam a vložte svoj server block.
Úloha O7.2: Vaša prvá stránka
Túto úlohu vykonávate sami, nikto ju nekontroluje. Odškrtnite, čo ste urobili, a označte úlohu ako splnenú.
Na holej IP adrese nič (spojenie sa zatvorí) alebo neutrálna stránka, nikdy nie stránka zákazníka. Zapisovať môže www-data iba do priečinka na nahrávanie, zvyšok je len na čítanie. Za proxy: Host, X-Real-IP, X-Forwarded-For a X-Forwarded-Proto.
Vaše zaškrtnutia a poznámky zostávajú iba v tomto prehliadači, nikam ich neposielame. Po prihlásení si v sekcii Moje kurzy uchovávame iba to, že ste úlohu splnili.
Ďalšie čítanie
- Zakázané (403): Nemáte povolenie na prístup k / na tomto serveri.
- Dokumentácia nginx, How nginx processes a request (server_name a default server): https://nginx.org/en/docs/http/request_processing.html
- Dokumentácia nginx, Beginner's Guide: https://nginx.org/en/docs/beginners_guide.html
- Dokumentácia nginx,
ngx_http_proxy_module: https://nginx.org/en/docs/http/ngx_http_proxy_module.html
