# Server

## Hva det er

En server er et program som venter på at andre programmer skal kontakte det over
et nettverk, og som svarer på det de spør om. Med det lange navnet heter det
nettverksserver, men i daglig tale brukes bare server, både om programmet og om
datamaskinen det kjører på. Programmet i den andre enden av hver utveksling er
klienten: en nettleser, en app på mobilen, et skript, et e-postprogram eller en
annen server som har et eget spørsmål.

Standardene bak nettet setter rollen først. RFC 9110, som definerer HTTP,
beskriver en HTTP-server som et program som tar imot tilkoblinger for å betjene
forespørsler med svar, og legger til at ordene klient og server bare viser til
rollene programmene har i én bestemt tilkobling. Det samme programmet kan være
server på én tilkobling og spørre på den neste. En webserver som sender en
forespørsel videre til en applikasjon bak seg, er klienten til den applikasjonen
på den andre etappen.

Under de fleste servere ligger ett grep, som TCP kaller en passiv åpning.
Programmet sier fra til operativsystemet at det vil ta imot innkommende
tilkoblinger, enten på én lokal adresse eller på alle, og så venter det. En
klient gjør den aktive åpningen mot den adressen og nettverksporten. Mellom
tilkoblingene gjør en server nesten ingenting man kan se.

Servere skiller seg i hvordan de venter. Mange kjører i månedsvis i strekk og
holder på minnet sitt enten noen er innom eller ikke. Andre startes på nytt for
hver tilkobling: et overordnet program tar seg av ventingen, starter en kopi av
serveren for hver besøkende, og kopien avslutter når den besøkende går.

Så er det maskinen. Ordlisten til NIST beskriver en server som en datamaskin
eller enhet i et nettverk som forvalter ressursene i nettverket, og nevner
filservere, utskriftsservere, nettverksservere og databaseservere som eksempler.
Når et selskap sier at nettstedet kjører på én liten server, mener det en
datamaskin satt av til å kjøre serverprogrammer, i dag som regel en virtuell
maskin leid fra en leverandør. Denne ordlisten holder de to ordene strengt fra
hverandre. En server er det som svarer. Maskinen, som en ting med navn og adresse
som bygges, sikres og telles, er en vert. Én vert kan kjøre mange servere, og en
server kan flytte til en annen vert, så lenge navnet flytter med.

De typene folk flest møter, har navn etter det de leverer: webservere for HTTP,
e-postservere for SMTP og IMAP, DNS-servere for navn, databaseservere for
spørringer, filservere, git-servere og spillservere. En applikasjonsserver står
som regel bak en webserver og kjører produktets egen kode.

## Hvorfor det er viktig

Alt en besøkende når på internett, besvares av en eller annen server. Å velge
servere er derfor å velge hva som er eksponert, hva det koster og hva som svikter
samtidig.

Det første ordet brukes til i en budsjettsamtale, er å spørre hvilken betydning
som ligger på bordet. «Vi trenger en server» kan bety et program som skal
installeres, en maskin som skal leies, en administrert tjeneste som noen andre
drifter, eller mer kapasitet på en maskin det allerede er betalt for. De
alternativene er forskjellige i pris, i hvem som legger inn
sikkerhetsoppdateringene, og i hvem som blir vekket om natten når en av dem
stopper.

Det andre er kostnaden, og det meste av kostnaden ved en server er ventingen. Et
program som holder på minne mens det står ledig, holder på det hele døgnet, så
på en liten maskin er hver server som ligger i minnet, en egen linje i
budsjettet. En server som startes per tilkobling, bytter litt tid ved hvert
besøk mot at ingenting holdes av mellom besøkene.

Det tredje er eksponering. Hver server som lytter, tar imot data fra fremmede,
og det gjør den til noe som må holdes oppdatert, konfigureres med vilje og
følges med på. Å kjøre så få servere som jobben krever, er en
sikkerhetsbeslutning like mye som en innsparing.

Det fjerde er at rollen kan kjøpes i stedet for å driftes. En administrert
database, en hostet postkasse eller et CDN er en server som et annet selskap
drifter. Byttet er styring og innsyn mot færre ting å oppdatere, og et lite
selskap kan med god grunn drifte sin egen webserver og samtidig leie e-posten.

## Slik ser det ut i praksis

Alle serverne til dette nettstedet får plass på én maskin, og kolofonen
[navngir hvert serverprogram på den](/nb/credits/). Caddy svarer på hver
webforespørsel og fornyer HTTPS-sertifikatet selv. Agate og Gophernicus svarer
på Gemini og Gopher, Tor svarer på onion-adressen, og Soft Serve er
git-serveren. Alle de fire offentlige kopiene av nettstedet leser den samme
mappen med filer, så én produksjonssetting oppdaterer alle fire.
Onion-tjenesten viser at det å betjene og det å lytte er to forskjellige ting:
siden kaller den den eneste inngangsdøren som kunne legges til uten å åpne en
port, fordi tor kobler seg ut til introduksjonspunkter, og maskinens åpne porter
forble nøyaktig som de var. E-posten, sier den samme siden, går via en hostet
tjeneste, og det er rollen kjøpt i stedet for driftet.

Personvernsiden viser typen som startes per tilkobling, fra en vinkel få ser på.
[Gopher-kopien startes på nytt for hver besøkende av operativsystemet](/nb/privacy/),
som gir det øyeblikket navn etter adressen den besøkende kom fra, og skriver
navnet inn i en egen logg som serverprogramvaren aldri ser. Nettstedet fant den
loggen den dagen det telte forespørsler for første gang, og nå utløper den etter
tretti dager.

Og én maskin setter en grense for hvilke servere den kan ta. Beretningen om
[å drive hele selskapet på én vert med 512 MB](/nb/portfolio/ran-the-whole-company-on-one-512mb-host-109/)
holder med vilje e-posten unna den maskinen. E-postserveren finnes som et
installasjonsstillas som venter på en egen vert, fordi en e-postserver trenger
margin som maskinen allerede har brukt opp: en grense skrevet ned i stedet for
oppdaget senere.

## Hvor det går galt

**En maskin som svarer, og en server som tier.** En ping, en åpen SSH-økt eller
en grønn flis for den virtuelle maskinen sier alle at verten er oppe. Hva
webserveren gjør, sier de derimot ingenting om: om den svarer, om den gir den
riktige siden, eller om sertifikatet fortsatt er gyldig. Sjekk en server slik en
klient bruker den, ved å stille et ekte spørsmål og lese svaret:

```sh
curl -sS -o /dev/null -w '%{http_code} %{time_total}s\n' https://example.com/
```

En 200 innen rimelig tid er det en besøkende trenger. Alt annet er en feil,
uansett hva grafene for maskinen sier.

**En fil på disken som sier én ting, og en kjørende server som sier en annen.**
De fleste servere leser konfigurasjonen når de starter eller lastes inn på nytt,
og holder den i minnet, så en redigert fil endrer ingenting før neste
innlasting. En omstart med en ødelagt fil etterlater en server som står helt
stille. Valider filen, gi den så til den kjørende serveren, og still deretter
serveren et spørsmål. Kommandolinjen til Caddy dekker de to første stegene:
`validate` laster og klargjør hver modul som om konfigurasjonen skulle startes,
uten å starte den, og `reload` gir den kjørende instansen den nye.

```sh
caddy validate --config /etc/caddy/Caddyfile
caddy reload --config /etc/caddy/Caddyfile
```

**En andre kopi av serveren, og tilstanden som ble igjen på den første.** En ny
kopi av en applikasjonsserver bak en lastbalanserer setter spørsmålstegn ved
hver bit tilstand på den første. Økter som holdes i minnet, tilhører én kopi, så
en besøkende som sendes til den andre, blir logget ut. En fil lastet opp til den
ene disken mangler på den andre. En planlagt jobb installert på begge kjører to
ganger. Flytt økter, opplastinger og planlagte jobber til et sted begge kopiene
deler, før den andre legges til, eller behold én server og gjør den raskere.

**Mange servere på én maskin, med én felles skjebne.** Én vert med mange servere
er billig og enkelt, og det betyr også at én omstart, én full disk eller ett
oppbrukt minne tar ned alle serverne samtidig. For et lite nettsted er det et
rimelig bytte når det er valgt med vilje: maskinen er beskrevet som kode, så den
kan bygges opp på nytt, dataene har en sikkerhetskopi utenfor maskinen, og en
server som trenger egen margin, får en egen maskin.

## Les mer

- [server — NIST CSRC Glossary](https://csrc.nist.gov/glossary/term/server)
  — definisjonen som publikasjonene til NIST deler, med typene server de nevner.
- [RFC 9110, HTTP Semantics: Connections, Clients, and Servers](https://www.rfc-editor.org/rfc/rfc9110.html#section-3.3)
  — klient og server definert som roller et program har i én tilkobling.
- [RFC 9293, Transmission Control Protocol](https://www.rfc-editor.org/rfc/rfc9293.html)
  — passiv og aktiv åpning, og hvordan et program som lytter, venter på én
  adresse eller på alle.
- [Caddy: Command Line](https://caddyserver.com/docs/command-line)
  — `validate`, `reload` og de andre kommandoene til webserveren dette
  nettstedet kjører.

<https://engineer.company/nb/glossary/server/>
