用 Caddy 给面板加反向代理:3 行配置,踩了 3 个小坑
Komari 面板我只让它监听 127.0.0.1,安装向导走完以后,总得让外面能访问。办法是前面挂一层 Caddy。
选 Caddy 的理由很简单:自动申请和续期 HTTPS 证书,配置短。Nginx 也能做,但证书那套要另外配 certbot。下面的过程先在一台 Debian 测试机上跑过,Caddy 版本 v2.11.7。
配置就三行
example.com {
reverse_proxy 127.0.0.1:25774
}
域名换成自己的,端口是 Komari 面板的。写进 Caddyfile,caddy run --config Caddyfile,按理就完事了。
坑一:bind: permission denied
结果一跑就退出:

listen tcp :443: bind: permission denied。Linux 上 1024 以下的端口普通用户绑不了,我在测试机上是拿普通用户直接跑的二进制。
正式机器不会碰到这个,前提是用官方的包装成系统服务。官方 caddy.service 里是以 caddy 用户运行的,但带了一行:
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
有了 CAP_NET_BIND_SERVICE,不用 root 也能绑 80 和 443。配置文件位置是 /etc/caddy/Caddyfile,改完 systemctl reload caddy。
如果是自己下的二进制手动跑,别图省事直接用 root,给二进制加能力就行:setcap cap_net_bind_service=+ep /usr/local/bin/caddy。
测试机上我没法用 443,就把站点地址改成了 :8080 先验证代理逻辑。
坑二:not formatted 不是报错
改完先 validate 一下,输出两行:

第一眼看到 Caddyfile input is not formatted 以为配置写错了,其实下面紧跟着就是 Valid configuration。前一句只是说缩进不规范,我那个文件里 reverse_proxy 前面没缩进。
caddy fmt --overwrite Caddyfile2 会把它改成标准格式(用 tab 缩进),之后警告就没了。不改也能跑,但养成习惯,每次改完 fmt 一下,diff 的时候干净。
坑三:curl -I 出来 404
用 :8080 跑起来后,开始测:

第一次是 502 Bad Gateway。这个好理解,后端 Komari 当时没启动,Caddy 连不上上游就回 502。
把 Komari 拉起来,等 8 秒,再 curl -I,变成了 404。
这里我愣了一下:代理通了,页面却不存在?去翻 Komari 自己的日志,有一行 404 HEAD /。curl -I 发的是 HEAD 请求,看样子 Komari 的根路径没处理 HEAD,直接回了 404。浏览器发的是 GET,不受影响。
判断请求有没有经过 Caddy,看响应头里的 Via: 1.1 Caddy 就行,这是 Caddy 转发时加上的。再用 GET 请求一个确定存在的接口:
curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:8080/api/install/status
返回 200,代理没问题。
教训是测反代别只用 curl -I,后端对 HEAD 的处理不一定和 GET 一样,换成 -w "%{http_code}" 看 GET 的状态码更准。
换回域名之前
测试机上验证的是代理本身。真正用域名的时候还要满足两个条件,这两个我在测试机上没条件验证:
- 域名的 A 记录已经指到服务器;
- 云服务器的安全组(或 Flexus 控制台里的防火墙)放行了 80 和 443。
Caddy 申请证书要从外面访问到这两个端口,少一个证书就下不来,日志里会一直重试。
还有两点跟上一篇有关。Komari 的 Agent 走 WebSocket,Caddy v2 的 reverse_proxy 默认就能转发 WebSocket,不用额外写配置;不过这次 Agent 是直连面板测的,经过 Caddy 这条链路我没跑。另外 Caddy 默认不记访问日志,要是自己加了 log 指令,Agent 带在 URL 里的 token 会跟着进日志,注意一下日志文件的权限。
测试时看到的两行日志
Caddy 启动日志里有两条 warn:HTTP/2 skipped because it requires TLS、HTTP/3 skipped because it requires TLS。这是因为 :8080 走的是纯 HTTP,HTTP/2 和 HTTP/3 都需要 TLS,换成域名自动上了证书就不会再出现。
另一条是 admin 接口监听在 localhost:2019,只对本机开放,不用管,但也别把它代理出去。
正式用的时候,Caddyfile 还是开头那三行,fmt 过一遍而已。三个坑没有一个出在配置上。
- 点赞
- 收藏
- 关注作者
评论(0)