Prejsť na obsah
Aktuálny kupón:zľava 10 %Uplatniť v objednávke

Web na VPS: Nginx a certifikát Let's Encrypt (HTTPS)

Nainštalujete Nginx, sprevádzkujete statický web alebo reverse proxy pre aplikáciu (Node.js a ďalšie) a získate zadarmo certifikát Let's Encrypt s automatickou obnovou.

  • pokročilý
  • ~25 min
  • Aktualizované 9. 10. 2026

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ípadne AAAA), 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#

  1. Overte, že doména ukazuje na VPS. Na VPS spustite:

    bash
    getent hosts example.cz

    Uvidíte IP adresu vášho VPS (zo záložky Sieť). Ak nie, upravte DNS a počkajte na prejavenie zmeny.

  2. 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/tcp a ufw allow 443/tcp.

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:

bash
apt update
apt -y install nginx
  • apt -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á#

CestaNa čo slúži
/etc/nginx/nginx.confHlavná konfigurácia. Väčšinou ju nemeníte. Načítava súbory z priečinkov nižšie.
/etc/nginx/sites-available/Konfigurácie jednotlivých webov (server blocky). Súbor tu môže byť, ale aktívny nie je.
/etc/nginx/sites-enabled/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.

  1. 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.html
    • mkdir -p – vytvorí priečinok aj s nadradenými.
    • echo '…' > …/index.html – zapíše jednoduchú stránku do súboru index.html.

    Vlastné súbory webu neskôr nahrajte do tohto priečinka cez SFTP (návod) alebo v záložke Súbory.

  2. Vytvorte konfiguráciu webu:

    bash
    nano /etc/nginx/sites-available/example.cz
    /etc/nginx/sites-available/example.cznginx
    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/www/example.cz/html;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;.
  1. 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 nginx
    • ln -s … /etc/nginx/sites-enabled/ – vytvorí odkaz, Nginx web začne načítavať.
    • rm /etc/nginx/sites-enabled/default – vypne predvolený web (súbor zostane v sites-available).
    • nginx -t – skontroluje syntax všetkých konfigurácií. Musí skončiť syntax is ok a test 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):

/etc/nginx/sites-available/app.example.cznginx
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, ConnectionPrenesú 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:

bash
ln -s /etc/nginx/sites-available/app.example.cz /etc/nginx/sites-enabled/
nginx -t
systemctl reload nginx

Aby 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#

bash
apt -y install certbot python3-certbot-nginx
  • certbot – 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#

bash
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á v server_name niektorého webu.

Pri prvom spustení Certbot položí tieto otázky:

OtázkaČo odpovedaťPrečo
E-mail (Enter email address…)Svoju adresuLet'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?YBez súhlasu s podmienkami certifikát nedostanete.
Would you be willing… to share your email address with the Electronic Frontier Foundation…Y alebo NIba zasielanie noviniek EFF, na certifikát nemá vplyv.

Výsledok: Successfully deployed certificate for example.cz to /etc/nginx/sites-enabled/example.cz a Congratulations! You have successfully enabled HTTPS….

Čo Certbot v konfigurácii zmenil#

Otvorte konfiguráciu webu (nano /etc/nginx/sites-available/example.cz). 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/letsencrypt/live/example.cz/fullchain.pem;Certifikát (vrátane medzicertifikátov).
ssl_certificate_key /etc/letsencrypt/live/example.cz/privkey.pem;Súkromný kľúč certifikátu. Nikomu ho nedávajte.
include /etc/letsencrypt/options-ssl-nginx.conf;Odporúčané nastavenie TLS od Certbotu (protokoly, šifry).
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;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:

bash
systemctl list-timers | grep certbot
certbot renew --dry-run
  • systemctl list-timers | grep certbot – vypíše riadok s certbot.timer a č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žimSpojenie z Cloudflare na VPSOdporúčanie
OffBez šifrovaniaNepoužívať.
FlexibleNešifrované HTTP na port 80Nepoužívať. Spolu s presmerovaním na HTTPS v Nginxe vytvorí nekonečnú slučku (ERR_TOO_MANY_REDIRECTS).
FullRovnaký protokol ako pri návštevníkovi; pri HTTPS sa certifikát VPS neoverujeIba dočasne.
Full (strict)Rovnaký protokol ako pri návštevníkovi; pri HTTPS s overením certifikátu VPSOdporúč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#

  1. Skrytie verzie Nginxu. Na Debiane 13 je v /etc/nginx/nginx.conf už predvolený riadok server_tokens off;. Na Ubuntu 24.04 ho otvorte (nano /etc/nginx/nginx.conf) a v bloku http odstráňte # pred riadkom # server_tokens off;. Nginx potom neprezradí svoju verziu v hlavičkách ani na chybových stránkach.

  2. Bezpečnostné hlavičky. Do bloku server s 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.
  3. Po každej zmene spustite nginx -t a systemctl 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#

bash
curl -I http://example.cz
curl -I https://example.cz
  • curl -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/nginx/sites-enabled/example.cz:12. 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:

bash
ss -tlnp | grep 3000
  • ss -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/nginx/sites-enabled/default 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/nginx/sites-available/, aktívne sú iba tie s odkazom v sites-enabled.
  • Po každej zmene: nginx -t a systemctl reload nginx.
  • Aplikácia nech počúva na 127.0.0.1 a Nginx ju sprístupní cez proxy_pass vrátane hlavičiek X-Forwarded-*.
  • Certifikát získate príkazom certbot --nginx -d …; obnovuje sa sám, overíte certbot renew --dry-run.
  • S Cloudflare používajte režim Full (strict), nikdy Flexible.

Hľadanie v návodoch