一个 Caddy 同时管几个站点
为什么只能有一个入口
网页默认走 80(http)和 443(https)两个端口,一台机器上这两个端口只能被一个程序占着。所以同一台服务器上跑好几个站点时,得由一个程序统一接住所有请求,再按域名分给各个站点。我用的是 Caddy,它的好处是 https 证书能自动申请、自动续期。
配置写法
每个域名写一段,Caddy 按请求里的域名找对应的那一段:
example.com {
root * /srv/site-root/site
file_server
}
www.example.com {
redir https://example.com{uri} permanent
}
app.example.com {
reverse_proxy app:3000
}
root加file_server:直接把目录里的静态网页发出去。redir:把 www 开头的地址统一跳到不带 www 的。-
reverse_proxy:把请求转给后面的应用。这里的app是 Docker Compose 里的服务名,同一个 Compose 里的容器能直接用服务名互相访问。
证书申请不下来,先查这三样
-
域名有没有解析到这台机器:
dig +short example.com,看返回的是不是服务器的地址。 - 外网能不能访问 80 和 443:证书机构会从外网来访问这台机器,验证域名确实归你管。云服务器的安全组(云厂商那边的防火墙)要放行这两个端口。
- 国内的服务器,域名要先备案。没备案的域名,云厂商会在网络入口直接拦下,证书机构也访问不到,所以证书同样申请不下来。
申请失败时 Caddy 会隔一段时间自动再试,日志里能看到原因:docker logs 容器名。条件都满足以后重启一下 Caddy,它会马上重新申请,不用干等。
改配置的习惯
- 改之前先备份原文件。
-
改完先检查语法再生效:
caddy validate --config /etc/caddy/Caddyfile。写错了 Caddy 会拒绝加载,正在跑的站点不受影响,但养成先检查的习惯更稳。 -
证书存在 Caddy 的
/data目录里,用 Docker 跑时要把它挂成数据卷。不然每次重建容器都要重新申请,次数多了会被证书机构限制。 - 如果有脚本会读 Caddyfile 里的第一个站点(比如发布后的检查脚本),新站点加在后面,别插到最前面。