Caddyfile 生成
生成一份能直接跑的 Caddyfile:静态站或反向代理,HTTPS 自动签发,压缩、安全头和日志按需打开。
需要注意
- 反向代理已经显式转发 Upgrade/Connection。上游如果不是 WebSocket 服务,这两行不会有害,但也不是必须的。
- 域名要先解析到这台机器,80 和 443 端口要能直连,Caddy 才能完成 ACME 校验并签发证书。
- 改完配置先 caddy validate,再用 systemctl reload caddy;直接 restart 会中断正在处理的请求。
- 同机还有其他 Web 服务器占用 80/443 时,Caddy 起不来。要么停掉它,要么让 Caddy 只监听别的端口。
生成规则
不写 tls 指令时,Caddy 会对每个域名自动申请证书,HTTP 请求也会被自动跳到 HTTPS。多域名用逗号分隔写在同一行,证书会分别申请;泛域名要配 DNS challenge,光靠 HTTP 校验拿不到。
反向代理默认补了 X-Real-IP 和 X-Forwarded-Proto,上游框架取客户端 IP 和协议时用得上。WebSocket 的 Upgrade 头其实 Caddy 会自动处理,这里显式写出来是为了让配置本身能说明意图。
静态站的 try_files 只在前端路由需要时打开;普通多页站点不需要,否则拼错的 URL 会静默返回首页,掩盖死链。上传限制用 request_body,只影响请求体,不影响响应。
还在用 Nginx 的话,同类配置看Nginx 配置生成;服务要常驻的话,用systemd 服务配置生成写单元文件。
常见问题
Caddy 和 Nginx 怎么选?
Caddy 默认自动申请续期证书、配置语法短,适合个人项目和中小服务;Nginx 生态更成熟,模块、教程和调优经验多,复杂路由和超高并发场景更常见。两者都能反代,差别主要在运维成本。
证书是自动申请的吗?
域名能解析到本机、80/443 可达时,Caddy 会自动走 ACME 申请并续期,配置里什么都不用写。内网域名或纯 IP 用 tls internal,走本地 CA,需要把根证书装到客户端。
为什么配置改完没生效?
先跑 caddy validate --config Caddyfile 看语法,再 systemctl reload caddy 热加载。直接改文件不会自动生效;如果 reload 失败,Caddy 会保留旧配置继续服务,日志里能看到具体哪一行。
try_files 会不会把接口 404 也变成首页?
会。SPA 的兜底规则对所有找不到的路径都返回 index.html,接口路径也会变成 200。把接口放到单独的域名或路径 matcher 里,或者在反代上游处理 API,别让前端路由吃掉接口错误。
上传大文件报 413 怎么调?
request_body 的 max_size 限制的是请求体大小,调成比最大文件略大即可。反向代理场景还要确认上游框架自己的上传限制,两层都放开才有效。
日志文件越来越大怎么办?
Caddy 的 file 输出不自动切割。可以用 logrotate 按天切并给 Caddy 发 USR1 信号,或者把日志写到 stdout 交给 journald / Docker 的日志驱动统一管理。