# Netværksserver

## Hvad det er

En netværksserver er et program, der venter på, at andre programmer når frem til
det over et netværk, og derefter svarer på det, de spørger om. I daglig tale
forkortes ordet til _server_, og det bruges både om programmet og om den
computer, det kører på. Programmet i den anden ende af hver udveksling er
klienten: en browser, en app på telefonen, et script, et mailprogram eller en
anden server, der selv har et spørgsmål.

Standarderne bag nettet sætter rollen først. RFC 9110, som definerer HTTP,
kalder en HTTP-server et program, der tager imod forbindelser for at betjene
forespørgsler ved at sende svar, og tilføjer, at ordene klient og server kun
henviser til de roller, programmer udfylder for en bestemt forbindelse. Det
samme program kan betjene på én forbindelse og spørge på den næste. En
webserver, der sender en forespørgsel videre til en applikation bag sig, er den
applikations klient på andet stræk.

Under de fleste servere ligger ét greb, som TCP kalder en passiv åbning.
Programmet fortæller styresystemet, at det vil tage imod indgående forbindelser,
enten på én lokal adresse eller på dem alle, og så venter det. En klient
foretager den aktive åbning mod den adresse og port. Så længe ingen er
forbundet, laver en server næsten intet, man kan se.

Servere er forskellige i, hvordan de venter. Mange kører i måneder ad gangen og
holder på deres hukommelse, hvad enten nogen kigger forbi eller ej. Andre
startes forfra for hver forbindelse: et overordnet program står for ventetiden,
starter en kopi af serveren for hver besøgende, og kopien afslutter, når den
besøgende går.

Så er der maskinen. NIST's ordliste beskriver en server som en computer eller
enhed på et netværk, der administrerer netværksressourcer, og nævner filservere,
printservere, netværksservere og databaseservere som eksempler. Når en
virksomhed siger, at dens site kører på én lille server, mener den en computer,
der er sat af til at køre serverprogrammer, i dag som regel en virtuel maskine
lejet hos en udbyder. Denne ordliste holder en fast grænse mellem de to ord. En
server er det, der svarer. Maskinen, som en ting med et navn og en adresse, der
bygges, sikres og tælles, er en vært. Én vært kan køre mange servere, og en
server kan flytte til en anden vært, så længe dens navn flytter med.

De slags, de fleste møder, er opkaldt efter det, de serverer: webservere til
HTTP, mailservere til SMTP og IMAP, DNS-servere til navne, databaseservere til
forespørgsler, filservere, git-servere og spilservere. En applikationsserver
sidder som regel bag en webserver og kører produktets egen kode.

## Hvorfor det betyder noget

Alt, hvad en besøgende når på internettet, besvares af en server, så at vælge
servere er at vælge, hvad der står åbent udadtil, hvad det koster, og hvad der
går ned sammen.

Når ordet første gang dukker op i en budgetsamtale, er det første at spørge,
hvilken betydning der er på bordet. »Vi skal have en server« kan betyde et
program, der skal installeres, en maskine, der skal lejes, en administreret
tjeneste, som en anden driver, eller mere kapacitet på en maskine, der allerede
er betalt. De adskiller sig i pris, i hvem der installerer
sikkerhedsopdateringerne, og i hvem der bliver vækket om natten, når en af dem
står stille.

Det andet er prisen, og det meste af en servers pris er dens venten. Et program,
der holder på hukommelse, mens det står stille, holder på den døgnet rundt, så
på en lille maskine er hver fastboende server en linje i budgettet. En server,
der startes pr. forbindelse, bytter lidt tid ved hvert besøg for at holde på
ingenting ind imellem.

Det tredje er eksponering. Hver lyttende server tager imod input fra fremmede,
og det gør den til noget, der skal holdes opdateret, konfigureres med vilje og
holdes øje med. At køre så få servere, som opgaven kræver, er lige så meget en
sikkerhedsbeslutning som en besparelse.

Det fjerde er, at rollen kan købes i stedet for at drives. En administreret
database, en hostet postkasse eller et content delivery network er en server,
som en anden virksomhed driver. Byttet er kontrol og indsigt mod færre ting at
opdatere, og en lille virksomhed kan med god grund drive sin egen webserver og
leje sin mail.

## Sådan ser det ud i praksis

Alle dette sites servere kan være på én maskine, og kreditsiden
[nævner hvert serverprogram på den](/da/credits/). Caddy besvarer hver
webforespørgsel og fornyer selv HTTPS-certifikatet. Agate og Gophernicus
besvarer Gemini og Gopher, Tor besvarer onion-adressen, og Soft Serve er
git-serveren. Caddy, Agate, Gophernicus og Tor henter alle deres filer fra én
fælles mappe, så en udrulning skriver ét sted og opdaterer alle fire offentlige
kopier af sitet på én gang. Onion-tjenesten viser, at det at betjene og det at
lytte er to forskellige ting: siden kalder den den eneste indgang, der kunne
tilføjes uden at åbne en port, fordi tor selv ringer ud til
introduktionspunkter, og maskinens åbne porte forblev præcis, som de var.
Mailen, siger samme side, kører hos en hostet tjeneste, og dér er rollen købt i
stedet for drevet.

Privatlivssiden viser den slags, der startes pr. forbindelse, fra en vinkel, få
kigger fra.
[Gopher-kopien startes forfra for hver besøgende af styresystemet](/da/privacy/),
som navngiver det øjeblik efter den adresse, den besøgende kom fra, og skriver
navnet i sin egen log, en som serverprogrammet aldrig ser. Sitet opdagede den
log den dag, det første gang talte forespørgsler, og nu udløber den efter
tredive dage.

Og én maskine sætter en grænse for, hvilke servere den kan tage. Beretningen om
[at køre hele virksomheden på én vært med 512 MB](/da/portfolio/ran-the-whole-company-on-one-512mb-host-109/)
holder bevidst mailen væk fra den maskine. Mailserveren findes som et
installationsstillads, der venter på sin egen vært, fordi en mailserver kræver
råderum, som maskinen allerede har brugt: en grænse, der er skrevet ned i stedet
for at blive opdaget senere.

## Hvor det går galt

**Maskinen svarer, og serveren gør ikke.** Et ping, en åben SSH-session eller en
grøn flise for den virtuelle maskine siger alle, at værten er oppe. Ingen af dem
siger, at webserveren svarer, at den returnerer den rigtige side, eller at dens
certifikat stadig er gyldigt. Tjek en server, som en klient bruger den, ved at
stille et rigtigt spørgsmål og læse svaret:

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

Et 200 på en fornuftig tid er, hvad en besøgende har brug for. Alt andet er en
fejl, hvad maskinens grafer end viser.

**Filen på disken siger én ting og den kørende server en anden.** De fleste
servere læser deres konfiguration, når de starter eller genindlæser, og holder
den i hukommelsen, så en redigeret fil ændrer intet før næste genindlæsning. En
genstart med en ødelagt fil efterlader slet ingen kørende server. Validér filen,
giv den så til den kørende server, og stil derefter serveren et spørgsmål.
Caddys kommandolinje dækker de to første trin: `validate` indlæser og klargør
hvert modul, som om konfigurationen skulle startes, uden at starte den, og
`reload` giver den kørende instans den nye.

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

**To servere halverer ikke arbejdet for én.** En ekstra kopi af en
applikationsserver bag en load balancer sætter spørgsmålstegn ved hver eneste
tilstand, den første holdt på. Sessioner i hukommelsen tilhører én kopi, så en
besøgende, der sendes til den anden, bliver logget ud. En fil, der er uploadet
til én disk, ligger kun på den disk. Et planlagt job, der er installeret på
begge, kører to gange. Flyt sessioner, uploads og planlagte job et sted hen, som
begge kopier deler, før den anden tilføjes, eller behold én server og gør den
hurtigere.

**Alle servere på én maskine deler skæbne.** Én vært med mange servere er billig
og enkel, og det betyder også, at én genstart, én fuld disk eller én opbrugt
hukommelse tager alle servere ned på én gang. For et lille site er det en
rimelig handel, når den er valgt med vilje: maskinen er beskrevet som kode, så
den kan bygges igen, data sikkerhedskopieres væk fra maskinen, og en server, der
kræver sit eget råderum, får sin egen maskine.

## Læs mere

- [server — NIST CSRC Glossary](https://csrc.nist.gov/glossary/term/server) —
  den definition, NIST's publikationer deler, med de slags servere, de nævner.
- [RFC 9110, HTTP Semantics: Connections, Clients, and Servers](https://www.rfc-editor.org/rfc/rfc9110.html#section-3.3)
  — klient og server defineret som roller, et program udfylder på én
  forbindelse.
- [RFC 9293, Transmission Control Protocol](https://www.rfc-editor.org/rfc/rfc9293.html)
  — passive og aktive åbninger, og hvordan et lyttende program venter på én
  adresse eller på dem alle.
- [Caddy: Command Line](https://caddyserver.com/docs/command-line) — `validate`,
  `reload` og de andre kommandoer i den webserver, dette site kører.

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