Teknisk Arkitektur #
Generering af Websitet #
- Statisk Site Generator: Ordnet.dk er genereret ved hjælp af Hugo, en statisk site generator, der muliggør hurtig og effektiv generering af websider.
- Genererede Filer: De genererede filer er placeret i stien /var/www/dev på serveren hugordbog.dsl.lan.
Server Infrastruktur #
Hugo Server: #
- Host: hugordbog.dsl.lan
- Sti til genererede filer: /var/www/dev
Nginx Proxy: #
- Host: webcache3.dsl.lan
- Funktion: Nginx fungerer som en omvendt proxy foran Hugo-sitet. Det omdirigerer trafikken til de korrekte servere baseret på URL-stien.
- Trafikstyring:
- Al trafik til ordnet.dk/ bliver omdirigeret til hugordbog.dsl.lan.
- Trafik til ordnet.dk/api/DICTIONARY bliver omdirigeret til ws-1.dsl.lan på port 9009.
- Trafik til ordnet.dk/DICTIONARY/ordbog/WORD bliver omdirigeret til ws-1.dsl.lan:9009/rendered/DICTIONARY/WORD.
- Trafik til ordnet.dk/api/kvikfeed bliver omdirigeret til …
- Trafik til ordnet.dk/api/ddb bliver omdirigeret direkte til elasticsearch på 10.17.4.41:9200/ddbiddo/_search
API Server #
- API Host: ws-1.dsl.lan
- Port: 9009
- Python-pakke: Dsllex
- Funktion: Håndterer API-anmodninger og giver adgang til ordbogsopslag og data.
- Endpoints i brug på ordnet.dk:
- autocomplete ved skrivning i søgefelt
- rendered: ved besøog på /ORDBOGSNAVN/ordbog/SØGEORD, fx ordnet.dk/ddo/ordbog/husar
Trafik- og Anmodningsflow #
- Bruger anmoder om ordnet.dk/:
- Anmodningen rammer Nginx på webcache3.dsl.lan, som omdirigerer den til Hugo-sitet på hugordbog.dsl.lan.
- API Anmodning til ordnet.dk/api/DICTIONARY:
- Anmodningen bliver dirigeret til API-serveren ws-1.dsl.lan på port 9009.
- Ordbogsopslag via ordnet.dk/DICTIONARY/ordbog/WORD:
- Anmodningen bliver dirigeret til ws-1.dsl.lan:9009/rendered/DICTIONARY/WORD, hvor det specifikke ordopslag behandles og returneres.
Illustration af trafik #
graph TD
A(bruger) --> B(nginx <br> webcache3.dsl.lan)
B -- ordnet.dk/api/kvikfeed --> C(ordnet-ws1:8181/ <br> **Bruges:** ved visning af Dagens Ord / Ugens uforståelige <br> ved besøg af sider med dette indhold)
B -- ordnet.dk/api/ddb --> D(10.4.17.41/ddbiddo/_search <br> Elastic search <br> **Bruges:** ved klik på 'vis mere' på Ord i nærheden)
B -- ordnet.dk/api/... --> E(ws-1.dsl.lan:9009/ <br> DSLlex <br> **Bruges:** ved visning af ordbogsopslag, og ved autofuldførelse)
B -- ordnet.dk/... --> F(hugordbog.dsl.lan:8081 <br> /var/www/dev/ <br> **Bruges:** til visning hugo site generereret statisk html)
B -- ordnet.dk/ORDBOGSNAVN/ordbog/SØGEORD --> E
“Rendered” (the clever bit) #
Endpointet “rendered” (ws-1:9009/rendered/) er indført af følgende grunde:
- Det er ikke hensigtmæssigt at oprette alle opslag i alle ordbøger som statiske html-sider. Det vil gøre opdateringer vanskelige og fremsøgning af sider formodes at ville skabe problemer for disksystemet
- Googles trawler bryder sig ikke om dynamsike sider – altså indhold der først bliver genereret asynkront når brugeren til går en side. Det ville næppe kunne indekseres
- Tjester som Twitter og Instagram der gerne vil vise et skærmbillede når der linkes til et opslag på ordnet.dk ville ligeledes ikke kunne vise et opslag
Derfor vil ordbogsopslag på ordnet.dk ikke blive vist direkte fra de Hugo-genererede statiske sider. I stedet sørger NGINS for at lede trafik til /ORDBOGSNAVN/ordbog/SØGEORD til opslags-API’en (DSLLex ws-1:9009/).
Rendered-endpointet gør følgende:
- Henter en tom søgeresultatside (en skabelon) på ordnet.dk for ordbogen (/ORDBOGSNAVN/ordbog/). Dette sørger for at den søgeresultatside der vises til brugerne er up-to-date med det aktuelle hugo-site.
- Dette bliver cachet så der hentes kun en ny side fx en gang i timen
- Slår det eller de relevante opslag i Elasticsearch
- Pusler opslag(ene) ind i den tomme skabelon-side
- Returnerer den færdige side til brugerne
flowchart TD
A((ordnet.dk/<br>ORDOGSNAVN/<br>ordbog/SØGEORD)) -.-> B[ws-1:9009/rendered]
B --> C{Er skabelon i cache?}
C -->|Ja| D[Slå relevante opslag op i Elasticsearch]
C -->|Nej| E[Hent tom skabelon fra /ORDBOGSNAVN/ordbog/]
E --> F[Cache skabelon]
F --> D
D --> G[Pusl opslag ind i skabelon-side]
G --> GG[Post-processér om nødvendigt den færdige side, fx tilføj highlights]
GG --> H[Returner]
H -.-> I((... til bruger))