使用 Caddy 为容器网站配置反向代理与 HTTPS

整理说明:本文属于“2025-2026 技术笔记整理”系列,于 2026 年 8 月集中整理并公开发布。

用 Caddy 为 WordPress 配置反向代理与域名 HTTPS

WordPress 可只监听内部网络,由 Caddy 接收公网请求、终止 TLS,再转发给应用。这样只有代理发布端口,数据库和应用不直接暴露,也便于管理证书。

域名和网络是自动 HTTPS 的前提

把 A 记录指向服务器公网 IPv4;若发布 AAAA 记录,也要确保 IPv6 可达。防火墙需允许 TCP 80、443。Caddy 使用域名作为站点地址时会申请、续期证书,并把 HTTP 重定向到 HTTPS。解析错误或公网无法回源会导致签发失败。

代理与 WordPress 应加入同一 Compose 网络。内部 DNS 会解析服务名,因此上游可写 wordpress:80;对 Caddy 容器而言,localhost 指向它自己。

example.com {
  encode zstd gzip
  reverse_proxy wordpress:80

  header {
    -Server
    X-Content-Type-Options "nosniff"
    Referrer-Policy "strict-origin-when-cross-origin"
  }
}

example.com 换成真实域名即可触发 HTTPS;仅写 :80 不会申请域名证书。裸域名与 www 同时使用时,应明确主域名并重定向。

保存证书状态,正确传递协议

Caddy 的 /data 包含证书、私钥和自动 HTTPS 状态,必须挂载持久卷;/config 也宜持久化。丢失这些数据可能导致重复申请证书。私钥卷及其备份应限制权限。

reverse_proxy 会设置常用的 X-Forwarded-* 头。WordPress 必须识别 X-Forwarded-Proto: https,并使用 https:// 站点地址,否则可能出现循环跳转或混合内容。只应信任受控代理的转发头。

验证配置再切换流量

docker compose exec proxy \
  caddy validate --config /etc/caddy/Caddyfile
docker compose restart proxy
docker compose logs -f --tail=100 proxy

校验通过后重启代理,并从外部访问域名,检查证书主机名、HTTPS 跳转、后台登录和媒体资源。保留管理 API 时可优雅重载;显式关闭管理 API 时应重启容器。

  • 证书错误先查 A、AAAA 记录,再查 80、443 端口。
  • 出现 502 时,检查共享网络、服务名、容器状态和上游日志。
  • 循环跳转时,核对 WordPress 的 HTTPS 识别逻辑和站点地址。

上线后应观察证书续期和错误日志。域名可达、存储持久化和正确处理代理头,都是稳定运行的必要条件。