Nginx je rýchly webový server. Nastavíme s ním statický web alebo ho postavíme pred vašu aplikáciu ako reverse proxy a zapneme HTTPS s certifikátom Let's Encrypt, ktorý sa bude sám obnovovať.
Čo budete potrebovať
- VPS u StormHostu s Ubuntu 24.04 alebo Debianom 13
- Doménu nasmerovanú na IP adresu VPS (záznam
A, prípadneAAAA), postup: Doména na VPS a Cloudflare - Pripojenie cez SSH ako root (návod)
- Približne 25 minút
Ako to funguje#
Prehliadač sa pripojí na port 80 (HTTP) alebo 443 (HTTPS) vášho VPS. Nginx podľa domény v požiadavke vyberie správny server block (konfiguráciu jedného webu) a buď pošle súbor z disku (statický web), alebo požiadavku odovzdá aplikácii bežiacej na inom porte (reverse proxy).
Certifikát pre HTTPS vydá zadarmo Let's Encrypt. Program Certbot overí, že doménu ovládate (Let's Encrypt sa pripojí na port 80 a stiahne kontrolný súbor), certifikát stiahne, nastaví ho v Nginxe a potom ho sám obnovuje.
Predpoklady: DNS a porty#
Overte, že doména ukazuje na VPS. Na VPS spustite:
bash getent hosts example.czUvidíte IP adresu vášho VPS (zo záložky Sieť). Ak nie, upravte DNS a počkajte na prejavenie zmeny.
Otvorte porty 80 a 443:
- Firewall v zákazníckom účte (ak máte režim Blokovať všetko okrem povoleného): pravidlo Prichádzajúce · Povoliť · TCP · port
80,443. Návod: Firewall v zákazníckom účte. - UFW vo VPS (ak ho používate):
ufw allow 80/tcpaufw allow 443/tcp.
- Firewall v zákazníckom účte (ak máte režim Blokovať všetko okrem povoleného): pravidlo Prichádzajúce · Povoliť · TCP · port
Cloudflare: certifikát získajte so sivým obláčikom
Ak doménu spravujete v Cloudflare, nechajte záznamy počas získania certifikátu v stave DNS only (sivý obláčik). Keď certifikát máte, môžete prepnúť na Proxied, pozri Cloudflare a režimy SSL.
Inštalácia Nginxu#
Platí pre Ubuntu 24.04 aj Debian 13:
apt update
apt -y install nginxapt -y install nginx– nainštaluje Nginx. Služba sa hneď spustí a zapne po štarte VPS.
Overenie: v prehliadači otvorte http://<IP_ADRESA_VPS>. Za <IP_ADRESA_VPS> dosaďte IPv4 adresu zo záložky Sieť (napríklad http://203.0.113.10). Uvidíte uvítaciu stránku „Welcome to nginx!“.
Ako je konfigurácia usporiadaná#
| Cesta | Na čo slúži |
|---|---|
/etc/nginx/nginx.conf | Hlavná konfigurácia. Väčšinou ju nemeníte. Načítava súbory z priečinkov nižšie. |
/etc/ | Konfigurácie jednotlivých webov (server blocky). Súbor tu môže byť, ale aktívny nie je. |
/etc/ | Odkazy (symlinky) na súbory zo sites-available. Nginx načítava iba to, čo je tu. |
/etc/nginx/conf.d/ | Ďalšie konfigurácie, načítavajú sa všetky súbory *.conf. |
/var/www/ | Obvyklé miesto pre súbory webov. |
/var/log/nginx/ | Logy: access.log (požiadavky) a error.log (chyby). |
Web teda zapnete tak, že vytvoríte súbor v sites-available a odkaz naň v sites-enabled. Vypnete ho zmazaním odkazu.
Statický web#
Statický web sú hotové súbory HTML, CSS, JavaScript a obrázky.
Vytvorte priečinok webu a skúšobnú stránku:
bash mkdir -p /var/www/example.cz/html echo '<h1>Funguje to</h1>' > /var/www/example.cz/html/index.htmlmkdir -p– vytvorí priečinok aj s nadradenými.echo '…' > …/index.html– zapíše jednoduchú stránku do súboruindex.html.
Vlastné súbory webu neskôr nahrajte do tohto priečinka cez SFTP (návod) alebo v záložke Súbory.
Vytvorte konfiguráciu webu:
bash nano /etc/nginx/sites-available/example.cz/etc/ nginx/ nginxsites-available/ example.cz server { listen 80; listen [::]:80; server_name example.cz www.example.cz; root /var/www/example.cz/html; index index.html; location / { try_files $uri $uri/ =404; } }
| Direktíva | Čo robí | Kedy zmeniť |
|---|---|---|
listen 80; | Počúva na porte 80 pre IPv4. | Nikdy (HTTPS doplní Certbot). |
listen [::]:80; | To isté pre IPv6. | Zmažte, ak VPS nemá IPv6. |
server_name example.cz www.example.cz; | Domény, pre ktoré blok platí. Podľa nich Nginx vyberá web. | Uveďte svoje domény oddelené medzerou. |
root /var/ | Priečinok so súbormi webu. | Pri inom umiestnení súborov. |
index index.html; | Ktorý súbor poslať, keď adresa končí /. | Pri PHP weboch index.php index.html. |
location / { … } | Pravidlá pre všetky adresy webu. | – |
try_files $uri $uri/ =404; | Skúsi nájsť súbor, potom priečinok; keď nič neexistuje, vráti chybu 404. | Pri jednostránkových aplikáciách (React, Vue) try_files $uri $uri/ /index.html;. |
Zapnite web, vypnite predvolenú uvítaciu stránku, otestujte konfiguráciu a načítajte ju:
bash ln -s /etc/nginx/sites-available/example.cz /etc/nginx/sites-enabled/ rm /etc/nginx/sites-enabled/default nginx -t systemctl reload nginxln -s … /etc/– vytvorí odkaz, Nginx web začne načítavať.nginx/ sites-enabled/ rm /etc/– vypne predvolený web (súbor zostane vnginx/ sites-enabled/ default sites-available).nginx -t– skontroluje syntax všetkých konfigurácií. Musí skončiťsyntax is okatest is successful.systemctl reload nginx– načíta novú konfiguráciu bez prerušenia spojení.
Overenie: http://example.cz zobrazí nadpis „Funguje to“.
Reverse proxy pre aplikáciu#
Aplikácia (Node.js, Python, Java, kontajner Dockeru) zvyčajne beží na vlastnom porte, napríklad 3000. Nginx pred ňu postavíte ako reverse proxy: prijme požiadavky na porte 80/443 a prepošle ich aplikácii. Výhody: HTTPS rieši Nginx, aplikácia nemusí byť vidieť z internetu a na jednom VPS môže bežať viac aplikácií pod rôznymi doménami.
Aplikácia nech počúva iba na 127.0.0.1
Nastavte aplikáciu, aby počúvala na 127.0.0.1:3000, nie na 0.0.0.0:3000. Potom je dostupná iba cez Nginx a nikto ju neobíde priamym prístupom na port. Pri Dockeri publikujte port ako 127.0.0.1:3000:3000 (pozri Docker a Docker Compose).
Konfigurácia (namiesto statického webu, alebo ako ďalší súbor pre inú doménu, napríklad app.example.cz):
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
listen [::]:80;
server_name app.example.cz;
client_max_body_size 20m;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
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;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_read_timeout 300s;
}
}| Direktíva | Čo robí | Kedy zmeniť |
|---|---|---|
map $http_upgrade $connection_upgrade { … } | Pomocná premenná pre websockety: keď prehliadač žiada o upgrade spojenia, pošle sa upgrade, inak close. Stačí raz v celej konfigurácii (pri druhom výskyte ohlási nginx -t duplicitu). | Nikdy. |
client_max_body_size 20m; | Najväčšia veľkosť nahrávanej požiadavky. Predvolená je 1 MB; väčší upload skončí chybou 413. | Podľa toho, čo aplikácia prijíma. |
proxy_pass http://127.0.0.1:3000; | Kam sa požiadavky preposielajú. | Port vašej aplikácie. |
proxy_http_version 1.1; | Spojenie k aplikácii cez HTTP/1.1. Staršie verzie Nginxu inak používajú HTTP/1.0, s ktorým websockety nefungujú. | Nikdy. |
proxy_set_header Host $host; | Aplikácia uvidí pôvodnú doménu z prehliadača. | Nikdy. |
proxy_set_header X-Real-IP …, X-Forwarded-For … | Aplikácia uvidí skutočnú IP adresu návštevníka, nie 127.0.0.1. | Nikdy. |
proxy_set_header X-Forwarded-Proto $scheme; | Aplikácia rozpozná, že návštevník prišiel cez HTTPS (dôležité pre presmerovania a cookies). | Nikdy. |
Upgrade, Connection | Prenesú požiadavku na websocket (chat, živé aktualizácie, Socket.IO). | Nikdy. |
proxy_read_timeout 300s; | Ako dlho čakať na odpoveď aplikácie. Predvolených 60 s uzavrie nečinné websockety. | Predĺžte pri dlhých operáciách. |
Zapnutie je rovnaké ako pri statickom webe:
ln -s /etc/nginx/sites-available/app.example.cz /etc/nginx/sites-enabled/
nginx -t
systemctl reload nginxAby aplikácia bežala trvalo a po reštarte VPS sa spustila sama, nastavte ju ako službu: Aplikácia 24/7 cez systemd.
HTTPS cez Certbot#
Inštalácia Certbotu#
apt -y install certbot python3-certbot-nginxcertbot– klient pre Let's Encrypt.python3-certbot-nginx– doplnok, ktorý dokáže overiť doménu cez Nginx a sám upraviť jeho konfiguráciu.
Certbot zo snapu
Autori Certbotu odporúčajú inštaláciu cez snap, ktorá má vždy najnovšiu verziu. Balík z distribúcie (Ubuntu 24.04 má Certbot 2.9, Debian 13 verziu 4.0) funguje na bežné použitie rovnako a aktualizuje sa s ostatnými balíkmi. Ak chcete snap, postupujte podľa certbot.eff.org/instructions (otvorí sa v novom okne) a balíky z apt najprv odinštalujte, aby ste nemali dva Certboty.
Získanie certifikátu#
certbot --nginx -d example.cz -d www.example.cz--nginx– overenie cez Nginx a automatická úprava jeho konfigurácie.-d example.cz -d www.example.cz– domény, pre ktoré certifikát chcete. Každá musí mať DNS záznam mieriaci na VPS a musí byť uvedená vserver_nameniektorého webu.
Pri prvom spustení Certbot položí tieto otázky:
| Otázka | Čo odpovedať | Prečo |
|---|---|---|
E-mail (Enter email address…) | Svoju adresu | Let's Encrypt na ňu posiela dôležité oznámenia. Upozornenia na blížiaci sa koniec platnosti od roku 2025 neposiela, obnovu stráži automatika. |
Please read the Terms of Service… Do you agree? | Y | Bez súhlasu s podmienkami certifikát nedostanete. |
Would you be willing… to share your email address with the Electronic Frontier Foundation… | Y alebo N | Iba zasielanie noviniek EFF, na certifikát nemá vplyv. |
Výsledok: Successfully deployed certificate for example.cz to /etc/ a Congratulations! You have successfully enabled HTTPS….
Čo Certbot v konfigurácii zmenil#
Otvorte konfiguráciu webu (nano /etc/). Riadky označené # managed by Certbot pridal Certbot:
| Pridaný riadok | Čo robí |
|---|---|
listen 443 ssl; | Web počúva aj na porte 443 s TLS. |
listen [::]:443 ssl ipv6only=on; | To isté pre IPv6. Certbot ho pridá, keď blok obsahuje listen [::]:80. Voľbu ipv6only=on (počúvať na IPv6 iba pre IPv6 spojenia) doplní iba pri prvom webe na VPS, pri ďalších je riadok bez nej. |
ssl_certificate /etc/ | Certifikát (vrátane medzicertifikátov). |
ssl_certificate_key /etc/ | Súkromný kľúč certifikátu. Nikomu ho nedávajte. |
include /etc/ | Odporúčané nastavenie TLS od Certbotu (protokoly, šifry). |
ssl_dhparam /etc/ | Parametre pre výmenu kľúčov. |
nový server blok s return 301 https://… | Presmeruje HTTP na HTTPS. Certbot ho pridáva automaticky. |
Tieto riadky neupravujte ručne, ak presne neviete prečo. Certbot s nimi počíta pri obnove.
Automatická obnova#
Certifikát Let's Encrypt platí 90 dní (stav k októbru 2026, Let's Encrypt platnosť postupne skracuje). Balík Certbotu nainštaloval časovač, ktorý dvakrát denne skontroluje certifikáty a obnoví tie, ktorým zostáva zhruba tretina platnosti. Doplnok pre Nginx po obnove Nginx sám načíta znova.
Overte, že časovač existuje a že obnova prejde:
systemctl list-timers | grep certbot
certbot renew --dry-runsystemctl list-timers | grep certbot– vypíše riadok scertbot.timera časom ďalšieho spustenia.certbot renew --dry-run– vyskúša obnovu proti testovaciemu serveru, skutočné certifikáty nemení. Musí skončiťCongratulations, all simulated renewals succeeded.
Prehľad certifikátov a ich platnosti vypíše certbot certificates.
Limity Let's Encrypt
Let's Encrypt vydá pre rovnakú sadu domén najviac 5 certifikátov za 7 dní a po 5 neúspešných overeniach domény za hodinu vás dočasne zablokuje. Pri ladení preto používajte --dry-run (testovací server) a ostrý príkaz spustite, až keď test prejde.
Cloudflare a režimy SSL#
Ak web beží cez proxy Cloudflare (oranžový obláčik), šifrujú sa dve spojenia: medzi návštevníkom a Cloudflare a medzi Cloudflare a vaším VPS. Druhé určuje režim SSL/TLS v Cloudflare:
| Režim | Spojenie z Cloudflare na VPS | Odporúčanie |
|---|---|---|
| Off | Bez šifrovania | Nepoužívať. |
| Flexible | Nešifrované HTTP na port 80 | Nepoužívať. Spolu s presmerovaním na HTTPS v Nginxe vytvorí nekonečnú slučku (ERR_TOO_MANY_REDIRECTS). |
| Full | Rovnaký protokol ako pri návštevníkovi; pri HTTPS sa certifikát VPS neoveruje | Iba dočasne. |
| Full (strict) | Rovnaký protokol ako pri návštevníkovi; pri HTTPS s overením certifikátu VPS | Odporúčané. Váš certifikát Let's Encrypt je platný, takže funguje. |
Po prepnutí na Proxied spustite certbot renew --dry-run a overte, že obnova certifikátu prejde aj cez proxy Cloudflare. Ak zlyhá, skontrolujte, že v Cloudflare neblokujete port 80 vlastnými pravidlami. Trvalé riešenie pre pokročilých je overovať doménu cez DNS doplnkom python3-certbot-dns-cloudflare (postup v dokumentácii Certbotu (otvorí sa v novom okne)).
Základné zabezpečenie#
Skrytie verzie Nginxu. Na Debiane 13 je v
/etc/nginx/nginx.confuž predvolený riadokserver_tokens off;. Na Ubuntu 24.04 ho otvorte (nano /etc/nginx/nginx.conf) a v blokuhttpodstráňte#pred riadkom# server_tokens off;. Nginx potom neprezradí svoju verziu v hlavičkách ani na chybových stránkach.Bezpečnostné hlavičky. Do bloku
servers portom 443 môžete pridať:nginx add_header X-Content-Type-Options nosniff always; add_header X-Frame-Options SAMEORIGIN always; add_header Referrer-Policy strict-origin-when-cross-origin always;X-Content-Type-Options nosniff– prehliadač nebude hádať typ súboru (ochrana proti podvrhnutým skriptom).X-Frame-Options SAMEORIGIN– web nepôjde vložiť do cudzej stránky v ráme (ochrana proti clickjackingu).Referrer-Policy strict-origin-when-cross-origin– cudzím webom sa pošle iba doména, nie celá adresa stránky.always– hlavička sa pošle aj pri chybových odpovediach.
Po každej zmene spustite
nginx -tasystemctl reload nginx.
HSTS až po rozmyslení
Hlavička Strict-Transport-Security (HSTS) prikáže prehliadačom používať pre doménu iba HTTPS, a to aj mesiace dopredu. Keď potom HTTPS prestane fungovať (vypršanie certifikátu, presun domény), web sa nenačíta. Zapínajte ju, až keď HTTPS beží spoľahlivo.
Overenie#
curl -I http://example.cz
curl -I https://example.czcurl -I– stiahne iba hlavičky odpovede.
Prvý príkaz vráti HTTP/1.1 301 Moved Permanently s hlavičkou Location: https://example.cz/, druhý HTTP/1.1 200 OK (alebo HTTP/2 200). V prehliadači uvidíte pri adrese zámok.
Keď niečo nefunguje#
nginx -t hlási chybu#
Výpis obsahuje súbor a číslo riadka, napríklad unexpected "}" in /etc/. Najčastejšie chýba bodkočiarka na konci direktívy alebo je navyše či chýba zložená zátvorka. Opravte riadok a test spustite znova. Nginx s chybnou konfiguráciou nereštartujte, nenaštartoval by.
502 Bad Gateway#
Nginx beží, ale aplikácia za ním neodpovedá. Skontrolujte, že aplikácia beží a počúva na porte z proxy_pass:
ss -tlnp | grep 3000ss -tlnp– počúvajúce TCP porty s názvami programov.
Keď sa nič nevypíše, aplikácia nebeží alebo počúva inde. Podrobnosti nájdete v /var/log/nginx/error.log (riadok s connect() failed (111: Connection refused)).
504 Gateway Time-out#
Aplikácia odpovedala neskoro. Zvýšte proxy_read_timeout, alebo zistite, prečo je aplikácia pomalá.
413 Request Entity Too Large#
Nahrávaný súbor je väčší než client_max_body_size (predvolené 1 MB). Zvýšte hodnotu v bloku server a načítajte konfiguráciu.
Zobrazuje sa „Welcome to nginx!“ namiesto webu#
Stále je aktívny predvolený web, alebo doména v server_name nezodpovedá adrese v prehliadači. Zmažte /etc/ a skontrolujte server_name.
Nginx nenaštartuje: Address already in use#
Port 80 alebo 443 drží iný program, typicky Apache. Zistite ktorý: ss -tlnp | grep -E ':80 |:443 '. Apache zastavte a vypnite (systemctl disable --now apache2), alebo ho odinštalujte.
Certbot: Could not automatically find a matching server block#
Žiadny web nemá v server_name doménu, pre ktorú certifikát žiadate. Doplňte ju do server_name, spustite nginx -t, systemctl reload nginx a Certbot znova.
Certbot: Timeout during connect (likely firewall problem) alebo Connection refused#
Let's Encrypt sa nedostal na port 80. Skontrolujte DNS (getent hosts example.cz), firewall v zákazníckom účte a UFW. Ak má doména záznam AAAA, musí ukazovať na IPv6 adresu tohto VPS a web musí počúvať aj na IPv6 (listen [::]:80;).
Cloudflare: chyba 521, 522, 525 alebo 526#
- 521 – VPS spojenie odmietol: Nginx nebeží alebo firewall blokuje port 443.
- 522 – spojenie vypršalo: VPS je nedostupný alebo firewall pakety zahadzuje.
- 525 – nepodarilo sa nadviazať TLS: Nginx na porte 443 nemá platnú konfiguráciu HTTPS.
- 526 – certifikát na VPS je neplatný alebo prešlý, a to v režime Full (strict). Skontrolujte
certbot certificates.
ERR_TOO_MANY_REDIRECTS#
Typicky Cloudflare v režime Flexible spolu s presmerovaním na HTTPS. Prepnite Cloudflare na Full (strict).
Zhrnutie
- Weby sú v
/etc/, aktívne sú iba tie s odkazom vnginx/ sites-available/ sites-enabled. - Po každej zmene:
nginx -tasystemctl reload nginx. - Aplikácia nech počúva na
127.0.0.1a Nginx ju sprístupní cezproxy_passvrátane hlavičiekX-Forwarded-*. - Certifikát získate príkazom
certbot --nginx -d …; obnovuje sa sám, overítecertbot renew --dry-run. - S Cloudflare používajte režim Full (strict), nikdy Flexible.
Ďalšie zdroje#
- nginx: Beginner's Guide (otvorí sa v novom okne)
- nginx: WebSocket proxying (otvorí sa v novom okne)
- nginx: ngx_http_proxy_module (otvorí sa v novom okne)
- Certbot: User Guide (otvorí sa v novom okne)
- Let's Encrypt: Rate Limits (otvorí sa v novom okne)
- Cloudflare: SSL/TLS encryption modes (otvorí sa v novom okne)