Moodul 7 · 7.2
Veebiserver nginxiga
Moodul 7: Domeen, veebiserver ja https · Lugemisaeg: 12 minutit
Õpieesmärk: Pärast seda õppetundi oskad paigaldada nginxi, seadistada server blocki abil veebisaidi ja reverse proxy, seadistust turvaliselt testida ja uuesti laadida ning seada oma webrooti õigused õigesti.
Põhimõisted: nginx, server block, sites-available ja 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
Mida veebiserver teeb
Veebiserver kuulab porte 80 (http) ja 443 (https), võtab brauseritelt päringuid vastu ja saadab midagi tagasi: faili kettalt (staatiline sait) või selle programmi vastuse, mis töötab tema taga (PHP, Node.js-rakendus, konteiner). Teisel juhul nimetatakse veebiserverit reverse proxyks: see seisab ees, hoolitseb https eest ja annab päringu edasi rakendusele, mis kuulab ainult aadressil 127.0.0.1.
Linuxis on tuntuimad veebiserverid nginx ja Apache, ning Caddy (õppetund 7.4) on moodne alternatiiv, mis hoolitseb sertifikaatide eest ise. Selles õppetunnis kasutame nginxi: see on olemas igas distributsioonis, kasutab vähe mälu ja on paljudes juhendites standardvalik.
Paigaldamine ja esimene pilk
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(Versiooninumber on näide.) Ära unusta tulemüüri: pordid 80 ja 443 peavad olema avatud (õppetund 5.2). Kui avad nüüd aadressi http://192.0.2.10, näed nginxi tervituslehte.
Seadistus asub kaustas /etc/nginx/:
| Asukoht | Mis |
|---|---|
nginx.conf | põhifail; tavaliselt jäta see rahule |
sites-available/ | üks fail iga saidi kohta (Debian ja Ubuntu) |
sites-enabled/ | lingid (symlinks) sisselülitatud saitidele |
conf.d/*.conf | eraldi seaded, mis laaditakse alati |
snippets/ | tükid, mida kasutad mitmes saidis uuesti |
sites-available ja sites-enabled on Debiani ja Ubuntu tava: nii lülitad saidi sisse või välja lingi loomise või eemaldamisega, ilma faili kustutamata.
Esimene sait
Loo saidi jaoks kaust ja testleht:
anna@web1:~$ sudo mkdir -p /var/www/example.com
anna@web1:~$ echo '<h1>Het werkt</h1>' | sudo tee /var/www/example.com/index.htmlSeejärel loo server block: ühe saidi kirjeldus.
# /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;
}Loe seda nii:
listen 80;jalisten [::]:80;panevad nginxi kuulama nii IPv4 kui ka IPv6 kaudu. Kui unustad teise rea, ei tööta su AAAA-kirje (õppetund 7.1).server_nameütleb, milliste nimede jaoks see plokk kehtib. nginx vaatab iga päringu puhul nime, mida brauser küsib (Host-päis), ja valib sobiva ploki.rooton failide kaust,indexfail, mida kausta puhul näidatakse.try_filesproovib küsitud faili, seejärel kausta ja annab muidu vastuseks 404. Sellise reata võib vale seadistus näidata rohkem, kui soovid.- Iga saidi oma logifailid teevad otsimise palju lihtsamaks (õppetund 6.2).
Lülita sait sisse, eemalda vaikesait, testi ja laadi uuesti:
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 OKTee nginx -t käivitamisest enne iga reloadi kindel harjumus. Vea korral ütleb see, milline fail ja milline rida, ning su töötav sait jääb puutumata. Kui taaskäivitad ilma testimata, ei käivitu nginx vea korral enam ja kõik su saidid on maas (õppetund 6.1).
Default server: mida saab tundmatu nimi?
Mis juhtub, kui keegi pöördub su serveri poole nimega, mida pole üheski server_name-reas, või lihtsalt IP-aadressiga? Siis valib nginx default serveri: ploki, kus on listen järel default_server, või muidu esimese ploki, mille ta leidis. Kui sa selle peale ei mõtle, on see seega üks su päris saitidest.
Korrektsem on eraldi plokk, mis sellised päringud tagasi lükkab:
# /etc/nginx/sites-available/000-default
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
return 444;
}444 on nginxi eriline kood: ühendus suletakse ilma vastuseta. Nii ei näe IP-aadresse läbi käivad skannerid midagi. https puhul (port 443) töötab default server veidi teisiti, sest selle juurde kuulub sertifikaat; selle juurde tuleme tagasi õppetunnis 7.3.
nginx kui reverse proxy
Kui aadressil 127.0.0.1:3000 töötab rakendus (õppetund 6.3) või aadressil 127.0.0.1:3001 konteiner (õppetund 9.3), teeb nginx selle väljapoole kättesaadavaks:
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;
}
}Neli proxy_set_header-rida on olulised. Ilma Host-ta ei tea rakendus, millise nime all teda külastatakse. Ilma X-Forwarded-For-ta näeb rakendus iga külastust tulevat aadressilt 127.0.0.1 (proxy) külastaja päris aadressi asemel. Ilma X-Forwarded-Proto-ta arvab rakendus, et kõik käib üle http, ja loob vahel lingid või küpsised http jaoks, kuigi su sait töötab üle https. Paljudel rakendustel on seade nende päiste usaldamiseks ("trusted proxy"); pane sinna ainult 127.0.0.1, muidu saab iga külastaja kaasa saata võltsitud aadressi.
Rakendused, mis kasutavad websocketeid (reaalajas uuendused, nagu Uptime Kuma), vajavad veel kahte rida: proxy_http_version 1.1; ning Upgrade ja Connection edasiandmist. Rakenduse dokumentatsioon ütleb tavaliselt täpselt, millised.
Webrooti õigused
nginx käitab Debianis ja Ubuntus oma tööprotsesse kasutajana www-data. See peab saama su faile lugeda, kuid ei tohiks saada neisse kirjutada. Hea jaotus (õppetund 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 {} \;Sina (anna) haldad faile, grupp www-data võib lugeda, ülejäänud ei saa midagi. Kui sait peab kuhugi kirjutama, näiteks üleslaadimiste kausta, anna kirjutusõigus www-data-le ainult sellele kaustale. Mitte kunagi chmod 777 (õppetund 10.2). Kui saad vea 403 Forbidden, vaata saidi vealogi: seal on permission denied koos asukohaga.
Veel mõned head harjumused:
- Ära hoia saladusi webrootis. Varukoopiad (
site.zip),.env-failid ja.git-kaustad ei kuulu sinna; kui need kogemata sinna satuvad, saab neid küsida. Lisakaitse:location ~ /\. { deny all; }blokeerib kõik punktiga algavad failid (välja arvatud see, mida selgesõnaliselt lubad, nagu/.well-known/, vaata õppetunde 7.3 ja 7.4). - Peida versioon.
server_tokens off;failisnginx.confeemaldab versiooninumbriServer-päisest ja vealehtedelt. See ei ole päris turvameede, kuid annab skanneritele vähem teavet.
PHP lühidalt
PHP-saitide (nagu WordPress) puhul suhtleb nginx PHP-FPM-iga, mis on eraldi teenus. Debianis paigaldad php-fpm ja lisad server blocki location ~ \.php$-ploki koos include snippets/fastcgi-php.conf; ja fastcgi_pass unix:/run/php/php8.4-fpm.sock;-ga (versiooninumber erineb väljalaske kaupa). WordPressi kursus käsitleb seda põhjalikumalt.
AlmaLinuxis ja Rocky Linuxis
Seal pole sites-available: paned iga saidi eraldi failina kausta /etc/nginx/conf.d/<naam>.conf. nginx töötab kasutaja nginx all kasutaja www-data asemel ja vaikimisi webroot on /usr/share/nginx/html. SELinux ei luba nginxil vaikimisi luua ühendust proxy_pass taga oleva rakendusega; lülita see sisse käsuga setsebool -P httpd_can_network_connect 1. Tavapärastest kaustadest väljaspool olevad failid vajavad SELinuxi silti (semanage fcontext ja restorecon).
Kokkuvõte
- nginx serveerib faile või annab reverse proxyna päringud edasi rakendusele aadressil
127.0.0.1. - Iga saidi jaoks üks server block kaustas
sites-available, sisselülitamine lingiga kaustassites-enabled; kuula nii80kui ka[::]:80kaudu. - Alati
nginx -tennesystemctl reload nginx. - Oma default server koos
return 444-ga hoiab ära, et tundmatu nimi või paljas IP-aadress näitaks mõnda su saitidest. - Reverse proxyna annad edasi
Host,X-Forwarded-ForjaX-Forwarded-Proto; webroot onwww-data-le loetav, mitte kirjutatav, ja ilma saladusteta.
Test (quiz)
Ülesanne
Ülesanne O7.2: Sinu esimene sait. Paigalda nginx (või kasuta Caddyt õppetunnist 7.4), loo server block (ala)domeenile, mis osutab su serverile, koos listen-ga IPv4 ja IPv6 jaoks, oma logifailide ja oma default serveriga. Testi käsuga nginx -t, laadi uuesti ja kontrolli curl -I-ga IPv4 ja IPv6 kaudu. Sea webrooti õigused nagu õppetunnis. Täida kontrollnimekiri ja kleebi oma server block.
Ülesanne O7.2: Sinu esimene sait
Selle ülesande teed ise, keegi ei kontrolli seda. Märgi ära, mida tegid, ja märgi ülesanne tehtuks.
Paljal IP-l mitte midagi (ühendus suletakse) või neutraalne leht, mitte kunagi kliendi sait. Ainult üleslaadimiste kaust on www-data jaoks kirjutatav, ülejäänu ainult loetav. Proksi taga: Host, X-Real-IP, X-Forwarded-For ja X-Forwarded-Proto.
Su linnukesed ja märkmed jäävad ainult sellesse brauserisse, me ei saada neid kuhugi. Kui oled sisse loginud, salvestame Minu kursustes ainult info, et tegid ülesande ära.
Loe edasi
- Keelatud (403): sul pole õigust avada / selles serveris
- nginxi dokumentatsioon, How nginx processes a request (server_name ja default server): https://nginx.org/en/docs/http/request_processing.html
- nginxi dokumentatsioon, Beginner's Guide: https://nginx.org/en/docs/beginners_guide.html
- nginxi dokumentatsioon,
ngx_http_proxy_module: https://nginx.org/en/docs/http/ngx_http_proxy_module.html
