简介

Caddy的proxy可以用于配置:

  1. 普通的反向代理
  2. 负载均衡:支持多策略,健康检查,故障转移
  3. WebSocket代理

开启该指令后,Caddy的proxy中间件会添加一个可用于 {upstream} 的占位符,用于记录哪一个代理的处理的请求.

proxy完整语法格式为:

proxy from to... {
policy name [value]
fail_timeout duration
max_fails integer
max_conns integer
try_duration duration
try_interval duration
health_check path
health_check_port port
health_check_interval interval_duration
health_check_timeout timeout_duration
header_upstream name value
header_downstream name value
keepalive number
without prefix
except ignored_paths...
upstream to
insecure_skip_verify
preset
}
  • from 被代理的请求的路径
  • to 代理的断点,可以是多个,支持 http/https/quic/srv/unix/quic, 如果是 srv:// 或者 srv+https:// 则被认为是一个服务定位器,Caddy将通过SRV DNS去解析
  • policy 负载均衡策略,必须有多个后端.如果后端是服务定位器则不可以,可选的有random, least_conn, round_robin, first, ip_hash, uri_hash 和 header, 默认为random
  • fail_timeout 失败了的请求记住多久.如果在这期间达到了max_fails,则被考虑为挂掉了,不会再有请求发送过去,除非失败的请求被忘记了.默认为0,总是可用.
  • max_fails 如果fail_timeout为0则无效,默认为1
  • max_conns 每一个后端的最大请求数,默认0,没有限制,如果达到了返回502错误.
  • try_duration 第一个上游失败了,挂起外面来的请求多久
  • try_interval 某一个上游服务器挂了之后等待多久切换下一个上有服务器,默认250ms. 设置为0并且设置了duration可能占满cpu
  • health_check 设置一个路径,Caddy将定期发出请求,如果返回200和399就认为正常,否则就不正常,然后提前定义的interval间隔里他就是被考虑不正常的.
  • health_check_port 设置一个额外的检查端口,如果是服务定位器就无效
  • health_check_interval 健康检查间隔,默认30s
  • health_check_timeout 检查超时时间,默认60s
  • header_upstream 传递到后方的头,可以多个,也可以用请求占位符
  • header_downstream 修改返回的响应头
  • keepalive 保持多少和后端之间闲置的连接,设置为0关闭keepalive
  • without 去掉的前缀(/api/foo without /api 将访问 /foo. )
  • except设置不代理的路径
  • upstream 基本等同于to配置
  • insecure_skip_verify 重载后端TLS认证,禁用HTTPS的安全功能
  • preset 支持的有websocket和transparent

Presets

websocket等价于:

header_upstream Connection {>Connection}

header_upstream Upgrade {>Upgrade}

transparent等价于:

header_upstream Host {host}

header_upstream X-Real-IP {remote}

header_upstream X-Forwarded-For {remote}

header_upstream X-Forwarded-Proto {scheme}

负载均衡策略

  • random (default) - 随机选择
  • least_conn - 选择活跃连接最少的
  • round_robin - 循环选择
  • first - 按照配置中的顺序,选择第一个可用的
  • ip_hash - 基于IP地址的hash值分配
  • uri_hash - 基于URL的hash值分配
  • header - 基于某个请求头的hash值分配

via.https://toaco.github.io/2018/03/05/Caddy%20proxy%E6%8C%87%E4%BB%A4%E8%AF%A6%E8%A7%A3/