TTFB: Hvorfor Time To First Byte er vigtig for både SEO og LLM'er

Time To First Byte (TTFB) er en af de mest kritiske, men oversete, performance-metrics for websites. Mens de fleste fokuserer på side load time eller visual rendering, er TTFB den første indikator for, hvor responsivt dit site er – og det betyder noget både for søgemaskiner og AI-crawlere. Langsomme TTFB kan betyde, at AI-systemer crawler færre sider, prioriterer dit indhold lavere, eller helt opgiver at crawle dit site. Denne guide forklarer, hvad TTFB er, hvorfor det betyder noget, og hvordan du optimerer det.

TTFB: Hvorfor Time To First Byte er vigtig for både SEO og LLM'er

Udgivet den

Forfatter

Jakob Langemark

Følg os

TTFB: Hvorfor Time To First Byte er afgørende for både SEO og LLM'er

Time To First Byte (TTFB) er en af de mest kritiske – men også mest oversete – metrics, når det gælder websitets performance. Mens de fleste fokuserer på indlæsningstid eller visuel rendering, er TTFB den første indikator på, hvor hurtigt dit site reagerer. Det har stor betydning for både søgemaskiner og AI-crawlere. En langsom TTFB kan betyde, at AI-systemer crawler færre sider, nedprioriterer dit indhold eller helt opgiver at crawle dit site. Denne guide forklarer, hvad TTFB er, hvorfor det er vigtigt, og hvordan du optimerer det.

Hvad er TTFB?

Time To First Byte (TTFB) er den tid, der går fra en browser eller crawler sender en HTTP-anmodning, til den modtager den første byte data fra serveren.

TTFB består af:

  1. DNS-opslag — Tiden det tager at oversætte domænenavn til IP-adresse

  2. Forbindelsestid — Tiden det tager at etablere en TCP-forbindelse

  3. SSL/TLS-handshake — Tiden det tager at etablere en HTTPS-forbindelse (hvis relevant)

  4. Serverens behandlingstid — Den tid serveren bruger på at generere svaret

  5. Netværksforsinkelse (latency) — Tiden det tager for den første byte at rejse tilbage

Formel:

TTFB vs. andre metrics

TTFB måler serverens responstid, før noget som helst indhold sendes.

FCP (First Contentful Paint) måler, hvornår det første visuelle indhold renderes på skærmen.

LCP (Largest Contentful Paint) måler, hvornår det primære indholdselement er indlæst.

TTFB sker altid først — det er fundamentet for alle andre load-metrics.

Hvorfor TTFB er vigtigt for AI-crawlere

1. Crawler-budgetter

AI-crawlere (og søgemaskiner) har begrænset tid pr. site. Hvis din TTFB er langsom, når de at crawle færre sider, før deres tidsbudget er brugt op.

Eksempel:

  • Site A: TTFB = 200 ms → Crawleren kan nå at crawle 500 sider på 5 minutter

  • Site B: TTFB = 2000 ms → Crawleren når kun at crawle 150 sider på 5 minutter

Site A får altså 3 gange bedre dækning af sit indhold.

2. Prioritering af crawling

Crawlere prioriterer hurtige sites. Hvis din TTFB konsekvent er langsom, vil crawlere:

  • Komme på besøg sjældnere

  • Crawle færre sider pr. besøg

  • Prioritere dine konkurrenters sites

3. Datakvalitet

En lang TTFB kan føre til timeouts. Det betyder, at AI-modellerne får mangelfulde data eller helt giver op.

Googles anbefalinger:

  • God TTFB: < 600 ms

  • Acceptabel TTFB: 600 ms - 1200 ms

  • Dårlig TTFB: > 1200 ms

Det samme gælder for AI-crawlere.

Hvorfor TTFB også er afgørende for SEO

Google har bekræftet, at TTFB indirekte er en ranking-faktor via Core Web Vitals (da det påvirker LCP).

Konsekvens:

  • Langsom TTFB → Langsom LCP → Ringere placeringer

  • Hurtig TTFB → Hurtig LCP → Bedre placeringer

Mål din nuværende TTFB

Browser DevTools (Chrome)

  1. Åbn Chrome DevTools (F12)

  2. Gå til fanen Network

  3. Genindlæs siden

  4. Klik på den første anmodning (typisk dit HTML-dokument)

  5. Se fanen Timing

Du vil se:




PageSpeed Insights

  1. Gå til https://pagespeed.web.dev/

  2. Indtast din URL

  3. Se efter "Serverens responstid" under diagnostik

WebPageTest

  1. Gå til https://www.webpagetest.org/

  2. Indtast din URL og vælg testlokation

  3. Se efter "Time to First Byte" i resultaterne

WebPageTest viser også:

  • TTFB pr. anmodning (ikke kun for det første HTML-dokument)

  • Fordeling af DNS, Connect, SSL og Wait

Test via kommandolinjen med curl

# Mål TTFB
curl -o /dev/null -s -w "DNS: %{time_namelookup}s\nForbindelse: %{time_connect}s\nSSL: %{time_appconnect}s\nTTFB: %{time_starttransfer}s\nTotal: %{time_total}s\n" https://ditwebsite.dk/

# Output:
# DNS: 0.015s
# Forbindelse: 0.045s
# SSL: 0.132s
# TTFB: 0.456s
# Total: 0.612s
# Mål TTFB
curl -o /dev/null -s -w "DNS: %{time_namelookup}s\nForbindelse: %{time_connect}s\nSSL: %{time_appconnect}s\nTTFB: %{time_starttransfer}s\nTotal: %{time_total}s\n" https://ditwebsite.dk/

# Output:
# DNS: 0.015s
# Forbindelse: 0.045s
# SSL: 0.132s
# TTFB: 0.456s
# Total: 0.612s
# Mål TTFB
curl -o /dev/null -s -w "DNS: %{time_namelookup}s\nForbindelse: %{time_connect}s\nSSL: %{time_appconnect}s\nTTFB: %{time_starttransfer}s\nTotal: %{time_total}s\n" https://ditwebsite.dk/

# Output:
# DNS: 0.015s
# Forbindelse: 0.045s
# SSL: 0.132s
# TTFB: 0.456s
# Total: 0.612s

Python-script til bulk-test

import requests
import time

def maal_ttfb(url):
    start = time.time()
    r = requests.get(url, stream=True)
    ttfb = time.time() - start
    return ttfb * 1000  # Konverter til millisekunder

urls = [
    "https://ditwebsite.dk/",
    "https://ditwebsite.dk/products/",
    "https://ditwebsite.dk/blog/"
]

for url in urls:
    ttfb = maal_ttfb(url)
    print(f"{url}: {ttfb:.2f}ms")
import requests
import time

def maal_ttfb(url):
    start = time.time()
    r = requests.get(url, stream=True)
    ttfb = time.time() - start
    return ttfb * 1000  # Konverter til millisekunder

urls = [
    "https://ditwebsite.dk/",
    "https://ditwebsite.dk/products/",
    "https://ditwebsite.dk/blog/"
]

for url in urls:
    ttfb = maal_ttfb(url)
    print(f"{url}: {ttfb:.2f}ms")
import requests
import time

def maal_ttfb(url):
    start = time.time()
    r = requests.get(url, stream=True)
    ttfb = time.time() - start
    return ttfb * 1000  # Konverter til millisekunder

urls = [
    "https://ditwebsite.dk/",
    "https://ditwebsite.dk/products/",
    "https://ditwebsite.dk/blog/"
]

for url in urls:
    ttfb = maal_ttfb(url)
    print(f"{url}: {ttfb:.2f}ms")

Identificer årsagen til en langsom TTFB

TTFB består af flere elementer. Find flaskehalsene her:

1. DNS-opslag (bør være < 20 ms)

Problem: Langsom DNS-resolver.

Test:

Løsning:

  • Brug en hurtig DNS-udbyder (som Cloudflare DNS eller Google DNS)

  • Aktivér DNS-prefetching:

<link rel="dns-prefetch" href="//ditwebsite.dk">
<link rel="dns-prefetch" href="//ditwebsite.dk">
<link rel="dns-prefetch" href="//ditwebsite.dk">

2. Forbindelsestid (bør være < 50 ms)

Problem: Geografisk afstand til serveren eller langsomt netværk.

Løsning:

  • Brug et Content Delivery Network (CDN) for at komme tættere på brugere og crawlere

  • Reducer antallet af forbindelser (HTTP/2 hjælper her)

3. SSL/TLS-handshake (bør være < 100 ms)

Problem: Langsom SSL-forhandling.

Test:

openssl s_time -connect ditwebsite.dk:443 -www
openssl s_time -connect ditwebsite.dk:443 -www
openssl s_time -connect ditwebsite.dk:443 -www

Løsning:

  • Aktivér TLS 1.3 (giver hurtigere handshake)

  • Brug OCSP-stapling

  • Aktivér HTTP/2 eller HTTP/3

4. Serverens behandlingstid (bør være < 200 ms)

Problem: Langsom backend eller tunge database-forespørgsler.

Dette er typisk den største flaskehals.

Sådan undersøger du det:

  • Tjek serverens logs for langsomme anmodninger

  • Brug APM-værktøjer (New Relic, Datadog)

  • Analyser og optimer dine database-forespørgsler

Optimer serverens behandlingstid

Det er her, du kan hente den største forbedring.

1. Implementer caching

Server-side caching:

Brug Redis eller Memcached til at cache resultater fra databasen.

Eksempel (PHP med Redis):

<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

$cache_key = 'homepage_data';
$data = $redis->get($cache_key);

if (!$data) {
    // Data er ikke i cache, hent fra database
    $data = fetch_from_database();
    $redis->setex($cache_key, 3600, serialize($data));  // Cache i 1 time
} else {
    $data = unserialize($data);
}

echo json_encode($data);

<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

$cache_key = 'homepage_data';
$data = $redis->get($cache_key);

if (!$data) {
    // Data er ikke i cache, hent fra database
    $data = fetch_from_database();
    $redis->setex($cache_key, 3600, serialize($data));  // Cache i 1 time
} else {
    $data = unserialize($data);
}

echo json_encode($data);

<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

$cache_key = 'homepage_data';
$data = $redis->get($cache_key);

if (!$data) {
    // Data er ikke i cache, hent fra database
    $data = fetch_from_database();
    $redis->setex($cache_key, 3600, serialize($data));  // Cache i 1 time
} else {
    $data = unserialize($data);
}

echo json_encode($data);

Full-page caching:

Cache hele HTML-svar.

Nginx-eksempel:

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m;

server {
    location / {
        proxy_cache my_cache;
        proxy_cache_valid 200 60m;
        proxy_cache_key "$scheme$request_method$host$request_uri";
        proxy_pass http

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m;

server {
    location / {
        proxy_cache my_cache;
        proxy_cache_valid 200 60m;
        proxy_cache_key "$scheme$request_method$host$request_uri";
        proxy_pass http

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m;

server {
    location / {
        proxy_cache my_cache;
        proxy_cache_valid 200 60m;
        proxy_cache_key "$scheme$request_method$host$request_uri";
        proxy_pass http

2. Optimer database-forespørgsler

Problem: N+1-forespørgsler eller manglende indeksere.

Find langsomme forespørgsler (MySQL):

-- Aktivér slow query log
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;  -- Forespørgsler over 1 sekund

-- Vis langsomme forespørgsler
SELECT * FROM

-- Aktivér slow query log
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;  -- Forespørgsler over 1 sekund

-- Vis langsomme forespørgsler
SELECT * FROM

-- Aktivér slow query log
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;  -- Forespørgsler over 1 sekund

-- Vis langsomme forespørgsler
SELECT * FROM

Løsninger:

  • Tilføj indeksering:

-- Før: Full table scan
SELECT * FROM products WHERE category = 'electronics';

-- Efter: Opret indeks
CREATE INDEX idx_category ON products(category)

-- Før: Full table scan
SELECT * FROM products WHERE category = 'electronics';

-- Efter: Opret indeks
CREATE INDEX idx_category ON products(category)

-- Før: Full table scan
SELECT * FROM products WHERE category = 'electronics';

-- Efter: Opret indeks
CREATE INDEX idx_category ON products(category)

  • Brug query-caching:

-- Aktivér query cache (MySQL 5.7)
SET GLOBAL query_cache_size = 67108864;  -- 64MB
SET GLOBAL query_cache_type = ON

-- Aktivér query cache (MySQL 5.7)
SET GLOBAL query_cache_size = 67108864;  -- 64MB
SET GLOBAL query_cache_type = ON

-- Aktivér query cache (MySQL 5.7)
SET GLOBAL query_cache_size = 67108864;  -- 64MB
SET GLOBAL query_cache_type = ON

  • Optimer JOINs:

-- Dårligt: Flere joins uden korrekte indekser
SELECT * FROM orders
JOIN users ON orders.user_id = users.id
JOIN products ON orders.product_id = products.id
WHERE users.country = 'DK';

-- Godt: Tilføj sammensatte indekser
CREATE INDEX idx_user_country ON users(country, id);
CREATE INDEX idx_product_id ON products(id)

-- Dårligt: Flere joins uden korrekte indekser
SELECT * FROM orders
JOIN users ON orders.user_id = users.id
JOIN products ON orders.product_id = products.id
WHERE users.country = 'DK';

-- Godt: Tilføj sammensatte indekser
CREATE INDEX idx_user_country ON users(country, id);
CREATE INDEX idx_product_id ON products(id)

-- Dårligt: Flere joins uden korrekte indekser
SELECT * FROM orders
JOIN users ON orders.user_id = users.id
JOIN products ON orders.product_id = products.id
WHERE users.country = 'DK';

-- Godt: Tilføj sammensatte indekser
CREATE INDEX idx_user_country ON users(country, id);
CREATE INDEX idx_product_id ON products(id)

3. Opgrader serverens ressourcer

Tjek belastningen på serveren:

top
# Se CPU- og hukommelsesforbrug

htop
# Mere brugervenligt alternativ
top
# Se CPU- og hukommelsesforbrug

htop
# Mere brugervenligt alternativ
top
# Se CPU- og hukommelsesforbrug

htop
# Mere brugervenligt alternativ

Hvis belastningen konsekvent er høj (>80% CPU):

  • Opgrader din CPU

  • Tilføj mere RAM

  • Implementer load balancing

4. Brug et CDN

Content Delivery Networks gemmer dit indhold på servere, der er geografisk tættere på dine brugere og crawlere.

Populære CDN-udbydere:

  • Cloudflare — Har en god gratis version, perfekt til små og mellemstore sites

  • AWS CloudFront — Yderst skalerbart

  • Fastly — Lynhurtigt, men mere teknisk krævende

  • BunnyCDN — Budgetvenligt og effektivt

Sådan forbedrer et CDN din TTFB:

Uden CDN:

  • En bruger i USA besøger et site, der hostes i Europa

  • TTFB = 500 ms (200 ms netværks latency + 300 ms serverbehandling)

Med CDN:

  • En bruger i USA sender en anmodning → Rammer en CDN-server i USA

  • TTFB = 150 ms (20 ms netværks latency + 130 ms cache hit)

5. Aktivér Gzip/Brotli-komprimering

Komprimering mindsker filstørrelsen på dine svar, hvilket gør overførslen hurtigere.

Nginx-konfiguration:

gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_min_length 256;
gzip_comp_level 6;

# Endnu bedre: Brotli
brotli on;
brotli_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text

gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_min_length 256;
gzip_comp_level 6;

# Endnu bedre: Brotli
brotli on;
brotli_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text

gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_min_length 256;
gzip_comp_level 6;

# Endnu bedre: Brotli
brotli on;
brotli_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text

Apache-konfiguration:

<IfModule mod_deflate.c>
  AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/json
</IfModule>
<IfModule mod_deflate.c>
  AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/json
</IfModule>
<IfModule mod_deflate.c>
  AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/json
</IfModule>

6. Skær ned på serverbehandlingen

Minimer følgende:

  • Tunge beregninger ved hver anmodning

  • Eksterne API-kald

  • Fil-I/O-operationer

Eksempel (Python Flask):

from flask import Flask, render_template
from functools import lru_cache
import requests

app = Flask(__name__)

# Dårligt: Eksternt API-kald ved hver eneste anmodning
@app.route('/weather')
def vejr_daarlig():
    response = requests.get('https://api.weather.com/data')
    return render_template('weather.html', data=response.json())

# Godt: Cache det eksterne API-kald
@lru_cache(maxsize=128)
def hent_vejr_cached():
    response = requests.get('https://api.weather.com/data')
    return response.json()

@app.route('/weather')
def vejr_god():
    data = hent_vejr_cached()
    return render_template('weather.html', data=data)
from flask import Flask, render_template
from functools import lru_cache
import requests

app = Flask(__name__)

# Dårligt: Eksternt API-kald ved hver eneste anmodning
@app.route('/weather')
def vejr_daarlig():
    response = requests.get('https://api.weather.com/data')
    return render_template('weather.html', data=response.json())

# Godt: Cache det eksterne API-kald
@lru_cache(maxsize=128)
def hent_vejr_cached():
    response = requests.get('https://api.weather.com/data')
    return response.json()

@app.route('/weather')
def vejr_god():
    data = hent_vejr_cached()
    return render_template('weather.html', data=data)
from flask import Flask, render_template
from functools import lru_cache
import requests

app = Flask(__name__)

# Dårligt: Eksternt API-kald ved hver eneste anmodning
@app.route('/weather')
def vejr_daarlig():
    response = requests.get('https://api.weather.com/data')
    return render_template('weather.html', data=response.json())

# Godt: Cache det eksterne API-kald
@lru_cache(maxsize=128)
def hent_vejr_cached():
    response = requests.get('https://api.weather.com/data')
    return response.json()

@app.route('/weather')
def vejr_god():
    data = hent_vejr_cached()
    return render_template('weather.html', data=data)

7. Skift til HTTP/2 eller HTTP/3

HTTP/2 muliggør multiplexing, hvilket reducerer tidsforbruget ved at oprette forbindelser.

Aktivér HTTP/2 (Nginx):

server {
    listen 443 ssl http2;
    server_name ditwebsite.dk;
    # ... resten af konfigurationen

server {
    listen 443 ssl http2;
    server_name ditwebsite.dk;
    # ... resten af konfigurationen

server {
    listen 443 ssl http2;
    server_name ditwebsite.dk;
    # ... resten af konfigurationen

Test om HTTP/2 er aktivt:

curl -I --http2 https://ditwebsite.dk/
# Hold øje med "HTTP/2 200" i svaret
curl -I --http2 https://ditwebsite.dk/
# Hold øje med "HTTP/2 200" i svaret
curl -I --http2 https://ditwebsite.dk/
# Hold øje med "HTTP/2 200" i svaret

Målret din optimering til AI-crawlere

1. Prioriter dine vigtigste sider

Sørg for, at dine absolut vigtigste sider (forsiden, primære produkter, mest populære artikler) har den hurtigste TTFB.

Nginx: Separat cache for nøglesider:

location = / {
    proxy_cache_valid 200 120m;  # Cache forsiden i 2 timer
    proxy_pass http://backend;
}

location /products/ {
    proxy_cache_valid 200 60m;  # Cache produkter i 1 time
    proxy_pass http

location = / {
    proxy_cache_valid 200 120m;  # Cache forsiden i 2 timer
    proxy_pass http://backend;
}

location /products/ {
    proxy_cache_valid 200 60m;  # Cache produkter i 1 time
    proxy_pass http

location = / {
    proxy_cache_valid 200 120m;  # Cache forsiden i 2 timer
    proxy_pass http://backend;
}

location /products/ {
    proxy_cache_valid 200 60m;  # Cache produkter i 1 time
    proxy_pass http

2. Genkend og optimer specifikt til crawlere

Servér en cachet version til crawler-bots:

<?php
$user_agent = $_SERVER['HTTP_USER_AGENT'];

$is_crawler = preg_match('/GPTBot|ClaudeBot|CCBot|Googlebot|bingbot/i', $user_agent);

if ($is_crawler) {
    // Servér statisk cachet HTML
    echo file_get_contents('/cache/static_page.html');
} else {
    // Servér dynamisk indhold
    include('dynamic_page.php');
}

<?php
$user_agent = $_SERVER['HTTP_USER_AGENT'];

$is_crawler = preg_match('/GPTBot|ClaudeBot|CCBot|Googlebot|bingbot/i', $user_agent);

if ($is_crawler) {
    // Servér statisk cachet HTML
    echo file_get_contents('/cache/static_page.html');
} else {
    // Servér dynamisk indhold
    include('dynamic_page.php');
}

<?php
$user_agent = $_SERVER['HTTP_USER_AGENT'];

$is_crawler = preg_match('/GPTBot|ClaudeBot|CCBot|Googlebot|bingbot/i', $user_agent);

if ($is_crawler) {
    // Servér statisk cachet HTML
    echo file_get_contents('/cache/static_page.html');
} else {
    // Servér dynamisk indhold
    include('dynamic_page.php');
}

3. Varm cachen op, før crawleren lander

Hvis du kender crawlerens besøgsmønster (f.eks. lige efter du har indsendt et sitemap), kan du varme cachen op på forhånd:

#!/bin/bash
# Varm cachen op ved at anmode om alle URL'er
while read url; do
  curl -s "$url" > /dev/null
done

#!/bin/bash
# Varm cachen op ved at anmode om alle URL'er
while read url; do
  curl -s "$url" > /dev/null
done

#!/bin/bash
# Varm cachen op ved at anmode om alle URL'er
while read url; do
  curl -s "$url" > /dev/null
done

Overvåg din TTFB kontinuerligt

Sæt automatisk monitorering op

Pingdom:

  1. Opret en konto på pingdom.com

  2. Tilføj overvågning af dine URL'er

  3. Sæt en grænseværdi for advarsler (f.eks. "alarm hvis TTFB > 800 ms")

UptimeRobot:

  1. Få gratis overvågning hvert 5. minut

  2. Opsæt e-mailnotifikationer

Eget script via cron-job:

#!/bin/bash
# Tjek TTFB og send alarm, hvis den er over 1000 ms
TTFB=$(curl -o /dev/null -s -w '%{time_starttransfer}' https://ditwebsite.dk/)
TTFB_MS=$(echo "$TTFB * 1000" | bc)

if (( $(echo "$TTFB_MS > 1000" | bc -l) )); then
  echo "TTFB er for høj: ${TTFB_MS}ms" | mail -s "TTFB-alarm" admin@ditwebsite.dk
fi
#!/bin/bash
# Tjek TTFB og send alarm, hvis den er over 1000 ms
TTFB=$(curl -o /dev/null -s -w '%{time_starttransfer}' https://ditwebsite.dk/)
TTFB_MS=$(echo "$TTFB * 1000" | bc)

if (( $(echo "$TTFB_MS > 1000" | bc -l) )); then
  echo "TTFB er for høj: ${TTFB_MS}ms" | mail -s "TTFB-alarm" admin@ditwebsite.dk
fi
#!/bin/bash
# Tjek TTFB og send alarm, hvis den er over 1000 ms
TTFB=$(curl -o /dev/null -s -w '%{time_starttransfer}' https://ditwebsite.dk/)
TTFB_MS=$(echo "$TTFB * 1000" | bc)

if (( $(echo "$TTFB_MS > 1000" | bc -l) )); then
  echo "TTFB er for høj: ${TTFB_MS}ms" | mail -s "TTFB-alarm" admin@ditwebsite.dk
fi

Kør testen en gang i timen:

crontab -e
# Tilføj:
0

crontab -e
# Tilføj:
0

crontab -e
# Tilføj:
0

Anbefalede TTFB-målsætninger

Googles officielle anbefalinger

  • Godt: < 600 ms

  • Bør forbedres: 600 ms - 1200 ms

  • Dårligt: > 1200 ms

Anbefalinger til AI-crawlere

  • Fremragende: < 300 ms (giver maksimal prioritet hos crawlerne)

  • Godt: 300 ms - 600 ms (standard hastighed for crawling)

  • Acceptabelt: 600 ms - 1000 ms (lavere hastighed for crawling)

  • Dårligt: > 1000 ms (risiko for ufuldstændig crawling)

Typiske TTFB-problemer og løsninger

Problem

Symptom

Løsning

Manglende caching

TTFB > 1000 ms på alle forespørgsler

Implementer Redis/Memcached

Langsom database

Høj TTFB på dynamiske sider

Tilføj indekser, optimer forespørgsler

Intet CDN

Høj TTFB for udenlandsk trafik

Aktivér Cloudflare eller AWS CloudFront

Overbelastet server

TTFB spiker under spidsbelastning

Skaler serveren op eller tilføj load balancing

Uoptimeret kode

Ustabil og svingende TTFB

Analyser koden og fjern flaskehalse

Eksterne API-kald

Høj og uforudsigelig TTFB

Cache API-svar, brug asynkrone kald

Tjekliste til implementering

Brug denne tjekliste til at banke din TTFB i bund:

  1. Mål din nuværende TTFB — Brug PageSpeed Insights eller WebPageTest

  2. Find flaskehalsen — Er det DNS, forbindelse, SSL eller serveren?

  3. Få styr på server-side caching — Brug Redis/Memcached til database-svar

  4. Aktivér full-page caching — Til statiske og semistatiske sider

  5. Optimer dine databaser — Tilføj indekser og fjern N+1-forespørgsler

  6. Slå Gzip/Brotli til — Komprimer dine svar

  7. Brug et CDN — Cloudflare, AWS CloudFront eller BunnyCDN

  8. Kør på HTTP/2 — Reducer unødigt netværks-overhead

  9. Hold øje med tallene — Sæt automatisk overvågning op med f.eks. Pingdom

  10. Test efter med curl — Bekræft dine forbedringer i praksis

Konklusion

TTFB er en kritisk metric for både din SEO og din synlighed i AI-værktøjer. En langsom TTFB betyder færre crawlede sider, lavere prioritering og risiko for, at AI-modellerne ikke får fat i alt dit indhold. Heldigvis kan de fleste websites forbedre deres TTFB markant med caching (både server-side og af hele sider), database-optimering og brug af et CDN.

Start med at måle din nuværende TTFB, identificer den største flaskehals (ofte serverens behandlingstid), og få sat caching op. De fleste sites kan relativt nemt komme under 600 ms med basal optimering – og under 300 ms, hvis der tilføjes et CDN og aggressiv caching.

Husk: TTFB er selve fundamentet – alle andre performance-metrics bygger ovenpå det. Optimer din TTFB først, så falder FCP og LCP hurtigere i hak bagefter.