Käänteinen välityspalvelin vastaanottaa kaiken verkkoliikenteen porteissa 80 ja 443 ja välittää jokaisen pyynnön palvelimen oikealle sovellukselle. Caddy on hyvä valinta, koska se hankkii ja uusii HTTPS-varmenteet itse: yksi rivi, kuten reverse_proxy localhost:3000, sivustoa kohden riittää.
Tämä opas asentaa Caddyn Ubuntu 24.04:lle tai Debian 12:lle ja rakentaa määritykset vaihe vaiheelta.
Miksi välityspalvelin kannattaa laittaa eteen
- Yksi sisääntulopiste. Useita sovelluksia yhdellä palvelimella, kukin omalla verkkotunnuksellaan tai polullaan.
- HTTPS yhdessä paikassa. Sovellukset puhuvat tavallista HTTP:tä localhostissa; Caddy hoitaa TLS:n.
- Tietoturva. Sovellukset eivät koskaan kuuntele julkisissa porteissa. Voit lisätä välityspalvelimessa otsakkeita, nopeusrajoituksia tai salasanan.
- Joustavuus. Siirrä sovellus toiseen porttiin tai palvelimeen ja muuta yksi rivi.
1. Esivaatimukset
- Palvelin, jolle on tehty ensimmäiset askeleet.
- Jokaisen verkkotunnuksen DNS-tietueet osoittavat palvelimeen (A IPv4:lle, AAAA IPv6:lle).
- Portit 80 ja 443 avoinna:
sudo ufw allow 80,443/tcp
sudo ufw allow 443/udp # HTTP/3
Avaa samat portit myös pilvipalomuurissasi, jos käytät sellaista.
2. Caddyn asennus
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | \
sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | \
sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install -y caddy
systemctl status caddy
Paketti ajaa Caddya systemd-palveluna, ja asetukset ovat tiedostossa /etc/caddy/Caddyfile.
3. Pienin hyödyllinen Caddyfile
Oletetaan, että sovellus kuuntelee osoitteessa localhost:3000. Korvaa tiedoston sisältö tällä:
app.example.com {
reverse_proxy localhost:3000
}
Tarkista ja lataa uudelleen:
sudo caddy fmt --overwrite /etc/caddy/Caddyfile
sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy
Ensimmäisellä pyynnöllä Caddy hankkii varmenteen, ohjaa HTTP:n HTTPS:ään ja palvelee sovellusta. Siinä kaikki.
4. Useita sovelluksia yhdellä palvelimella
Lisää lohko jokaiselle sivustolle:
app.example.com {
reverse_proxy localhost:3000
}
api.example.com {
reverse_proxy localhost:8080
}
status.example.com {
reverse_proxy localhost:3001
}
Tai jaa yksi verkkotunnus polun mukaan:
example.com {
handle_path /api/* {
reverse_proxy localhost:8080
}
handle {
root * /var/www/site
file_server
}
}
handle_path poistaa etuliitteen /api ennen välitystä; käytä handle-direktiiviä, jos taustapalvelu odottaa etuliitettä.
5. Hyödylliset oletukset snippetillä
Snippetit pitävät toistuvat asetukset yhdessä paikassa:
(common) {
encode zstd gzip
header {
Strict-Transport-Security "max-age=31536000; includeSubDomains"
X-Content-Type-Options "nosniff"
Referrer-Policy "strict-origin-when-cross-origin"
-Server
}
log {
output file /var/log/caddy/access.log {
roll_size 50MiB
roll_keep 5
}
}
}
app.example.com {
import common
reverse_proxy localhost:3000
}
Luo lokihakemisto kerran: sudo mkdir -p /var/log/caddy && sudo chown caddy:caddy /var/log/caddy.
6. Ylläpitotyökalun suojaus salasanalla
Luo salasanatiiviste:
caddy hash-password
Käytä sitä sivustolohkossa:
admin.example.com {
basic_auth {
alice <paste-hash-here>
}
reverse_proxy localhost:9000
}
Vanhemmissa Caddyn versioissa direktiivi kirjoitetaan basicauth. Kaikessa arkaluonteisessa rajaa pääsy lisäksi osoitteen mukaan:
admin.example.com {
@outside not remote_ip 198.51.100.0/24
respond @outside 403
reverse_proxy localhost:9000
}
Alue on esimerkki. Laita siihen toimistosi tai VPN:si alue; WireGuard-oppaan mukaisessa ratkaisussa se voisi olla VPN-aliverkkosi.
7. Välitys Docker-kontteihin
Jos Caddy toimii isäntäkoneella, sido kontit localhostiin, jotta ne eivät ole julkisia:
services:
app:
image: ghcr.io/example/app:1.0
ports:
- "127.0.0.1:3000:3000"
Jos Caddy toimii Dockerissa, laita se samaan Compose-projektiin ja välitä palvelujen nimiin (reverse_proxy app:3000). Docker Compose -opas näyttää kokonaisen kokonaisuuden.
8. Kuormantasaus useille taustapalveluille
Caddy voi jakaa pyynnöt usealle sovellusinstanssille samalla palvelimella tai muilla palvelimilla yksityisverkon kautta:
app.example.com {
reverse_proxy 10.0.0.11:3000 10.0.0.12:3000 {
lb_policy least_conn
health_uri /healthz
health_interval 10s
}
}
Osoitteet ovat esimerkkejä yksityiseltä alueelta. Kun haluat kuormantasauksen palvelintesi ulkopuolelle, hallinnoitu kuormantasaaja tekee saman työn terveystarkistuksin ja tavoittaa palvelimet, joilla ei ole julkista IP-osoitetta.
9. WebSocketit ja asiakkaiden oikeat IP-osoitteet
WebSocketit toimivat reverse_proxyn kautta ilman lisäasetuksia. Caddy lähettää taustapalvelulle otsakkeet X-Forwarded-For, X-Forwarded-Proto ja X-Forwarded-Host; määritä sovelluksesi luottamaan niihin vain osoitteesta 127.0.0.1.
Jos Caddy itse on toisen välityspalvelimen tai kuormantasaajan takana, kerro sille, mihin osoitteisiin luottaa:
{
servers {
trusted_proxies static 10.0.0.0/24
}
}
Tämä globaali lohko tulee Caddyfilen aivan alkuun.
10. Lokit ja vianetsintä
journalctl -u caddy --since "10 min ago"
sudo tail -f /var/log/caddy/access.log
curl -I https://app.example.com
Yleisiä ongelmia:
| Ongelma | Ratkaisu |
|---|---|
| Varmennetta ei myönnetä | DNS:n täytyy osoittaa tähän palvelimeen; portit 80/443 avoinna UFW:ssä ja pilvipalomuurissa |
502 Bad Gateway |
Taustapalvelu ei ole käynnissä tai kuuntelee toisessa portissa: ss -tlnp |
| Uudelleenohjaussilmukka | Myös sovellus ohjaa HTTPS:ään; anna Caddyn hoitaa se ja luota otsakkeeseen X-Forwarded-Proto |
| Muutokset eivät näy | Aja systemctl reload caddy ja tarkista caddy validate -komennon tuloste |
Varmentajat rajoittavat toistuvia epäonnistumisia, joten korjaa DNS ennen kuin yrität monta kertaa uudelleen.
Uudelleenohjaukset ja ensisijainen verkkotunnus
Useimpien sivustojen kannattaa vastata yhdellä nimellä ja ohjata muut siihen. Ohjaa www paljaaseen verkkotunnukseen:
www.example.com {
redir https://example.com{uri} permanent
}
example.com {
reverse_proxy localhost:3000
}
Caddy hankkii varmenteet molemmille nimille. Vaihda ne päittäin, jos haluat www:n pääosoitteeksi.
Nopeusrajoitus ja pyynnön koko
Caddy pitää ytimensä pienenä, joten nopeusrajoitus vaatii lisäosan. Useimmille pienille sivustoille riittää Fail2ban pääsylokissa tai rajoitus sovelluksessa. Pyynnön rungon koon rajoitus on sisäänrakennettu:
app.example.com {
request_body {
max_size 20MB
}
reverse_proxy localhost:3000
}
Tämä pysäyttää liian suuret lataukset ennen kuin ne saavuttavat sovelluksesi.
Staattiset tiedostot sovelluksen rinnalla
Tiedostojen jakaminen suoraan levyltä on nopeampaa kuin niiden kierrättäminen sovelluksen kautta:
app.example.com {
handle /static/* {
root * /var/www/app
file_server
header Cache-Control "public, max-age=604800"
}
handle {
reverse_proxy localhost:3000
}
}
11. Missä varmenteet ovat
Caddy tallentaa varmenteet ja avaimet hakemistoon /var/lib/caddy/.local/share/caddy. Sisällytä tämä polku varmuuskopioihin, jotta kaikkea ei tarvitse myöntää uudelleen palautuksen jälkeen; jos hakemisto puuttuu, Caddy yksinkertaisesti hankkii uudet varmenteet.
Seuraavat askeleet
Kun Caddy on edessä, voit isännöidä monta sovellusta yhdellä palvelimella. Tyypillisiä seuraavia askelia ovat WordPress, Docker-kokonaisuus tai itse isännöity työkalu self-hosting-sivulta. Älä unohda tietoturvan perusteita ja varmuuskopioita.
Usein kysytyt kysymykset
Hankkiiko Caddy todella HTTPS-varmenteet automaattisesti?
Kyllä. Kun Caddyfilen sivustoosoite on julkinen verkkotunnus, joka osoittaa palvelimeen, ja portit 80 ja 443 ovat tavoitettavissa, Caddy hankkii ja uusii varmenteet julkiselta ACME-varmentajalta itsenäisesti.
Onko Caddy riittävän nopea tuotantoon?
Kyllä. Tyypillisissä verkkosovelluksissa käänteinen välityspalvelin on harvoin pullonkaula, ja Caddy tukee HTTP/2:ta ja HTTP/3:a suoraan.
Voiko Caddy välittää Dockerissa ajettaviin sovelluksiin?
Kyllä. Aja Caddya samassa Compose-verkossa ja käytä palvelujen nimiä, tai sido kontit osoitteeseen 127.0.0.1 ja välitä localhostin portteihin.
Caddy vai Nginx?
Caddy vaatii vähemmän määrityksiä ja hoitaa varmenteet itse. Nginxillä on laajempi esimerkkien ja moduulien ekosysteemi. Molemmat ovat vankkoja valintoja.
Miksi Caddy ei saa varmennetta?
Yleensä DNS ei vielä osoita palvelimeen tai palomuuri estää portin 80 tai 443. Tarkista molemmat ja katso sitten journalctl -u caddy.