Prijeđite na sadržaj

Postavke kolačića

Za svaku vrstu odaberite koje kolačiće dopuštate. Svoj odabir uvijek možete promijeniti putem poveznice Postavke kolačića na dnu svake stranice. Izjava o privatnosti

Nužni

Uvijek uključeni

Potrebni za prijavu, čuvanje košarice i pamćenje Vaših odabira. Uvijek su uključeni.

Koji kolačići?
  • weboke_sessie, weboke_klant, weboke_remember: Vaša sesija i to da ostanete prijavljeni
  • weboke_basket: Vaša košarica
  • wkBtwIncl: prikaz cijena s PDV-om ili bez njega
  • wok_cookies: Vaš odabir kolačića, 12 mjeseci

Mjeri koji oglas dovodi do posjeta ili narudžbe, kako ne bismo plaćali oglase koji ništa ne donose.

Koji kolačići?
  • Google Ads putem Google Tag Managera (_gcl_au, _gcl_aw), do 90 dana
  • OpenAI Ads, oglasi u ChatGPT-u
  • wok_aff: preko kojeg ste partnera došli k nama (partnerski program), 60 dana

4,6

Država i jezik

Svaka država ima vlastitu stranicu, s cijenama i PDV-om te države.

Pogledajte

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.confglavna 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/*.confzasebne 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.html

Zatim 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; i listen [::]: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_name određuje za koja imena ovaj blok vrijedi. Pri svakom zahtjevu nginx gleda ime koje preglednik traži (zaglavlje Host) i bira odgovarajući blok.
  • root je mapa s datotekama, a index datoteka koja se prikazuje kada se zatraži mapa.
  • try_files pokuš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 OK

Neka 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 .env i mape .git ne 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; u nginx.conf uklanja broj verzije iz zaglavlja Server i 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 u sites-enabled; osluškujte na 80 i na [::]:80.
  • Uvijek nginx -t prije systemctl reload nginx.
  • Vlastiti default server s return 444 sprječava da nepoznato ime ili gola IP adresa prikaže jednu od Vaših stranica.
  • Kao reverse proxy prosljeđujete Host, X-Forwarded-For i X-Forwarded-Proto; webroot je čitljiv za www-data, ali ne i zapisiv, i bez tajni.

Kviz

1. Izmijenili ste server block. Koji je siguran redoslijed?



2. Vaša stranica radi preko IPv4, ali ne preko IPv6, iako je AAAA zapis ispravan i vatrozid propušta IPv6. Što vjerojatno nedostaje u server blocku?



3. Netko otvori http://192.0.2.10 (golu IP adresu) i vidi web-stranicu jednog od Vaših klijenata. Kako to spriječiti?



4. Vaša aplikacija iza proxy_pass pri svakom posjetu vidi adresu 127.0.0.1. Što nedostaje?



5. Koja prava odgovaraju datotekama statične web-stranice u /var/www/example.com?



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.




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

Trenutak…

Postavite svoje domene

Za svaku domenu odredite nameservere, povezivanje s hostingom i tko postaje vlasnik.

Učitavanje Vaših domena…