Modul 7 · 7.2
Web-poslužitelj s nginxom
Modul 7: Domena, web-poslužitelj i https · Vrijeme čitanja: 12 minuta
Cilj učenja: Nakon ove lekcije moći ćete instalirati nginx, postaviti web-stranicu i reverse proxy pomoću server blocka, sigurno testirati i ponovno učitati konfiguraciju te ispravno postaviti prava pristupa Vašem webrootu.
Ključni pojmovi: nginx, server block, sites-available i 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
Što radi web-poslužitelj
Web-poslužitelj osluškuje na priključku 80 (http) i 443 (https), prima zahtjeve preglednika i nešto vraća: datoteku s diska (statična stranica) ili odgovor programa koji radi iza njega (PHP, Node.js aplikacija, kontejner). U tom se drugom slučaju web-poslužitelj naziva reverse proxy: stoji na ulazu, brine se za https i prosljeđuje zahtjev aplikaciji koja osluškuje samo na 127.0.0.1.
Na Linuxu su nginx i Apache najpoznatiji web-poslužitelji, a Caddy (lekcija 7.4) moderna je alternativa koja sama brine o certifikatima. Ova lekcija koristi nginx: dostupan je u svakoj distribuciji, štedljiv je s memorijom i standard je u mnogim uputama.
Instalacija i prvi pogled
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(Broj verzije samo je primjer.) Ne zaboravite vatrozid: priključci 80 i 443 moraju biti otvoreni (lekcija 5.2). Ako sada otvorite http://192.0.2.10, vidjet ćete pozdravnu stranicu nginxa.
Konfiguracija se nalazi u /etc/nginx/:
| Putanja | Što |
|---|---|
nginx.conf | glavna datoteka; uglavnom je ne dirate |
sites-available/ | jedna datoteka po stranici (Debian i Ubuntu) |
sites-enabled/ | poveznice (symlinks) na stranice koje su uključene |
conf.d/*.conf | zasebne postavke koje se uvijek učitavaju |
snippets/ | dijelovi koje ponovno koristite u više stranica |
sites-available i sites-enabled navika su Debiana i Ubuntua: tako stranicu uključujete ili isključujete stvaranjem ili uklanjanjem poveznice, bez brisanja same datoteke.
Prva stranica
Izradite mapu za stranicu i probnu stranicu:
anna@web1:~$ sudo mkdir -p /var/www/example.com
anna@web1:~$ echo '<h1>Het werkt</h1>' | sudo tee /var/www/example.com/index.htmlZatim izradite server block: opis jedne stranice.
# /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;
}Čitajte ga ovako:
listen 80;ilisten [::]:80;govore nginxu da osluškuje na IPv4 i na IPv6. Ako zaboravite drugi redak, Vaš AAAA zapis neće raditi (lekcija 7.1).server_nameodređuje za koja imena ovaj blok vrijedi. Pri svakom zahtjevu nginx gleda ime koje preglednik traži (zaglavlje Host) i bira odgovarajući blok.rootje mapa s datotekama, aindexdatoteka koja se prikazuje kada se zatraži mapa.try_filespokušava pronaći traženu datoteku, zatim mapu, a inače vraća 404. Bez takvog retka pogrešna konfiguracija može prikazati više nego što želite.- Zasebne datoteke zapisa po stranici znatno olakšavaju pretraživanje (lekcija 6.2).
Uključite stranicu, uklonite zadanu stranicu, testirajte i ponovno učitajte:
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 OKNeka Vam nginx -t prije svakog ponovnog učitavanja postane stalna navika. Kod pogreške Vam kaže o kojoj se datoteci i retku radi, a stranica koja radi ostaje netaknuta. Ako ponovno pokrenete nginx bez testiranja, s pogreškom se više neće pokrenuti i sve Vaše stranice bit će nedostupne (lekcija 6.1).
Default server: što dobiva nepoznato ime?
Što se događa ako netko zatraži Vaš poslužitelj s imenom koje se ne nalazi ni u jednom server_name, ili jednostavno s IP adresom? Tada nginx bira default server: blok s default_server iza listen, ili inače prvi blok na koji je naišao. Ako o tome ne razmislite, to je dakle jedna od Vaših stvarnih stranica.
Urednije je imati zaseban blok koji takve zahtjeve odbija:
# /etc/nginx/sites-available/000-default
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
return 444;
}444 poseban je kod nginxa: veza se zatvara bez odgovora. Skeneri koji pretražuju IP adrese tako ne vide ništa. Za https (priključak 443) default server radi nešto drugačije jer uz njega ide certifikat; na to se vraćamo u lekciji 7.3.
nginx kao reverse proxy
Ako na 127.0.0.1:3000 radi aplikacija (lekcija 6.3) ili na 127.0.0.1:3001 kontejner (lekcija 9.3), nginx ih čini dostupnima prema van:
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;
}
}Četiri retka proxy_set_header važna su. Bez Host aplikacija ne zna pod kojim joj se imenom pristupa. Bez X-Forwarded-For aplikacija vidi da svaki posjet dolazi s 127.0.0.1 (proxy) umjesto sa stvarne adrese posjetitelja. Bez X-Forwarded-Proto aplikacija misli da sve ide preko http-a te ponekad stvara poveznice ili kolačiće za http, iako Vaša stranica radi preko https-a. Mnoge aplikacije imaju postavku kojom se ovim zaglavljima vjeruje ("trusted proxy"); ondje upišite samo 127.0.0.1, inače svaki posjetitelj može poslati lažnu adresu.
Aplikacije koje koriste websockets (ažuriranja uživo, poput Uptime Kume) trebaju još dva retka: proxy_http_version 1.1; i prosljeđivanje Upgrade i Connection. Dokumentacija aplikacije obično točno navodi koje.
Prava pristupa webrootu
Na Debianu i Ubuntuu nginx pokreće svoje radne procese kao korisnik www-data. Taj korisnik mora moći čitati Vaše datoteke, ali ne bi ih smio moći pisati. Dobar raspored (lekcija 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 {} \;Vi (anna) upravljate datotekama, grupa www-data smije čitati, ostali ništa. Ako stranica mora negdje pisati, primjerice u mapu za prijenose, dajte pravo pisanja za www-data samo toj mapi. Nikada chmod 777 (lekcija 10.2). Ako dobijete 403 Forbidden, pogledajte zapis pogrešaka stranice: ondje stoji permission denied s putanjom.
Još nekoliko dobrih navika:
- Bez tajni u webrootu. Sigurnosne kopije (
site.zip), datoteke.envi mape.gitne pripadaju ondje; ako se ipak greškom nađu ondje, moguće ih je dohvatiti. Dodatna zaštitna mreža:location ~ /\. { deny all; }blokira sve datoteke koje počinju točkom (osim onoga što izričito dopustite, poput/.well-known/, vidi lekcije 7.3 i 7.4). - Skrivanje verzije.
server_tokens off;unginx.confuklanja broj verzije iz zaglavljaServeri stranica s pogreškama. To nije prava zaštita, ali skenerima daje manje informacija.
Ukratko o PHP-u
Za PHP stranice (poput WordPressa) nginx komunicira s PHP-FPM, zasebnom uslugom. Na Debianu instalirate php-fpm i u server block dodajete blok location ~ \.php$ s include snippets/fastcgi-php.conf; i fastcgi_pass unix:/run/php/php8.4-fpm.sock; (broj verzije razlikuje se ovisno o izdanju). Tečaj o WordPressu o tome govori detaljnije.
Na AlmaLinuxu i Rocky Linuxu
Ondje ne postoji sites-available: svaku stranicu stavljate kao zasebnu datoteku u /etc/nginx/conf.d/<naam>.conf. nginx radi kao korisnik nginx umjesto www-data, a zadani webroot je /usr/share/nginx/html. SELinux prema zadanim postavkama ne dopušta nginxu povezivanje s aplikacijom iza proxy_pass; to uključite s setsebool -P httpd_can_network_connect 1. Datoteke izvan uobičajenih mapa trebaju SELinux oznaku (semanage fcontext i restorecon).
Sažetak
- nginx poslužuje datoteke ili kao reverse proxy prosljeđuje zahtjeve aplikaciji na
127.0.0.1. - Jedan server block po stranici u
sites-available, uključivanje poveznicom usites-enabled; osluškujte na80i na[::]:80. - Uvijek
nginx -tprijesystemctl reload nginx. - Vlastiti default server s
return 444sprječava da nepoznato ime ili gola IP adresa prikaže jednu od Vaših stranica. - Kao reverse proxy prosljeđujete
Host,X-Forwarded-ForiX-Forwarded-Proto; webroot je čitljiv zawww-data, ali ne i zapisiv, i bez tajni.
Kviz
Zadatak
Zadatak O7.2: Vaša prva stranica. Instalirajte nginx (ili koristite Caddy iz lekcije 7.4) i izradite server block za (pod)domenu koja upućuje na Vaš poslužitelj, s listen za IPv4 i IPv6, zasebnim datotekama zapisa i vlastitim default serverom. Testirajte s nginx -t, ponovno učitajte i provjerite s curl -I preko IPv4 i IPv6. Postavite prava webroota kako je opisano u lekciji. Ispunite kontrolni popis i zalijepite svoj server block.
Zadatak O7.2: Vaša prva stranica
Ovaj zadatak rješavate sami; nitko ga ne provjerava. Označite što ste napravili i označite zadatak kao završen.
Na golom IP-u ništa (veza zatvorena) ili neutralna stranica, nikada stranica klijenta. Samo mapa za prijenos datoteka smije biti zapisiva za www-data, sve ostalo samo za čitanje. Iza proxyja: Host, X-Real-IP, X-Forwarded-For i X-Forwarded-Proto.
Vaše kvačice i bilješke ostaju samo u ovom pregledniku; ne šaljemo ih nikamo. Ako ste prijavljeni, u Moji tečajevi čuvamo samo podatak da ste zadatak završili.
Dodatno štivo
- Zabranjeno (403): Nemate dopuštenje za pristup / na ovom poslužitelju
- Dokumentacija nginxa, How nginx processes a request (server_name i default server): https://nginx.org/en/docs/http/request_processing.html
- Dokumentacija nginxa, Beginner's Guide: https://nginx.org/en/docs/beginners_guide.html
- Dokumentacija nginxa,
ngx_http_proxy_module: https://nginx.org/en/docs/http/ngx_http_proxy_module.html
