Nginx Webserver oppsett

Bilde av Michael Dziedzic fra Unsplash

Bilde av Michael Dziedzic fra Unsplash

Nginx kan brukes som en kraftig webserver, og i kombinasjon med certbot er det kjemperaskt å sette opp en virtualhost komplett med TLS (Transport Layer Security) sertifikat slik at de som besøker websiden trygt kan surfe dit med HTTPS.

NGINX

Webserver oppsett

Vi starter med å installere nginx

sudo apt install nginx

Som en liten demonstrasjon oppretter vi de nødvendige mapper og filer, som må være på plass som et minimum for at websiden skal fungere.

sudo mkdir -p /var/www/www.hjemmeside.no/web
sudo vim /var/www/www.hjemmeside.no/web/index.html
/var/www/www.hjemmeside.no/web/index.html
<!DOCTYPE html>
  <head>
    <meta charset="utf-8">
    <title>Hjemmesiden min!</title>
  </head>

  <body>
    <h1>Hjemmesiden min</h1>
    <p>Hurra! Det funker!</p>
  </body>
</html>

Nå er det klart for å opprette en config fil for denne virtual hosten vi skal opprette.

sudo vim /etc/nginx/sites-available/www.hjemmesiden.no
/etc/nginx/sites-available/www.hjemmesiden.no
server {
	listen 80;
	server_name www.hjemmesiden.no hjemmesiden.no;

	root /var/www/www.hjemmesiden.no/web;
	index index.html;

	location / {
		try_files $uri $uri/ =404;
	}
}

I denne filen starter vi med å definere hvilken port denne virtual hosten skal lytte på. Vi definerer videre at den skal svare på HTTP requests som er rettet til host navnet www.hjemmesiden.no og hjemmesiden.no.

Root mappen som settes er den mappen som skal vises mot internett. Det er viktig å tenke på at alt som finnes i denne mappen og undermappene kan på ett eller annet vis være tilgjengelig fra internett. Så derfor er det vanlig at denne mappen peker videre til web apper som er plassert på et sted som det ikke er mulig å nå fra internett. I praksis vil det si at normalt ligger alle .php filer utenfor denne webroot mappen.

Index filen setter vi til å være index.html. Det vil si at når man surfer til denne websiden er det index.html som blir lastet.

Det er viktig å vite at slik denne virtual hosten settes opp akkurat nå så støtter den ikke noen form for PHP scripts

Når denne filen er opprettet er det klart for å aktivere den nye virtualhosten. Det gjøres ved å lage en symlink til denne filen fra sites-enabled mappen. Da kan du endre på originalen som er plassert i sites-available mappen.

Når symlinken er opprettet må nginx restartes for at den nye virtual host config'en skal tas i bruk av nginx.

sudo ls -s /etc/nginx/sites-available/www.hjemmesiden.no /etc/nginx/sites-enabled/www.hjemmesiden.no
sudo systemctl restart nginx

DNS

Oppsett av domentet slik at det peker til serveren din.

Logg deg inn på webserveren din og endre slik at A-recorden peker til IP adressen til webserveren din. Opprett både et A-record for .hjemmesiden.no og www.hjemmesiden.no.

Avhengig av hvor lang TTL (Time To Live) A-recordene hadde før du endret på de kan ta litt tid før endringene blir oppdatert på DNS serverne rundt om i verden.

TLS med Certbot

Opprett TLS sertifikater med Let's Encrypt

Når du kan nå webserveren fra domenet er det klart for å opprette TLS (Transport Layer Securtity) sertifikater med certbot slik at websiden kan nås med HTTPS for sikker og kryptert kommunikasjon.

Certbot er et python program som oppretter gratis TLS sertifikater som er godkjent av tredjeparts sertifikat utstederen "let's encrypt". Dette sertifikatet brukes som et bevis på at innhold fra denne webserverens virtualhost faktisk sender data fra domenet som den oppgir at den sender data fra.

OBS: Certbot vil kun fungere på websider som kan nås fra internett, så dette vil IKKE fungere på websider som ikke er tilgjengelig fra internett. Årsaken er at certbot trenger å nå webserveren for å kunne verifisere at den er den den utgir seg for å være. Hvis du har behov for HTTPS/TLS som ikke er tredjeparts godkjent til for eksempel intranett på hjemmenettverket dit må du bruke andre løsninger.

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d hjemmesiden.no -d www.hjemmesiden.no

Noe av det som er magisk med certbot er at den skriver om nginx config filen til virtualhosten slik at alle som må gjøres for at HTTPS skal fungere som det skal havner på rett plass.

Etter at certbot har gjort jobben sin vil config filen se slik ut:

/etc/nginx/sites-available/www.hjemmesiden.no
server {
    root /var/www/www.hjemmesiden.no;
    server_name www.hjemmesiden.no hjemmesiden.no;

    index index.html;

    location / {
            try_files $uri $uri/ =404;
    }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/hjemmesiden.no/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/hjemmesiden.no/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

server {
    listen 80;
    if ($host = www.hjemmesiden.no) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    if ($host = hjemmesiden.no) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    server_name www.hjemmesiden.no hjemmesiden.no;
    return 404; # managed by Certbot
}

Her har det kommet inn en god del nye linjer siden vi opprettet filen. Alle linjene som certbot har gjort noe med slutter med kommentaren # managed by certbot.

Certbot kjøres av en cronjob som sjekker hvor lang levetid TLS sertifikatet er gyldig. Om det begynner å nærme seg slutten av levetiden vil det automatisk ta kontakt med Let's Encrypt og fornye sertifikatet.

Gratulerer du har nå satt opp en komplett webserver med HTTPS :)