Modul 7 · 7.2
Spletni strežnik z nginx
Modul 7: Domena, spletni strežnik in https · Čas branja: 12 minut
Učni cilj: Po tej lekciji boste znali namestiti nginx, s server blockom nastaviti spletno mesto in reverse proxy, varno preizkusiti in znova naložiti konfiguracijo ter pravilno nastaviti pravice svojega webroota.
Ključni pojmi: nginx, server block, sites-available in 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
Kaj počne spletni strežnik
Spletni strežnik posluša na vratih 80 (http) in 443 (https), sprejema zahteve brskalnikov in nekaj vrne: datoteko z diska (statično spletno mesto) ali odgovor programa, ki teče za njim (PHP, aplikacija Node.js, vsebnik). V drugem primeru spletnemu strežniku pravimo reverse proxy (obratni posrednik): stoji spredaj, skrbi za https in zahtevo posreduje aplikaciji, ki posluša samo na 127.0.0.1.
Na Linuxu sta najbolj znana spletna strežnika nginx in Apache, Caddy (lekcija 7.4) pa je sodobna alternativa, ki sama poskrbi za certifikate. V tej lekciji uporabljamo nginx: na voljo je v vsaki distribuciji, porabi malo pomnilnika in je privzeta izbira v mnogih navodilih.
Namestitev in 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(Številka različice je zgolj primer.) Ne pozabite na požarni zid: vrata 80 in 443 morajo biti odprta (lekcija 5.2). Če zdaj odprete http://192.0.2.10, boste videli pozdravno stran nginx.
Konfiguracija je v /etc/nginx/:
| Pot | Kaj |
|---|---|
nginx.conf | glavna datoteka; običajno je ne spreminjate |
sites-available/ | ena datoteka na spletno mesto (Debian in Ubuntu) |
sites-enabled/ | povezave (symlinki) do vklopljenih spletnih mest |
conf.d/*.conf | posamezne nastavitve, ki se vedno naložijo |
snippets/ | delčki, ki jih uporabite v več spletnih mestih |
sites-available in sites-enabled sta navada Debiana in Ubuntuja: tako spletno mesto vklopite ali izklopite tako, da ustvarite ali odstranite povezavo, ne da bi izbrisali datoteko.
Prvo spletno mesto
Ustvarite mapo za spletno mesto in testno stran:
anna@web1:~$ sudo mkdir -p /var/www/example.com
anna@web1:~$ echo '<h1>Het werkt</h1>' | sudo tee /var/www/example.com/index.htmlNato ustvarite server block: opis enega spletnega mesta.
# /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;
}Preberite ga takole:
listen 80;inlisten [::]:80;poskrbita, da nginx posluša na IPv4 in IPv6. Če pozabite drugo vrstico, Vaš zapis AAAA ne bo deloval (lekcija 7.1).server_namepove, za katera imena velja ta blok. nginx pri vsaki zahtevi pogleda ime, ki ga zahteva brskalnik (glava Host), in izbere ustrezen blok.rootje mapa z datotekami,indexpa datoteka, ki se prikaže pri mapi.try_filesposkusi zahtevano datoteko, nato mapo, sicer pa vrne 404. Brez take vrstice lahko napačna konfiguracija prikaže več, kot želite.- Lastne dnevniške datoteke za vsako spletno mesto močno olajšajo iskanje (lekcija 6.2).
Vklopite spletno mesto, odstranite privzeto spletno mesto, preizkusite in znova naložite:
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 OKNaj Vam nginx -t pred vsakim reloadom postane stalna navada. Ob napaki Vam pove, katera datoteka in katera vrstica, Vaše delujoče spletno mesto pa ostane nedotaknjeno. Če ponovno zaženete brez preizkusa, se nginx z napako ne zažene več in vsa Vaša spletna mesta so nedosegljiva (lekcija 6.1).
Default server: kaj dobi neznano ime?
Kaj se zgodi, če nekdo Vaš strežnik zahteva z imenom, ki ni v nobenem server_name, ali kar z naslovom IP? Takrat nginx izbere default server: blok z default_server za listen, sicer pa prvi blok, na katerega je naletel. Če o tem ne razmislite, je to torej eno od Vaših pravih spletnih mest.
Bolje je imeti ločen blok, ki take zahteve zavrne:
# /etc/nginx/sites-available/000-default
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
return 444;
}444 je posebna koda nginx: povezava se zapre brez odgovora. Pregledovalniki, ki preiskujejo naslove IP, tako ne vidijo ničesar. Za https (vrata 443) default server deluje nekoliko drugače, ker potrebuje certifikat; k temu se vrnemo v lekciji 7.3.
nginx kot reverse proxy
Če aplikacija teče na 127.0.0.1:3000 (lekcija 6.3) ali vsebnik na 127.0.0.1:3001 (lekcija 9.3), jo nginx izpostavi navzven:
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;
}
}Štiri vrstice proxy_set_header so pomembne. Brez Host aplikacija ne ve, pod katerim imenom jo obiskujejo. Brez X-Forwarded-For aplikacija vidi, da vsak obisk prihaja z 127.0.0.1 (posrednika), namesto s pravega naslova obiskovalca. Brez X-Forwarded-Proto aplikacija misli, da vse poteka prek http, in včasih ustvari povezave ali piškotke za http, čeprav Vaše spletno mesto teče prek https. Številne aplikacije imajo nastavitev, s katero zaupajo tem glavam ("trusted proxy"); vanjo vpišite samo 127.0.0.1, sicer lahko vsak obiskovalec pošlje lažen naslov.
Aplikacije, ki uporabljajo websockete (sprotne posodobitve, na primer Uptime Kuma), potrebujejo še dve vrstici: proxy_http_version 1.1; in posredovanje Upgrade ter Connection. Dokumentacija aplikacije običajno natančno pove, katere.
Pravice webroota
nginx na Debianu in Ubuntuju svoje delovne procese izvaja kot uporabnik www-data. Ta mora Vaše datoteke znati brati, ne sme pa jih pisati. Dobra razporeditev (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 datoteke, skupina www-data sme brati, ostali nič. Če mora spletno mesto nekam pisati, na primer v mapo za nalaganje datotek, dajte pravice pisanja za www-data samo tej mapi. Nikoli chmod 777 (lekcija 10.2). Če dobite 403 Forbidden, poglejte v dnevnik napak spletnega mesta: tam piše permission denied skupaj s potjo.
Še nekaj dobrih navad:
- Nobenih skrivnosti v webrootu. Varnostne kopije (
site.zip), datoteke.envin mape.gitne sodijo vanj; če jih tja pomotoma vseeno postavite, jih je mogoče prenesti. Dodatna varovalka:location ~ /\. { deny all; }blokira vse datoteke, ki se začnejo s piko (razen tistega, kar izrecno dovolite, na primer/.well-known/, glejte lekciji 7.3 in 7.4). - Skrijte različico.
server_tokens off;vnginx.confodstrani številko različice iz glaveServerin s strani z napakami. To ni prava zaščita, pregledovalnikom pa da manj informacij.
Na kratko o PHP
Za spletna mesta v PHP (na primer WordPress) nginx komunicira s PHP-FPM, ločeno storitvijo. Na Debianu namestite php-fpm in v server block dodate blok location ~ \.php$ z include snippets/fastcgi-php.conf; in fastcgi_pass unix:/run/php/php8.4-fpm.sock; (številka različice se razlikuje glede na izdajo). Tečaj o WordPressu se temu posveti podrobneje.
Na AlmaLinux in Rocky Linux
Tam sites-available ni: vsako spletno mesto postavite kot svojo datoteko v /etc/nginx/conf.d/<naam>.conf. nginx teče kot uporabnik nginx namesto www-data, privzeti webroot pa je /usr/share/nginx/html. SELinux privzeto ne dovoli, da bi se nginx povezal z aplikacijo za proxy_pass; to vklopite z setsebool -P httpd_can_network_connect 1. Datoteke zunaj običajnih map potrebujejo oznako SELinux (semanage fcontext in restorecon).
Povzetek
- nginx streže datoteke ali kot reverse proxy posreduje zahteve aplikaciji na
127.0.0.1. - En server block na spletno mesto v
sites-available, vklop s povezavo vsites-enabled; poslušajte na80in[::]:80. - Vedno
nginx -tpredsystemctl reload nginx. - Lasten default server z
return 444prepreči, da bi neznano ime ali goli naslov IP prikazal eno od Vaših spletnih mest. - Kot reverse proxy posredujete
Host,X-Forwarded-ForinX-Forwarded-Proto; webroot je berljiv zawww-data, ni zapisljiv in ne vsebuje skrivnosti.
Kviz
Naloga
Naloga O7.2: Vaše prvo spletno mesto. Namestite nginx (ali uporabite Caddy iz lekcije 7.4) in ustvarite server block za (pod)domeno, ki kaže na Vaš strežnik, z listen za IPv4 in IPv6, lastnimi dnevniškimi datotekami in lastnim default serverjem. Preizkusite z nginx -t, znova naložite in preverite z curl -I prek IPv4 in IPv6. Pravice webroota nastavite, kot je opisano v lekciji. Izpolnite kontrolni seznam in prilepite svoj server block.
Naloga O7.2: Vaše prvo spletno mesto
To nalogo opravite sami; nihče je ne pregleda. Odkljukajte, kar ste naredili, in nalogo označite kot opravljeno.
Na golem IP ničesar (povezava zaprta) ali nevtralna stran, nikoli spletno mesto stranke. Samo mapa za nalaganje je zapisljiva za www-data, vse ostalo samo za branje. Za posredniškim strežnikom: Host, X-Real-IP, X-Forwarded-For in X-Forwarded-Proto.
Vaše kljukice in zapiski ostanejo samo v tem brskalniku, nikamor jih ne pošiljamo. Če ste prijavljeni, v Moji tečaji shranimo samo podatek, da ste nalogo opravili.
Za nadaljnje branje
- Prepovedano (403): nimate dovoljenja za dostop do strežnika »/«.
- Dokumentacija nginx, How nginx processes a request (server_name in default server): https://nginx.org/en/docs/http/request_processing.html
- Dokumentacija nginx, Beginner's Guide: https://nginx.org/en/docs/beginners_guide.html
- Dokumentacija nginx,
ngx_http_proxy_module: https://nginx.org/en/docs/http/ngx_http_proxy_module.html
