用 Caddy 给面板加反向代理:3 行配置,踩了 3 个小坑

举报
赛博大妈 发表于 2026/11/06 09:25:02 2026/11/06
【摘要】 给只监听本机的 Komari 面板前面加一层 Caddy 反向代理。配置本身只有 3 行,记录的是过程中遇到的三件事:普通用户跑 Caddy 绑不了 443、caddy validate 报"not formatted"其实只是格式警告、用 curl -I 测出 404 并不是代理坏了。最后用 Via 头和接口返回码确认请求确实经过了 Caddy。

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 的状态码更准。

换回域名之前

测试机上验证的是代理本身。真正用域名的时候还要满足两个条件,这两个我在测试机上没条件验证:

  1. 域名的 A 记录已经指到服务器;
  2. 云服务器的安全组(或 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 过一遍而已。三个坑没有一个出在配置上。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。