Gå direkte til indholdet

Cookieindstillinger

Vælg for hver type, hvilke cookies du tillader. Du kan altid ændre dit valg via Cookieindstillinger nederst på hver side. Privatlivspolitik

Nødvendige

Altid slået til

Nødvendige for at logge ind, gemme din kurv og huske dine valg. De er altid slået til.

Hvilke cookies?
  • weboke_sessie, weboke_klant, weboke_remember: din session og at forblive logget ind
  • weboke_basket: din kurv
  • wkBtwIncl: vise priser med eller uden moms
  • wok_cookies: dit cookievalg, 12 måneder

Måler, hvilken annonce der fører til et besøg eller en bestilling, så vi ikke betaler for annoncer, der ikke virker.

Hvilke cookies?
  • Google Ads via Google Tag Manager (_gcl_au, _gcl_aw), op til 90 dage
  • OpenAI Ads, annoncer i ChatGPT
  • wok_aff: hvilken partner der henviste dig til os (affiliateprogram), 60 dage

4,6

Land og sprog

Hvert land har sin egen side med landets priser og moms.

Se

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/:

StiHvad
nginx.confhovedfilen; 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/*.confenkelte 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.html

Opret 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; og listen [::]: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_name angiver, 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.
  • root er mappen med filer, index den fil, der vises for en mappe.
  • try_files prø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 OK

Gø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; i nginx.conf fjerner versionsnummeret fra Server-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 i sites-enabled; lyt på både 80 og [::]:80.
  • Altid nginx -t før systemctl reload nginx.
  • En egen default server med return 444 forhindrer, at et ukendt navn eller den rene IP-adresse viser et af dine sites.
  • Som reverse proxy sender du Host, X-Forwarded-For og X-Forwarded-Proto videre; webroot kan læses af www-data, ikke skrives i, og er uden hemmeligheder.

Quiz

1. Du har ændret et server block. Hvad er den sikre rækkefølge?



2. Dit site virker via IPv4, men ikke via IPv6, selvom AAAA-recorden er korrekt, og firewallen tillader IPv6. Hvad mangler sandsynligvis i server block?



3. Nogen åbner http://192.0.2.10 (den rene IP-adresse) og ser en af dine kunders website. Hvordan forhindrer du det?



4. Din applikation bag proxy_pass ser adressen 127.0.0.1 ved hvert besøg. Hvad mangler?



5. Hvilke rettigheder passer til filerne i et statisk website i /var/www/example.com?



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.




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

Et øjeblik…

Opsæt dine domæner

Angiv for hvert domæne navneserverne, tilknytningen til din hosting, og hvem der bliver ejer.

Indlæser dine domæner…