返回目录

一个 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
}

证书申请不下来,先查这三样

  1. 域名有没有解析到这台机器:dig +short example.com,看返回的是不是服务器的地址。
  2. 外网能不能访问 80 和 443:证书机构会从外网来访问这台机器,验证域名确实归你管。云服务器的安全组(云厂商那边的防火墙)要放行这两个端口。
  3. 国内的服务器,域名要先备案。没备案的域名,云厂商会在网络入口直接拦下,证书机构也访问不到,所以证书同样申请不下来。

申请失败时 Caddy 会隔一段时间自动再试,日志里能看到原因:docker logs 容器名。条件都满足以后重启一下 Caddy,它会马上重新申请,不用干等。

改配置的习惯