Tilbake til blogg
August 19, 2026Guider

Slik installerer du Caddy-webserveren med automatisk HTTPS

Installer Caddy på Ubuntu fra det offisielle arkivet, skriv en Caddyfile for statiske nettsteder og reversproxier, forstå automatiske sertifikater, systemd, logger og vanlige feil når du migrerer fra Nginx.

Slik installerer du Caddy-webserveren med automatisk HTTPS

Caddy er en webserver som henter og fornyer TLS-sertifikater som standard. For en liten VPS som hoster ett eller to domener fjerner det en hel klasse Certbot-timere og Nginx-snippet-filer. Konfigurasjonsspråket (Caddyfile) er kort. Reversproxy, gzip og HTTP/2 er vanlige funksjoner, ikke en helg med ekstra moduler.

Nginx er fortsatt det rette valget for noen butikker: dere har allerede kamptestede configs, eller dere trenger en svært spesifikk modul. Denne veilederen er for det andre vanlige tilfellet — du vil ha HTTPS som virker på en fersk Hiddence-VPS uten å memorere include-snippets. Vi installerer Caddy fra det offisielle apt-arkivet, forklarer hvordan det snakker med Let's Encrypt, serverer et statisk nettsted, proxer en lokal app, hoster flere domener, ser på logger og dekker de vanlige port-80-kranglene med Apache eller en gammel Nginx.

Når Caddy er et godt treff

Automatisk HTTPS er overskriften, men den daglige gevinsten er færre bevegelige deler. Caddy lytter på 80 og 443, omdirigerer HTTP til HTTPS og lagrer sertifikater i datakatalogen sin. Du trenger fortsatt et domene som peker på VPS-en. Du trenger fortsatt å ikke ødelegge ACME (brannmur 80/tcp, ingen annen prosess som stjeler :80). Jokertegnsertifikater trenger en DNS-leverandørmodul — det er en lengre sti enn et sertifikat for én vert.

  • Automatisk HTTP→HTTPS og sertifikatfornyelse
  • Lesbar Caddyfile i stedet for lange serverblokker
  • Kapabel reversproxy for Node, Python, PHP-FPM via ekstra config, eller Docker-backends
  • HTTP/2 og moderne TLS-standarder uten et chifferregneark
  • systemd-enhet fra den offisielle pakken

Krav

Et domene må resolvere til denne VPS-en før Caddy kan bevise ACME HTTP-01. Hvis DNS fortsatt propagerer, mislykkes Caddy med utstedelse og prøver igjen; det ser ut som 'Caddy er ødelagt' når det bare er DNS. Stopp Apache eller Nginx først hvis de eier 80/443.

  • Ubuntu 22.04 eller 24.04
  • En domene-A-post til VPS-IP-en (og AAAA hvis du bruker IPv6)
  • Portene 80 og 443 ledige og tillatt i brannmuren
  • Root eller sudo

Steg 1: Installer Caddy fra det offisielle arkivet

Ikke installer en tilfeldig gammel Caddy fra standard Ubuntu universe hvis du vil ha aktuell TLS- og ACME-oppførsel. Caddy-prosjektet dokumenterer en apt-kilde. Etter installasjon finnes caddy-brukeren, og tjenesten er aktivert.

bash
ssh root@YOUR_VPS_IP
apt update && apt -y install debian-keyring debian-archive-keyring apt-transport-https curl gpg

curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee /etc/apt/sources.list.d/caddy-stable.list

apt update
apt -y install caddy

caddy version
systemctl status caddy --no-pager

Steg 2: Første Caddyfile — statisk nettsted

Standard-Caddyfile er /etc/caddy/Caddyfile. Erstatt den med domenet ditt. Caddy vil prøve å hente et sertifikat så snart konfigurasjonen lastes hvis vertsnavnet ikke er localhost. Legg nettstedfiler i en katalog som caddy-brukeren kan lese (ofte www-data-lignende rettigheter, men pakken bruker brukeren caddy).

bash
mkdir -p /var/www/example
echo '<h1>It works</h1>' > /var/www/example/index.html
chown -R caddy:caddy /var/www/example

cat >/etc/caddy/Caddyfile <<'EOF'
example.com {
    root * /var/www/example
    file_server
    encode gzip
}
EOF

caddy validate --config /etc/caddy/Caddyfile
systemctl reload caddy

# Watch issuance:
journalctl -u caddy -f

Steg 3: Reversproxy for en lokal applikasjon

Hvis Gunicorn, Node eller Docker lytter på 127.0.0.1:8000, skal Caddy være den eneste offentlige prosessen. Direktivet reverse_proxy videresender Host og X-Forwarded-*-headere på en fornuftig måte for de fleste apper. Hvis appen genererer absolutte HTTP-URL-er, sett trusted proxy / HTTPS-flagg i appen (Django SECURE_PROXY_SSL_HEADER, Express trust proxy, og så videre).

bash
app.example.com {
    encode gzip
    reverse_proxy 127.0.0.1:8000
}

# Several hosts in one file are normal:
# blog.example.com {
#     root * /var/www/blog
#     file_server
# }

Steg 4: Brannmur og systemd

Tillat 80 og 443. Caddys enhet er caddy.service; reload er nok etter Caddyfile-redigeringer hvis prosessen er frisk. Hvis du endrer miljøvariabler for et DNS-plugin, er en full omstart tydeligere. Sertifikater ligger under /var/lib/caddy/.local/share/caddy/ som standard — inkluder den stien i sikkerhetskopier hvis du bryr deg om hastighetsgrenser ved reinstallasjon.

bash
ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable

systemctl enable --now caddy
systemctl reload caddy

# Backup cert storage (path may vary slightly by version):
ls -la /var/lib/caddy/

Steg 5: Logger, komprimering og headere

Tilgangslogger hjelper når en bot hamrer en sti, eller når du feilsøker 404-er. Du kan logge per nettsted. Legg til sikkerhetsheadere hvis du hoster en nettleserapp; ikke kopier en enorm headerpakke uten å forstå HSTS (når du setter en lang max-age, husker nettlesere det).

bash
example.com {
    root * /var/www/example
    file_server
    encode gzip
    log {
        output file /var/log/caddy/example.log
    }
    header {
        X-Content-Type-Options nosniff
        Referrer-Policy no-referrer-when-downgrade
        -Server
    }
}

mkdir -p /var/log/caddy
chown caddy:caddy /var/log/caddy
systemctl reload caddy

Steg 6: PHP og andre tillegg

Caddy kan snakke med PHP-FPM med direktivet php_fastcgi. Det er nok for mange WordPress- eller Laravel-verter, men du trenger fortsatt php-fpm installert og en socket-sti som matcher. Hvis du allerede har en perfekt Nginx PHP-config, er migrering på én kveld valgfritt — Caddy skinner mer på reversproxy + statisk + automatisk TLS.

bash
example.com {
    root * /var/www/example
    php_fastcgi unix//run/php/php8.3-fpm.sock
    file_server
}

# Confirm FPM is running:
systemctl status php8.3-fpm

Migrere fra Nginx uten uventet nedetid

Stopp Nginx før du starter Caddy, ellers kjemper de om 80/443. Senk DNS TTL dagen før hvis du også flytter IP-er. Test med curl --resolve slik at du kan treffe den nye VPS-en før du bytter A-posten. Behold Nginx-configs i git en uke i tilfelle du må rulle tilbake.

  • systemctl stop nginx && systemctl disable nginx
  • Installer Caddy, valider Caddyfile, start Caddy
  • curl -I --resolve example.com:443:NEW_IP https://example.com
  • Endre DNS først deretter hvis IP-en er ny
  • Ny utstedelse er automatisk; ikke kjør også Certbot mot samme vertsnavn

Feilsøking

ACME-feil er nesten alltid DNS, brannmur eller en annen tjeneste på port 80. Caddy-logglinjer nevner tls.obtain. Hvis nettstedet virker på HTTP men ikke HTTPS, ble utstedelsen aldri fullført. Hvis du ser for mange sertifikater, har du truffet Let's Encrypt-hastighetsgrenser — bruk staging-CA mens du tester, ikke produksjon.

  • validate feiler: Caddyfile-syntaks, manglende klamme
  • permission denied on root: chown caddy for nettstedkatalogen
  • bind: address already in use — ss -tulpn | grep -E ':80|:443'
  • certificate timeout: dig +short domenet fra VPS-en, ufw allow 80
  • 502 reverse_proxy: backend nede, eller du proxet til localhost fra et containernettverk feil

Sikkerhetsmerknader

Caddys TLS-standarder er konservative. Jobben din er applikasjonssikkerhet og SSH. Ikke aktiver Caddys admin-API på et offentlig grensesnitt. Standard admin-endepunkt er lokalt; la det være slik. Hvis du bruker en Caddyfile fra internett, les hver matcher — en snippet som reverse_proxies /* til en intern IP kan bli en åpen proxy.

  • Ikke eksponer admin-API-et
  • Hold pakken oppdatert
  • HSTS bare når du er sikker på at HTTPS virker for alle vertsnavn
  • Skill test- og produksjonsvertsnavn for å beskytte ACME-hastighetsgrenser

Tips

  • caddy fmt --overwrite /etc/caddy/Caddyfile holder filen lesbar
  • Bruk import-snippets når du har mange lignende nettsteder
  • For Docker er imagen caddy:alpine med en montert Caddyfile vanlig
  • Jokertegnsertifikater trenger en DNS-modul og API-token — beskytt den tokenen
  • Les journalctl -u caddy før du skriver om hele filen

Caddy på en VPS er: offisiell pakke, en kort Caddyfile, portene 80/443 åpne, DNS som allerede peker på serveren, og systemd reload etter redigeringer. Bruk den som statisk filserver eller som reversproxy foran Gunicorn, Node eller Docker. Automatisk HTTPS virker når ACME kan svare på port 80; hvis utstedelsen mislykkes, fiks DNS og portkonflikter før du skylder på Caddy. Sikkerhetskopier /var/lib/caddy hvis du installerer på nytt ofte.