Modul 7 · 7.2
En webserver med nginx
Modul 7: Domæne, webserver og https · Læsetid: 12 minutter
Læringsmål: Efter denne lektion kan du installere nginx, sætte et website og en reverse proxy op med et server block, teste og genindlæse en konfiguration sikkert og give din webroot de rette rettigheder.
Centrale begreber: nginx, server block, sites-available og 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
Hvad en webserver gør
En webserver lytter på port 80 (http) og 443 (https), tager imod forespørgsler fra browsere og sender noget tilbage: en fil fra disken (et statisk site) eller svaret fra et program, der kører bagved (PHP, en Node.js-app, en container). I det andet tilfælde kaldes webserveren en reverse proxy: den står forrest, tager sig af https og sender forespørgslen videre til applikationen, som kun lytter på 127.0.0.1.
På Linux er nginx og Apache de mest kendte webservere, og Caddy (lektion 7.4) er et moderne alternativ, der selv klarer certifikater. Denne lektion bruger nginx: den findes i alle distributioner, er sparsommelig med hukommelse og er standarden i mange vejledninger.
Installation og det første kig
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(Versionsnummeret er et eksempel.) Glem ikke firewallen: port 80 og 443 skal være åbne (lektion 5.2). Går du nu til http://192.0.2.10, ser du velkomstsiden fra nginx.
Konfigurationen ligger i /etc/nginx/:
| Sti | Hvad |
|---|---|
nginx.conf | hovedfilen; den lader du som regel være |
sites-available/ | én fil pr. site (Debian og Ubuntu) |
sites-enabled/ | links (symlinks) til de sites, der er slået til |
conf.d/*.conf | enkelte indstillinger, der altid indlæses |
snippets/ | stumper, du genbruger i flere sites |
sites-available og sites-enabled er en vane fra Debian og Ubuntu: sådan slår du et site til eller fra ved at oprette eller fjerne et link, uden at slette filen.
Et første site
Opret en mappe til sitet og en testside:
anna@web1:~$ sudo mkdir -p /var/www/example.com
anna@web1:~$ echo '<h1>Het werkt</h1>' | sudo tee /var/www/example.com/index.htmlOpret derefter et server block: beskrivelsen af ét site.
# /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;
}Læs det sådan:
listen 80;oglisten [::]:80;får nginx til at lytte på både IPv4 og IPv6. Glemmer du den anden linje, virker din AAAA-record ikke (lektion 7.1).server_nameangiver, hvilke navne blokken gælder for. Ved hver forespørgsel ser nginx på det navn, browseren beder om (Host-headeren), og vælger den blok, der passer.rooter mappen med filer,indexden fil, der vises for en mappe.try_filesprøver den ønskede fil, derefter en mappe, og giver ellers en 404. Uden sådan en linje kan en forkert konfiguration vise mere, end du ønsker.- Egne logfiler pr. site gør det meget nemmere at søge (lektion 6.2).
Slå sitet til, fjern standardsitet, test og genindlæs:
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 OKGør nginx -t til en fast vane før hver reload. Ved en fejl fortæller den dig, hvilken fil og hvilken linje det drejer sig om, og dit kørende site forbliver uberørt. Genstarter du uden at teste, starter nginx ikke igen med en fejl, og alle dine sites er nede (lektion 6.1).
Default server: hvad får et ukendt navn?
Hvad sker der, hvis nogen kalder din server med et navn, der ikke står i nogen server_name, eller bare med IP-adressen? Så vælger nginx default server: blokken med default_server efter listen, eller ellers den første blok, den stødte på. Uden omtanke er det altså et af dine rigtige sites.
Pænere er en separat blok, der afviser den slags forespørgsler:
# /etc/nginx/sites-available/000-default
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
return 444;
}444 er en særlig kode i nginx: forbindelsen lukkes uden svar. Scannere, der gennemgår IP-adresser, får således intet at se. For https (port 443) fungerer en default server lidt anderledes, fordi der hører et certifikat til; det vender vi tilbage til i lektion 7.3.
nginx som reverse proxy
Kører der en applikation på 127.0.0.1:3000 (lektion 6.3) eller en container på 127.0.0.1:3001 (lektion 9.3), gør nginx den tilgængelig udadtil:
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;
}
}De fire proxy_set_header-linjer er vigtige. Uden Host ved applikationen ikke, under hvilket navn den besøges. Uden X-Forwarded-For ser applikationen hvert besøg komme fra 127.0.0.1 (proxyen) i stedet for den besøgendes rigtige adresse. Uden X-Forwarded-Proto tror applikationen, at alt går via http, og laver nogle gange links eller cookies til http, selvom dit site kører via https. Mange applikationer har en indstilling til at stole på disse headers ("trusted proxy"); skriv kun 127.0.0.1 der, ellers kan enhver besøgende sende en falsk adresse med.
Applikationer, der bruger websockets (liveopdateringer, som Uptime Kuma), skal bruge to linjer mere: proxy_http_version 1.1; og videresendelse af Upgrade og Connection. Applikationens dokumentation siger som regel præcis hvilke.
Rettigheder på webroot
På Debian og Ubuntu kører nginx sine arbejdsprocesser som brugeren www-data. Den skal kunne læse dine filer, men bør ikke kunne skrive i dem. En god opdeling (lektion 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 {} \;Du (anna) administrerer filerne, gruppen www-data må læse, resten intet. Skal sitet skrive et sted, fx i en mappe til uploads, så giv kun den mappe skriverettigheder for www-data. Aldrig chmod 777 (lektion 10.2). Får du en 403 Forbidden, så kig i sitets fejllog: der står permission denied med stien.
Et par andre vaner:
- Ingen hemmeligheder i webroot. Backups (
site.zip),.env-filer og.git-mapper hører ikke hjemme der; bliver de alligevel lagt der ved et uheld, kan de hentes. Et ekstra sikkerhedsnet:location ~ /\. { deny all; }blokerer alle filer, der begynder med et punktum (undtagen det, du udtrykkeligt tillader, som/.well-known/, se lektion 7.3 og 7.4). - Skjul versionen.
server_tokens off;inginx.conffjerner versionsnummeret fraServer-headeren og fejlsider. Det er ikke rigtig sikkerhed, men det giver scannere mindre information.
PHP, kort
Til PHP-sites (som WordPress) taler nginx med PHP-FPM, en separat tjeneste. På Debian installerer du php-fpm og sætter en location ~ \.php$-blok med include snippets/fastcgi-php.conf; og fastcgi_pass unix:/run/php/php8.4-fpm.sock; ind i server block (versionsnummeret varierer fra release til release). WordPress-kurset går mere i dybden med det.
På AlmaLinux og Rocky Linux
Der findes ingen sites-available: du lægger hvert site som sin egen fil i /etc/nginx/conf.d/<naam>.conf. nginx kører som brugeren nginx i stedet for www-data, og standard-webroot er /usr/share/nginx/html. SELinux lader som standard ikke nginx oprette forbindelse til en applikation bag proxy_pass; slå det til med setsebool -P httpd_can_network_connect 1. Filer uden for de sædvanlige mapper skal have et SELinux-label (semanage fcontext og restorecon).
Opsummering
- nginx serverer filer eller sender som reverse proxy forespørgsler videre til en applikation på
127.0.0.1. - Et server block pr. site i
sites-available, slås til med et link isites-enabled; lyt på både80og[::]:80. - Altid
nginx -tførsystemctl reload nginx. - En egen default server med
return 444forhindrer, at et ukendt navn eller den rene IP-adresse viser et af dine sites. - Som reverse proxy sender du
Host,X-Forwarded-ForogX-Forwarded-Protovidere; webroot kan læses afwww-data, ikke skrives i, og er uden hemmeligheder.
Quiz
Opgave
Opgave O7.2: Dit første site. Installer nginx (eller brug Caddy fra lektion 7.4), opret et server block til et (under)domæne, der peger på din server, med listen til IPv4 og IPv6, egne logfiler og en egen default server. Test med nginx -t, genindlæs, og kontrollér med curl -I via IPv4 og IPv6. Sæt rettighederne på webroot som i lektionen. Udfyld tjeklisten, og indsæt dit server block.
Opgave O7.2: Dit første site
Denne opgave laver du selv; ingen tjekker den. Afkryds hvad du har gjort, og markér opgaven som udført.
På den rå IP-adresse intet (forbindelsen lukkes) eller en neutral side, aldrig en kundes site. Kun en uploadmappe er skrivbar for www-data, resten er skrivebeskyttet. Bag en proxy: Host, X-Real-IP, X-Forwarded-For og X-Forwarded-Proto.
Dine afkrydsninger og noter forbliver kun i denne browser; vi sender dem ingen steder hen. Er du logget ind, gemmer vi kun i Mine kurser, at du har udført opgaven.
Læs mere
- Forbidden (403): Du har ikke adgang til / på denne server
- nginx-dokumentation, How nginx processes a request (server_name og default server): https://nginx.org/en/docs/http/request_processing.html
- nginx-dokumentation, Beginner's Guide: https://nginx.org/en/docs/beginners_guide.html
- nginx-dokumentation,
ngx_http_proxy_module: https://nginx.org/en/docs/http/ngx_http_proxy_module.html - VPS: fra første login til sikker server 5.2: nginx med et certifikat fra Let's Encrypt
