Caddy 自动 HTTPS 反向代理实战:三行配置让服务安全上公网


很多人从一台 VPS 起步时都卡在一个看似简单的问题上:想用 Nginx/Traefik 当反代把好几个自建服务挂到不同子域名,还得自己配证书、写 301/302、做 HTTP/2——光是为了"让 https://a.example.com 指向 127.0.0.1:8080 还带自动证书"这一件事,就要写十几行配置。可这件事本该很简单。Caddy 就是为了"把反代 + 自动 HTTPS + 反向代理配置的默认值做到最好用"而生的:它自动为每个域名申请并续期 Let's Encrypt 证书、自动处理 HTTP→HTTPS、把几乎一切合理默认内置好。这篇讲清 Caddy 的核心设计、最常用的站点块、反向代理与负载均衡、以及它和 Nginx/Traefik 该怎么选。

一、Caddy 的差异化:自动证书 + 合理的默认值

如果只用一个词形容 Caddy 对自托管的友好,那一定是"自动"。它最出名的能力是 ACME 自动证书:你只要在配置里写一个域名,Caddy 就会自动为你向 Let's Encrypt/ZeroSSL 申请证书,并在到期前自动续期,还会自动把 HTTP 流量重定向到 HTTPS。你不再需要手动单独维护证书签发、续期和重定向三件事——这三件在 Nginx 里各是一块要精心伺候的配置。

另一个被低估的点是"合理的默认值":Caddy 默认就启用 HTTP/2/HTTP/3、自动压缩、合理的 TLS 选项和日志。对于"我不是网络专家,只想把服务安全地挂出去"的自托管用户,这种"开箱即用且默认安全"的取向,比"需要把所有安全项都手写"的 Nginx 更省心。它不是没有高级能力,而是把常见需求都做成了默认。

二、最小上手:一个反向代理就三行

Caddy 用 Caddyfile 配置,可读性比 Nginx 高一大截。一个把子域名代理到本地某端口的最小反代是这样:

# Caddyfile
a.example.com {
    reverse_proxy 127.0.0.1:8080
}

b.example.com {
    reverse_proxy 127.0.0.1:9090
}

就这些。写完 `caddy adapt` 可以预览编译后的配置(Caddy 会翻译成内部的 JSON),`caddy run` 启动则自动申请证书。这样每个子域名站点块就是一个相对独立的"反代入口",比在 Nginx 里为每个站点拆一个 server 块、再各配一套证书和 redirect,简洁太多。很多人第一次用 Caddy 的最大冲击,就是"原来 HTTPS 反代可以少写这么多字"。

三、多用但重要的站点块能力:路径、头与静态文件

站点块里除了指向后端,还有几个自托管高频会用到的能力。一是路径路由——同一个域名下按路径把请求分到不同服务;二是改请求头——很多后端依赖转发来的默认 X-Forwarded-* 头来判断真实 IP 和协议;三是静态文件服务——直接给一个目录吐出内容,用来做简单的公开资源或前端静态站。

a.example.com {
    # 按路径分派:/api 走后端,其余走静态目录
    handle /api/* {
        reverse_proxy 127.0.0.1:8080
    }
    handle {
        root * /srv/web
        file_server
    }

    # 显式设置转发头,让后端拿到真实访问信息
    header_up X-Forwarded-Proto https
    header_up X-Forwarded-Host {host}
}

这些能力你可能一开始用不上,但写进记忆有助于在"某个服务在 Caddy 后面拿不到真实 IP、或者静态资源没被正确吐出来"时,知道改哪里。原则和前面几次说的反代一致:先用最小反代跑通,再按需往站点块里加这些指令,而不是一上来就把配置写复杂。

四、多服务与负载均衡:同一个入口分给多个后端

当你有几个实例想共享一个域名/入口、或者想给某个服务做简单负载均衡时,Caddy 的 `reverse_proxy` 可以跟多个后端叠加,用负载均衡算法(默认轮询 round-robin)把请求分发开,还带健康检查:

web.example.com {
    reverse_proxy 127.0.0.1:8080 127.0.0.1:8081 {
        lb_policy round_robin        # 轮询分发到两个后端
        lb_health_check /health      # 定期检查 /health,挂了自动摘下
    }
}

对自托管规模来说,这种"入口级负载均衡"在单个服务多实例时会用到;但大多数场景其实只是一对一反代。清楚区分这两者,能避免"因为不会就过度设计"——单服务就用最简单的一对一,等真出现多实例需要分摊再上负载均衡。

五、和 Nginx / Traefik 怎么选:别为反代工具纠结太久

站在自托管视角,反代工具其实没有"谁一定最好",只有"哪个更贴你的偏好"。Nginx 功能全、生态大、但配置手写多、证书要自己管;Traefik 用标签/声明式、Docker 场景集成好、是之前聊过的 K3s 默认;Caddy 的强项是自动证书和极致简洁的 Caddyfile。对"想最快把服务安全挂出去、不想折腾证书"的人,Caddy 往往是门槛最低的那个。

我的判断标准很简单:如果你已经在用 Docker 栈且 Traefik 已经顺手,不必为 Caddy 切换;如果你是"想少写配置、自动 HTTPS、把更多注意力留给业务",或者手上有不少纯静态/简单反代需求,Caddy 很值得。无论选哪个,前面定过的原则都适用——公开服务走反代 + 防火墙 + 认证,管理面收敛到私网或 Tailscale(尾网)。工具是白菜还是芥菜,别让"换反代工具"本身成为一件拖延正事的大事。

结语

Caddy 的存在价值,是把"反向代理 + 自动 HTTPS"从"Nginx 里一堆要伺候的配置"压缩成"一个域名 + 一个 proxy 目标"。抓住三件事就能上手:用站点块 + reverse_proxy 做最小反代,按需往块里加路径路由、改头、静态文件,需要时用多后端 + 健康检查做负载均衡。再跟 Nginx/Traefik 做个清醒对比——它不是"最强大",而是"对想要自动证书和少写配置的人最省心"。当你想用最小摩擦给自托管服务配上可靠的 HTTPS 入口时,Caddy 就是那个让你"忘掉 ssl 证书续期这件事"的答案。


手机扫码阅读

微信或手机浏览器扫一扫,随时随地随心阅读与分享

Harbor 私有镜像仓库实战:给容器镜像安排一个可信的安身之所

Prometheus+Grafana 监控告警实战:把故障从事后救火变成事前提醒

评 论
更换验证码