Nginx: inštalácia, nastavenie webu a reverzný proxy krok za krokom
Nginx je webserver, ktorý na Linuxe zvládne tri úlohy: posiela statické súbory, funguje ako reverzný proxy pred aplikáciou a rozdeľuje záťaž medzi niekoľko serverov. Na novom VPS ho nainštalujete jedným príkazom z balíčkov distribúcie, nastavíte v súbore nginx.conf a každú zmenu overíte príkazom nginx -t. Nižšie je postup od inštalácie po chyby 502 a 403 a ich hľadanie v logoch.
Podľa hesla Nginx na Wikipédii ho vytvoril ruský vývojár Igor Sysoev a verejne vyšiel v roku 2004. Projekt sám seba opisuje ako HTTP webserver, reverzný proxy, cache, load balancer a proxy pre TCP, UDP a poštu pod licenciou 2-clause BSD.
Na čo nginx slúži
| Úloha | Čo nginx robí | Hlavná direktíva |
|---|---|---|
| Webserver | posiela súbory z disku | root |
| Reverzný proxy | prijme požiadavku a odovzdá ju aplikácii | proxy_pass |
| Load balancer | rozdeľuje požiadavky medzi skupinu serverov | upstream |
| Aplikácia cez FastCGI, napríklad PHP | odovzdá požiadavku FastCGI serveru | fastcgi_pass |
Reverzný proxy prijíma požiadavky od klientov, posiela ich inému serveru, preberá jeho odpoveď a vracia ju klientovi. Aplikácia tak môže počúvať len na lokálnej adrese a z internetu je vidieť iba nginx. Load balancer bez ďalšieho nastavenia rozdeľuje požiadavky postupne (round-robin), k dispozícii sú aj metódy least_conn a ip_hash.
Inštalácia z balíčkov distribúcie
sudo apt update && sudo apt install nginx # Debian, Ubuntu
sudo dnf install nginx # RHEL
sudo systemctl enable nginx # RHEL: spúšťanie pri štarte
sudo systemctl start nginx # RHEL: spustenie
Podľa dokumentácie Ubuntu inštalácia nginx aj spustí a predvolená stránka s textom Welcome to nginx! je dostupná na adrese servera. Predvolený web číta Ubuntu z /var/www/html a RHEL z /usr/share/nginx/html/. Ak firewall z článku Prvých tridsať minút na novom VPS pustí len SSH, pridajte porty webu: sudo ufw allow 80/tcp a rovnako pre 443.
Verziu zistíte príkazom nginx -v. Ak potrebujete inú verziu, než ponúka distribúcia, nginx.org prevádzkuje vlastné repozitáre pre RHEL, Debian, Ubuntu a ďalšie systémy. Predvolene používajú stabilnú vetvu, mainline sa zapína osobitne.
Štruktúra konfigurácie
Hlavný súbor sa volá nginx.conf a v balíčkoch pre Debian, Ubuntu aj RHEL leží v /etc/nginx. Skladá sa z direktív: jednoduchá končí bodkočiarkou, blok má zložené zátvorky. Blok, ktorý smie obsahovať ďalšie direktívy, sa volá kontext. Direktívy events a http ležia v hlavnom kontexte, server v http a location v server.
Každý server je jeden virtuálny server. Nginx ho vyberie podľa portu v listen a hlavičky Host porovnanej so server_name. Ak nesedí žiadny, odpovie predvolený server pre daný port, teda prvý v poradí alebo ten s parametrom default_server. Vnútri servera vyberie najdlhší zhodný prefix medzi blokmi location, potom skúša regulárne výrazy v poradí zápisu a prvý zhodný vyhráva. Ak žiadny nesedí, platí zapamätaný prefix. Výnimkou je prefix s modifikátorom ^~, po ktorom sa regulárne výrazy už nekontrolujú.
Na Debiane a Ubuntu je každý web v samostatnom súbore v /etc/nginx/sites-available/ a zapína sa symlinkom v sites-enabled/:
sudo ln -s /etc/nginx/sites-available/example.org /etc/nginx/sites-enabled/
sudo rm /etc/nginx/sites-enabled/default
Druhý príkaz vypne predvolený web, ak ho už nepotrebujete. Na RHEL podľa dokumentácie Red Hat upravujete /etc/nginx/nginx.conf.
Statický web a reverzný proxy
Statický web v adresári /srv/example.org/html:
server {
listen 80;
server_name example.org www.example.org;
root /srv/example.org/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
Direktíva root k ceste len pripočíta adresu z požiadavky, takže /about.html sa hľadá v /srv/example.org/html/about.html. Direktíva index určuje súbor pre adresy zakončené lomkou. Direktíva try_files skúša súbory v zadanom poradí ($uri/ s lomkou na konci kontroluje adresár) a ak nenájde žiadny, vráti kód z posledného parametra, tu 404.
Reverzný proxy pred aplikáciou na porte 3000:
server {
listen 80;
server_name app.example.org;
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;
}
}
Nginx štandardne neodovzdáva aplikácii hlavičku Host z pôvodnej požiadavky, ale hodnotu $proxy_host, teda adresu z proxy_pass. Riadok s $host to mení. Hlavičky X-Real-IP a X-Forwarded-For nesú adresu klienta, aby aplikácia nevidela iba 127.0.0.1. Skupinu serverov pre load balancer definuje blok upstream v kontexte http a na jeho názov ukáže proxy_pass http://aplikacia;:
upstream aplikacia {
server 127.0.0.1:3000;
server 127.0.0.1:3001;
}
Kontrola, načítanie a logy
- Po úprave spustite
sudo nginx -t. Príkaz skontroluje syntax a potom sa pokúsi otvoriť súbory spomenuté v konfigurácii. - Ak test prejde, načítajte zmeny príkazom
sudo nginx -s reloadalebosudo systemctl reload nginx. Hlavný proces overí novú konfiguráciu a pri chybe ostane pri starej, staré pracovné procesy dokončia rozbehnuté požiadavky. Bez načítania sa zmeny neprejavia. - Správny server otestujete z terminálu:
curl -I -H 'Host: example.org' http://127.0.0.1/. O tom, ktorý server odpovie, rozhoduje práve hlavička Host. - Pri probléme sledujte log:
sudo tail -f /var/log/nginx/error.log.
Logy access.log a error.log sú podľa dokumentácie v /var/log/nginx alebo v /usr/local/nginx/logs. Do error.log sa predvolene zapisuje úroveň error a závažnejšie.
Typické chyby
| Príznak | Príčina a postup |
|---|---|
| 502 Bad Gateway | Nginx ako proxy nedostal od aplikácie použiteľnú odpoveď. Ak sa nevie ani pripojiť, error.log obsahuje connect() failed (111: Connection refused) while connecting to upstream. Overte, či aplikácia beží a či počúva na porte z proxy_pass: sudo ss -tlnp. |
| 504 Gateway Timeout | Aplikácia neodpovedala včas. Limity proxy_connect_timeout a proxy_read_timeout sú predvolene 60 s. Najprv zistite, prečo je aplikácia pomalá, až potom limit zvyšujte. |
403, v logu directory index of ... is forbidden | Adresa končí lomkou, v adresári chýba súbor z index a autoindex je predvolene vypnutý. Pridajte index.html. |
403, v logu Permission denied | Pracovný proces nemá právo čítať súbor alebo prejsť adresárom na ceste k nemu. Pri adresári ide o právo x. Používateľa určuje direktíva user (predvolene nobody), práva po celej ceste ukáže namei -l /srv/example.org/html/index.html. |
| 404 pri existujúcom súbore | Zlý root: nginx k nemu pripočíta adresu z požiadavky, súbor teda hľadá inde, než čakáte. |
| Namiesto webu Welcome to nginx! | Hlavička Host nesedí so žiadnym server_name, napríklad pri prístupe cez IP adresu, takže odpovedal predvolený server. Alebo ostal zapnutý default v sites-enabled. |
| Zmena sa neprejavila | Chýba načítanie konfigurácie, pozri predošlý postup. |
Časté otázky
Čo je nginx a na čo slúži?
Nginx je HTTP webserver, reverzný proxy, cache, load balancer a proxy pre TCP, UDP a poštu. Môže posielať statické súbory z disku aj odovzdávať požiadavky aplikácii cez proxy_pass.
Ako skontrolovať konfiguráciu nginx a načítať zmeny?
Príkaz nginx -t skontroluje syntax a pokúsi sa otvoriť súbory z konfigurácie. Zmeny sa uplatnia po nginx -s reload alebo systemctl reload nginx. Pri chybe ostane v behu stará konfigurácia.
Kde je konfigurácia a logy nginx?
Hlavný súbor je nginx.conf, predvolene v /etc/nginx. Na Debiane a Ubuntu sú weby v sites-available a zapínajú sa symlinkom v sites-enabled. Logy access.log a error.log sú v /var/log/nginx.
Čo znamená chyba 502 Bad Gateway v nginx?
Nginx ako proxy nedostal od aplikácie použiteľnú odpoveď, napríklad sa k nej nevedel pripojiť. Skontrolujte, či aplikácia beží na porte z proxy_pass, a pozrite error.log.
Prečo nginx vracia 403 Forbidden?
Buď chýba index súbor pri vypnutom autoindexe, alebo pracovný proces nemá právo čítať súbor či prejsť adresármi k nemu. Rozhodne error.log: directory index is forbidden alebo Permission denied.
- nginx.org: Beginner's Guide
- nginx.org: modul ngx_http_core_module (root, try_files, location, listen)
- nginx.org: modul ngx_http_proxy_module (proxy_pass, proxy_set_header)
- nginx.org: Using nginx as HTTP load balancer
- nginx.org: nginx command-line parameters (-t, -s)
- Ubuntu Server dokumentácia: How to configure nginx
Ďalšie návody

SEO optimalizácia webu: rýchlosť servera, HTTPS a technický základ
SEO optimalizácia webu na úrovni servera: stavové kódy, HTTPS a presmerovania, TTFB a Core Web Vitals, robots.txt, sitemap.xml a logy Googlebota.
Vypratávanie Bratislava: čo so servermi a diskami, kým sa kancelária vyprázdni
Vypratávanie Bratislava z pohľadu IT: inventúra techniky, overená záloha, vymazanie disku (shred, nwipe, secure erase SSD) a odovzdanie elektroodpadu.

Písanie bakalárskych prác z informatiky: praktická časť na serveri
Písanie bakalárskych prác z informatiky: rozsah a náležitosti podľa usmernenia 56/2011, praktická časť na serveri, dokumentácia, citovanie a originalita.