Moduuli 7 · 7.2
Verkkopalvelin nginxillä
Moduuli 7: Verkkotunnus, verkkopalvelin ja https · Lukuaika: 12 minuuttia
Tavoite: Tämän oppitunnin jälkeen osaat asentaa nginxin, tehdä sivuston ja reverse proxyn server blockilla, testata ja ladata asetukset turvallisesti uudelleen sekä asettaa webrootin oikeudet oikein.
Keskeiset käsitteet: 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
Mitä verkkopalvelin tekee
Verkkopalvelin kuuntelee porttia 80 (http) ja 443 (https), ottaa vastaan selainten pyyntöjä ja lähettää jotain takaisin: tiedoston levyltä (staattinen sivusto) tai sen takana toimivan ohjelman vastauksen (PHP, Node.js-sovellus, kontti). Jälkimmäisessä tapauksessa verkkopalvelinta kutsutaan nimellä reverse proxy: se on edessä, hoitaa https:n ja välittää pyynnön sovellukselle, joka kuuntelee vain osoitetta 127.0.0.1.
Linuxissa tunnetuimmat verkkopalvelimet ovat nginx ja Apache, ja Caddy (oppitunti 7.4) on moderni vaihtoehto, joka hoitaa varmenteet itse. Tällä oppitunnilla käytetään nginxiä: se löytyy jokaisesta jakelusta, käyttää vähän muistia ja on oletus monissa ohjeissa.
Asennus ja ensimmäinen silmäys
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(Versionumero on esimerkki.) Muista palomuuri: porttien 80 ja 443 pitää olla auki (oppitunti 5.2). Kun nyt menet osoitteeseen http://192.0.2.10, näet nginxin tervetulosivun.
Asetukset ovat hakemistossa /etc/nginx/:
| Polku | Mitä |
|---|---|
nginx.conf | päätiedosto; yleensä jätät sen rauhaan |
sites-available/ | yksi tiedosto sivustoa kohden (Debian ja Ubuntu) |
sites-enabled/ | linkit (symlinkit) käytössä oleviin sivustoihin |
conf.d/*.conf | erilliset asetukset, jotka ladataan aina |
snippets/ | palat, joita käytät uudelleen useassa sivustossa |
sites-available ja sites-enabled ovat Debianin ja Ubuntun tapa: sivuston saa päälle tai pois tekemällä tai poistamalla linkin, eikä itse tiedostoa tarvitse poistaa.
Ensimmäinen sivusto
Tee sivustolle hakemisto ja testisivu:
anna@web1:~$ sudo mkdir -p /var/www/example.com
anna@web1:~$ echo '<h1>Het werkt</h1>' | sudo tee /var/www/example.com/index.htmlTee sitten server block: yhden sivuston kuvaus.
# /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;
}Lue se näin:
listen 80;jalisten [::]:80;saavat nginxin kuuntelemaan sekä IPv4:ää että IPv6:ta. Jos unohdat toisen rivin, AAAA-tietueesi ei toimi (oppitunti 7.1).server_namekertoo, mitä nimiä tämä lohko koskee. nginx katsoo jokaisesta pyynnöstä nimen, jota selain pyytää (Host-otsake), ja valitsee siihen sopivan lohkon.rooton tiedostojen hakemisto,indextiedosto, joka näytetään hakemistoa pyydettäessä.try_fileskokeilee pyydettyä tiedostoa, sitten hakemistoa ja antaa muuten 404:n. Ilman tällaista riviä väärä määritys voi näyttää enemmän kuin haluat.- Omat lokitiedostot sivustoa kohden helpottavat etsimistä paljon (oppitunti 6.2).
Ota sivusto käyttöön, poista oletussivusto, testaa ja lataa uudelleen:
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 komennosta nginx -t vakiotapa ennen jokaista reloadia. Virheen sattuessa se kertoo tiedoston ja rivin, ja käynnissä oleva sivustosi jatkaa häiriöttä. Jos käynnistät uudelleen testaamatta, nginx ei virheen takia enää käynnisty ja kaikki sivustosi ovat alhaalla (oppitunti 6.1).
Default server: mitä tuntematon nimi saa?
Mitä tapahtuu, jos joku pyytää palvelintasi nimellä, jota ei ole missään server_name-rivissä, tai pelkällä IP-osoitteella? Silloin nginx valitsee default serverin: lohkon, jossa listen-rivin perässä on default_server, tai muuten ensimmäisen lohkon, johon se törmäsi. Jos asiaa ei mieti, se on siis jokin oikeista sivustoistasi.
Siistimpää on tehdä erillinen lohko, joka hylkää tällaiset pyynnöt:
# /etc/nginx/sites-available/000-default
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
return 444;
}444 on nginxin erikoiskoodi: yhteys suljetaan vastaamatta. IP-osoitteita läpi käyvät skannerit eivät näin näe mitään. https:lle (portti 443) default server toimii hieman eri tavalla, koska siihen kuuluu varmenne; palaat siihen oppitunnilla 7.3.
nginx reverse proxyna
Jos sovellus toimii osoitteessa 127.0.0.1:3000 (oppitunti 6.3) tai kontti osoitteessa 127.0.0.1:3001 (oppitunti 9.3), nginx tuo sen ulos näkyviin:
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;
}
}Neljä proxy_set_header-riviä ovat tärkeitä. Ilman riviä Host sovellus ei tiedä, millä nimellä siellä vieraillaan. Ilman riviä X-Forwarded-For sovellus näkee jokaisen käynnin tulevan osoitteesta 127.0.0.1 (proxy) eikä kävijän oikeasta osoitteesta. Ilman riviä X-Forwarded-Proto sovellus luulee kaiken kulkevan http:n kautta ja tekee joskus linkkejä tai evästeitä http:lle, vaikka sivustosi toimii https:n kautta. Monissa sovelluksissa on asetus näiden otsakkeiden luottamiselle ("trusted proxy"); laita siihen vain 127.0.0.1, muuten kuka tahansa kävijä voi lähettää väärän osoitteen.
Websocketeja käyttävät sovellukset (reaaliaikaiset päivitykset, kuten Uptime Kuma) tarvitsevat vielä kaksi riviä: proxy_http_version 1.1; sekä otsakkeiden Upgrade ja Connection välittämisen. Sovelluksen dokumentaatio kertoo yleensä tarkalleen, mitkä.
Webrootin oikeudet
Debianissa ja Ubuntussa nginx ajaa työprosessinsa käyttäjänä www-data. Sen pitää pystyä lukemaan tiedostosi, mutta sen ei kuulu pystyä kirjoittamaan niihin. Hyvä jako (oppitunti 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 {} \;Sinä (anna) hallitset tiedostoja, ryhmä www-data saa lukea, muut eivät mitään. Jos sivuston pitää kirjoittaa jonnekin, esimerkiksi latauksille tarkoitettuun hakemistoon, anna kirjoitusoikeus käyttäjälle www-data vain siihen hakemistoon. Ei koskaan chmod 777 (oppitunti 10.2). Jos saat virheen 403 Forbidden, katso sivuston virhelokia: siellä on permission denied ja polku.
Muutama muu hyvä tapa:
- Ei salaisuuksia webrootiin. Varmuuskopiot (
site.zip),.env-tiedostot ja.git-hakemistot eivät kuulu sinne; jos ne päätyvät sinne vahingossa, niitä voi pyytää selaimella. Lisäturvanalocation ~ /\. { deny all; }estää kaikki pisteellä alkavat tiedostot (paitsi sen, minkä sallit erikseen, kuten/.well-known/, katso oppitunnit 7.3 ja 7.4). - Piilota versio.
server_tokens off;tiedostossanginx.confpoistaa versionumeronServer-otsakkeesta ja virhesivuilta. Se ei ole oikeaa tietoturvaa, mutta antaa skannereille vähemmän tietoa.
PHP lyhyesti
PHP-sivustoille (kuten WordPress) nginx keskustelee PHP-FPM:n kanssa, joka on erillinen palvelu. Debianissa asennat paketin php-fpm ja lisäät server blockiin location ~ \.php$-lohkon, jossa on include snippets/fastcgi-php.conf; ja fastcgi_pass unix:/run/php/php8.4-fpm.sock; (versionumero vaihtelee julkaisun mukaan). WordPress-kurssi käsittelee tätä tarkemmin.
AlmaLinuxissa ja Rocky Linuxissa
Niissä ei ole hakemistoa sites-available: jokainen sivusto on oma tiedostonsa hakemistossa /etc/nginx/conf.d/<nimi>.conf. nginx toimii käyttäjänä nginx eikä www-data, ja oletus-webroot on /usr/share/nginx/html. SELinux ei oletuksena anna nginxin muodostaa yhteyttä sovellukseen, joka on proxy_pass-rivin takana; salli se komennolla setsebool -P httpd_can_network_connect 1. Tavallisten hakemistojen ulkopuoliset tiedostot tarvitsevat SELinux-nimiön (semanage fcontext ja restorecon).
Yhteenveto
- nginx tarjoilee tiedostoja tai välittää pyyntöjä reverse proxyna sovellukselle osoitteessa
127.0.0.1. - Yksi server block sivustoa kohden hakemistossa
sites-available, käyttöön linkillä hakemistoonsites-enabled; kuuntele sekä80että[::]:80. - Aina
nginx -tennen komentoasystemctl reload nginx. - Oma default server, jossa on
return 444, estää tuntematonta nimeä tai pelkkää IP-osoitetta näyttämästä jotain sivustoistasi. - Reverse proxyna välität otsakkeet
Host,X-Forwarded-ForjaX-Forwarded-Proto; webroot on luettavissa käyttäjällewww-data, ei kirjoitettavissa, eikä siinä ole salaisuuksia.
Tietovisa (quiz)
Tehtävä
Tehtävä O7.2: Ensimmäinen sivustosi. Asenna nginx (tai käytä Caddya oppitunnilta 7.4) ja tee server block (ali)verkkotunnukselle, joka osoittaa palvelimeesi. Siinä pitää olla listen IPv4:lle ja IPv6:lle, omat lokitiedostot ja oma default server. Testaa komennolla nginx -t, lataa uudelleen ja tarkista komennolla curl -I IPv4:n ja IPv6:n kautta. Aseta webrootin oikeudet kuten oppitunnilla. Täytä tarkistuslista ja liitä server blockisi.
Tehtävä O7.2: Ensimmäinen sivustosi
Tämän tehtävän teet itse, kukaan ei tarkista sitä. Merkitse tekemäsi kohdat ja merkitse tehtävä tehdyksi.
Pelkässä IP-osoitteessa ei mitään (yhteys suljetaan) tai neutraali sivu, ei koskaan asiakkaan sivustoa. Vain latauskansio kirjoitettavissa käyttäjälle www-data, muu vain luku. Välityspalvelimen takana: Host, X-Real-IP, X-Forwarded-For ja X-Forwarded-Proto.
Merkintäsi ja muistiinpanosi pysyvät vain tässä selaimessa, emme lähetä niitä minnekään. Jos olet kirjautunut sisään, tallennamme kohtaan Omat kurssit vain sen, että olet tehnyt tehtävän.
Lue lisää
- Kielletty (403): Sinulla ei ole oikeutta käyttää kohdetta / tällä palvelimella
- nginx-dokumentaatio, How nginx processes a request (server_name ja default server): https://nginx.org/en/docs/http/request_processing.html
- nginx-dokumentaatio, Beginner's Guide: https://nginx.org/en/docs/beginners_guide.html
- nginx-dokumentaatio,
ngx_http_proxy_module: https://nginx.org/en/docs/http/ngx_http_proxy_module.html - VPS: ensimmäisestä kirjautumisesta turvalliseen palvelimeen 5.2: nginx ja Let's Encryptin varmenne
