caddy在linux上安装极快,配置仅需一个caddyfile,反向代理localhost:8301三行即可,https自动生效,但权限、端口、证书路径三点最易出错。

直接说结论:Caddy 在 Linux 上安装极快,配置核心就一个 Caddyfile,反向代理 localhost:8301 三行能搞定,HTTPS 自动生效——但权限、端口、证书路径这三点最容易卡住。
怎么装 Caddy(Ubuntu/Debian/CentOS 通用)
别用老旧的 curl https://getcaddy.com | bash,它已弃用且不兼容 Caddy 2.9+。现在官方主推包管理器安装:
- Ubuntu/Debian:
sudo apt install debian-keyring debian-archive-keyring apt-transport-https→ 导入密钥和源 →sudo apt update && sudo apt install caddy - CentOS/RHEL 8+:
sudo dnf copr enable @caddy/caddy && sudo dnf install caddy - 验证:
caddy version输出带v2.9.x或更高即成功
注意:安装后 caddy 二进制默认在 /usr/bin/caddy,服务用户是 caddy(非 root),所以后续所有配置文件和证书目录必须让该用户可读写。
为什么 reverse_proxy localhost:8301 启不来
常见报错是 HTTP 502 Bad Gateway 或日志里出现 dial tcp 127.0.0.1:8301: connect: connection refused,本质不是 Caddy 配错了,而是目标服务没起来或网络不通:
- 先手动确认:
curl -v http://localhost:8301/health能通才继续;不通就查你自己的服务是否监听127.0.0.1:8301(而非127.0.0.1:8301或0.0.0.0:8301) -
reverse_proxy默认只转发 HTTP,如果你的服务是 HTTPS,请写成reverse_proxy https://localhost:8301,并加transport http { tls insecure_skip_verify }(仅测试用) - 若目标服务绑定了
127.0.0.1,Caddy 用localhost能通;但某些容器环境里localhost指向容器自身,此时得换host.docker.internal或宿主机 IP
配置 Caddyfile 的最小可行写法
不要一上来就抄复杂模板。针对“把本地 localhost:8301 暴露给公网”这个最常用场景,/etc/caddy/Caddyfile 只需这样:
yourdomain.com {
reverse_proxy localhost:8301
}
说明:
- 域名必须已 DNS 解析到服务器 IP,否则 Caddy 申请 Let’s Encrypt 证书会失败,回退到 HTTP 模式(日志提示
no certificate available) - 想同时支持 HTTP 和 HTTPS?不用额外配——Caddy 默认 80→443 重定向,且自动申请证书存到
/var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/ - 如果只是临时调试,不想绑域名,用
:80或:8000监听::8000 { reverse_proxy localhost:8301 }注意:非特权端口(>1024)无需setcap,省心
启动失败常见原因和修复动作
执行 sudo systemctl start caddy 报 failed to load initial config 或服务立即退出,优先查这三项:
-
sudo caddy validate --config /etc/caddy/Caddyfile:语法校验,错一个空格都报错 -
sudo chown -R caddy:root /etc/caddy /var/lib/caddy:Caddy 运行用户是caddy,它必须对配置目录和证书目录有读写权;/etc/ssl/caddy已废弃,新版证书全在/var/lib/caddy -
sudo setcap 'cap_net_bind_service=+ep' /usr/bin/caddy:只有监听 80/443 才需要。不加这句又硬要绑 80 端口,就会报bind: permission denied
真正容易被忽略的是:Caddy 的证书缓存和 DNS 解析依赖系统时间。如果服务器时间偏差 >5 分钟(常见于虚拟机或未启用 NTP),Let’s Encrypt 会拒绝签发,且错误日志里不直接提示时间问题——务必先 sudo timedatectl set-ntp true。










