logo
Caddy:现代化的 Web 服务器

Caddy 反向代理进阶

本文详细介绍 Caddy 的反向代理功能及高级配置。

基础代理配置

简单代理

example.com {
    reverse_proxy localhost:8080
}

多后端服务器

example.com {
    reverse_proxy backend1:8080 backend2:8080 backend3:8080 {
        lb_policy round_robin
    }
}

负载均衡策略

轮询(Round Robin)

reverse_proxy {
    to backend1:8080 backend2:8080
    lb_policy round_robin
}

最少连接

reverse_proxy {
    to backend1:8080 backend2:8080
    lb_policy least_conn
}

IP Hash

reverse_proxy {
    to backend1:8080 backend2:8080
    lb_policy ip_hash
}

健康检查

基础健康检查

reverse_proxy backend:8080 {
    health_uri /health
    health_interval 10s
    health_timeout 5s
    health_status 200
}

高级健康检查

reverse_proxy backend:8080 {
    health_uri /health
    health_interval 5s
    health_timeout 2s
    health_status 2xx
    health_body "healthy"
}

请求头处理

修改请求头

reverse_proxy backend:8080 {
    header_up Host {upstream_hostport}
    header_up X-Real-IP {remote_host}
    header_up X-Forwarded-For {remote_host}
    header_up X-Forwarded-Proto {scheme}
}

响应头处理

reverse_proxy backend:8080 {
    header_down Access-Control-Allow-Origin *
    header_down X-Frame-Options DENY
}

高级特性

故障转移

reverse_proxy {
    to primary:8080
    to backup:8080 backup
}

重试策略

reverse_proxy backend:8080 {
    try_duration 5s
    try_interval 250ms
}

缓冲设置

reverse_proxy backend:8080 {
    buffer_requests
    buffer_responses
    max_buffer_size 100MB
}

性能优化

连接池配置

reverse_proxy backend:8080 {
    transport http {
        dial_timeout 2s
        keepalive 30s
        keepalive_idle_conns 100
    }
}

WebSocket 支持

example.com {
    reverse_proxy /ws backend:8080 {
        transport http {
            websocket
        }
    }
}

高级路由

基于路径的路由

example.com {
    reverse_proxy /api/* backend-api:8080
    reverse_proxy /admin/* backend-admin:8080
    reverse_proxy /* backend-main:8080
}

条件路由

example.com {
    @api {
        path /api/*
        header Content-Type application/json
    }
    reverse_proxy @api backend-api:8080
}

监控和调试

访问日志

reverse_proxy backend:8080 {
    log {
        output file /var/log/caddy/proxy.log
        format json
        level INFO
    }
}

错误处理

reverse_proxy backend:8080 {
    handle_response {
        status 500 {
            respond "Server Error" 500
        }
    }
}