Caddy反向代理(reverse_proxy)

关于反向代理,详见链接

介绍

Caddy2,配置文件为 Caddyfile,自带自动HTTPS、自动X‑Forwarded头、WebSocket支持、负载均衡、健康检查,不需要额外编译模块。

语法

[站点地址] {
  reverse_proxy [匹配器] 后端地址... {
    # 代理子参数
  }
}

简单例子

1)命令行快速代理(无需Caddyfile 文件)

caddy reverse-proxy --from :8000 --to 127.0.0.1:9000

2)纯HTTP代理(内网/本地测试,不会申请证书)

地址前加http://,关闭自动HTTPS:

http://127.0.0.1:8000 {
    reverse_proxy 127.0.0.1:9000
}

配置校验命令:caddy validate --config Caddyfile
重载配置:caddy reload --config Caddyfile

3)域名自动HTTPS(公网最常用)

写域名,Caddy自动申请Let’s Encrypt证书,80自动跳转443 HTTPS

demo.example.com {
    # 建议带上邮箱,方便接收证书到期告警
    tls your@email.com
    # 将全部请求代理到本地8080后端服务
    reverse_proxy 127.0.0.1:8080
}

配置校验命令:caddy validate --config Caddyfile
重载配置:caddy reload --config Caddyfile

使用自有证书(不自动申请)

demo.example.com {
    tls C:/caddy/cert.pem C:/caddy/key.pem
    reverse_proxy 127.0.0.1:8080
}

路径匹配器:按URL分流

匹配器写在reverse_proxy后面,只匹配该路径的请求才转发;匹配器必须带通配符*。

demo.example.com {
    # /api/开头的请求转发后端
    reverse_proxy /api/* 127.0.0.1:8080

    # 其余路径返回静态文件
    file_server
}

注意:Caddy匹配器不会自动截取前缀,后端收到完整/api/xxx;

使用 handle 块做复杂路由

demo.example.com {
    handle /api/* {
        reverse_proxy 127.0.0.1:8080
    }
    handle /admin/* {
        reverse_proxy 127.0.0.1:8081
    }
    handle /* {
        file_server
    }
}

默认携带请求头

Caddy反向代理(reverse_proxy)-默认携带的请求头

请求头配置

Caddy反向代理(reverse_proxy)-请求头配置

transport传输层配置

transport http控制Caddy与后端之间的HTTP连接参数:keepalive、超时、后端是否HTTPS等。

超时设置

Caddy反向代理(reverse_proxy)-超时设置

Windows环境注意事项

  1. Caddyfile 保存为无扩展名文件名,编码使用UTF‑8;
  2. Windows路径分隔符直接写/,不要写\;

常见坑

  1. ❌域名配置没有写http:// → Caddy尝试公网申请证书,内网环境报错;内网测试务必加http://ip:port。
  2. ❌路径匹配reverse_proxy /api 127.0.0.1:8080,缺少*,只能匹配/api,不能匹配/api/xxx,必须写/api/*。
  3. ❌转发时URI前缀不去除:浏览器请求/api/xxx,后端收到/api/xxx,需要rewrite * {path.strip_prefix /api}。
  4. ❌多层代理获取真实IP,需要配置全局trusted_proxies,不要只写在单个reverse_proxy块内。
  5. WebSocket不需要任何Upgrade配置,Caddy自动识别。

原文出处:/show_1GW3pyaxOTTp.html