Caddy 部署 Web 应用新手指南:自动 HTTPS、静态服务与反向代理

Caddy 是 Go 写的开源 Web 服务器:自动 HTTPS、Caddyfile 极简配置、原生 HTTP/3、零运行时依赖,内置反向代理/负载均衡/健康检查。本文用 Docker 演示静态站点、HTTPS、请求日志与反向代理全流程。

最佳实践
加密网络与通信桥梁插画

直接回答:Caddy 是 Go 编写的开源 Web 服务器,核心卖点是"省心"——自动申请续期 HTTPS 证书、Caddyfile 配置只需几行、原生支持 HTTP/3、零运行时依赖。它还能做反向代理(含负载均衡与健康检查),用 Docker 一条命令即可起步。

为什么是 Caddy 而不是 Nginx/Apache

  • 自动 HTTPS:首次启动即为域名申请并自动续期证书,无需 certbot 之类外挂
  • 配置极简:一个反向代理配置 Caddyfile 两行搞定,不用学一门新配置语言
  • HTTP/3 原生:面向未来的传输协议开箱即用
  • 零依赖单二进制:跨平台安装运行, footprint 极小

用 Docker 起步

docker run -d -p 80:80 -p 443:443 -p 443:443/udp \
  -v "$PWD/Caddyfile:/etc/caddy/Caddyfile:ro" \
  -v "$PWD/site:/srv:ro" \
  -v caddy_config:/config \
  -v caddy_data:/data \
  caddy:2

先准备 Caddyfile 与 site 目录。此示例面向计划公开的站点,主机和云安全组需按需求放行 TCP 80/443;HTTP/3 还需 UDP 443。生产固定受支持镜像 digest,并限制管理 API 只能从可信网络访问。

/data 卷必须持久化——证书与自动 HTTPS 状态都在里面。

静态文件服务与 HTTPS

Caddyfile 一行就是一个站点:

example.com {
    root * /srv
    file_server
}

需真实域名解析到此主机、ACME 验证可达、出站网络和持久存储正常;满足条件后 Caddy 可自动申请和续期——这是它与前辈们最大的体验差异。

请求日志

example.com {
    log {
        output stdout
    }
}

容器中日志可输出 stdout;默认非终端输出为 JSON,接入采集器前先查看实际输出。将日志送入观测云后,可用 Pipeline 调试检查一条成功请求和一条失败请求,确认状态码、URI 和耗时字段的解析结果,再按这些字段查询。

反向代理

api.example.com {
    reverse_proxy backend1:3000 backend2:3000 {
        lb_policy round_robin
        health_uri /healthz
    }
}

负载均衡、主动/被动健康检查可在 reverse_proxy 配置,不能把健康检查自动等同完整熔断器——中小型部署不再需要单独一层网关。

上面的 backend1/backend2 必须在同一可解析网络中且提供 /healthz;不是仅复制域名就存在的后端。多个同域名 Caddyfile 示例应合并到一个站点块,而不是重复定义。

常见问题(FAQ)

Q:Caddy 性能比得上 Nginx 吗?
A:绝大多数 Web 场景两者性能差异不构成瓶颈。Caddy 赢在安全默认值(自动 HTTPS、现代 TLS)与运维省心;性能选择需以真实请求、TLS 和后端负载测试为准。

Q:内网服务没有公网域名能自动 HTTPS 吗?
A:拥有可验证公网域名但服务不公开时可使用 DNS-01(需对应 DNS 模块与最小权限凭证);纯内网名可用 tls internal,客户端必须信任内部 CA,不能获得公开 CA 对任意私有名称签发的证书。

Q:Caddy 适合做生产网关吗?
A:中小规模完全够——负载均衡与健康检查可配置。需要复杂路由规则、细粒度限流时,再考虑专用 API 网关。

官方参考

本文依据官方文档整理,示例未在本文中进行运行验证。生产部署需按所用版本、权限和实际负载验证。

延伸阅读

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台