Prejsť na obsah

Nastavenia súborov cookie

Vyberte, aké druhy súborov cookie povolíte. Svoj výber môžete kedykoľvek zmeniť cez Nastavenia súborov cookie v dolnej časti každej stránky. Vyhlásenie o ochrane osobných údajov

Nevyhnutné

Vždy zapnuté

Potrebné na prihlásenie, uchovanie košíka a zapamätanie vašich volieb. Sú vždy zapnuté.

Ktoré súbory cookie?
  • weboke_sessie, weboke_klant, weboke_remember: vaša relácia a trvalé prihlásenie
  • weboke_basket: váš košík
  • wkBtwIncl: zobrazovanie cien s DPH alebo bez DPH
  • wok_cookies: váš výber súborov cookie, 12 mesiacov

Merajú, ktorá reklama vedie k návšteve alebo objednávke, aby sme neplatili za reklamy, ktoré nič neprinášajú.

Ktoré súbory cookie?
  • Google Ads cez Google Tag Manager (_gcl_au, _gcl_aw), najviac 90 dní
  • OpenAI Ads, reklamy v ChatGPT
  • wok_aff: ktorý partner vás k nám odporučil (partnerský program), 60 dní

4,6

Krajina a jazyk

Každá krajina má vlastný web s cenami a DPH danej krajiny.

Zobraziť

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.confhlavný 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/*.confsamostatné 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.html

Potom 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; a listen [::]: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_name urč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.
  • root je priečinok so súbormi, index súbor, ktorý sa zobrazí pri priečinku.
  • try_files skú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 OK

Urobte 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 .env a priečinky .git tam 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; v nginx.conf odstráni číslo verzie z hlavičky Server a 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 v sites-enabled; počúvajte na 80 aj [::]:80.
  • Vždy nginx -t pred systemctl reload nginx.
  • Vlastný default server s return 444 zabrá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-For a X-Forwarded-Proto; webroot je čitateľný pre www-data, nie zapisovateľný, a bez tajomstiev.

Kvíz

1. Upravili ste server block. Aké je bezpečné poradie?



2. Vaša stránka funguje cez IPv4, ale nie cez IPv6, hoci záznam AAAA je správny a firewall IPv6 povoľuje. Čo v server blocku pravdepodobne chýba?



3. Niekto otvorí http://192.0.2.10 (holú IP adresu) a uvidí webovú stránku jedného z vašich zákazníkov. Ako tomu zabránite?



4. Vaša aplikácia za proxy_pass vidí pri každej návšteve adresu 127.0.0.1. Čo chýba?



5. Aké práva sa hodia pre súbory statickej webovej stránky v /var/www/example.com?



Ú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ú.




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

Chvíľu strpenia…

Nastavte svoje domény

Pri každej doméne nastavte nameservery, prepojenie s hostingom a to, kto bude jej vlastníkom.

Načítavajú sa vaše domény…