mcpField
C
caddy-reverse-proxy

caddy-reverse-proxy

github.com/dimdasci云与 DevOps0149 次安装42 周前更新
代码仓库

关于 caddy-reverse-proxy

用于配置 Caddy Web 服务器和反向代理的参考技能,涵盖路由、TLS、Docker 模式、负载均衡及常见故障排查。

主要功能

  1. 01配置反向代理路由
  2. 02设置自动及通配符 TLS
  3. 03按路径和匹配器路由请求
  4. 04配置负载均衡与健康检查
  5. 05在 Docker 中使用 Caddy

适用场景

  1. 01将域名请求转发到后端服务
  2. 02通过子域名提供不同应用
  3. 03将 API 路径代理到服务
  4. 04排查证书或上游错误

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/dimdasci/vps-setup --skill caddy-reverse-proxy

安装后在 Claude Code 中输入/caddy-reverse-proxy确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
caddyfile-syntax.md
docker-patterns.md
reverse-proxy.md
tls-certificates.md
troubleshooting.md

详细介绍

Caddy 反向代理

Caddy 是一款支持自动 HTTPS 的 Web 服务器。它会自动获取和续期证书,将 HTTP 重定向到 HTTPS,并提供简洁的配置语法。

快速参考

任务语法
基本代理reverse_proxy backend:8080
多个上游reverse_proxy node1:80 node2:80
路径路由handle /api/* { reverse_proxy api:8080 }
剥离路径前缀handle_path /api/* { reverse_proxy api:8080 }
设置请求标头header_up Host localhost
移除响应标头header_down -Server
通配符证书tls { dns cloudflare {env.CF_API_TOKEN} }
重新加载配置caddy reload --config /etc/caddy/Caddyfile

基本模式

简单反向代理
example.com {
    reverse_proxy backend:8080
}
多个站点
app.example.com {
    reverse_proxy app:3000
}

api.example.com {
    reverse_proxy api:8080
}
基于路径的路由
example.com {
    handle /api/* {
        reverse_proxy api:8080
    }
    handle {
        reverse_proxy frontend:3000
    }
}
剥离路径前缀
example.com {
    handle_path /api/* {
        reverse_proxy api:8080  # /api/users → /users
    }
}

标头操作

example.com {
    reverse_proxy backend:8080 {
        # Set Host header (required by some backends)
        header_up Host localhost

        # Add client IP
        header_up X-Real-IP {remote_host}

        # Remove sensitive header
        header_up -Authorization

        # Remove server identity from response
        header_down -Server
    }
}

Docker 集成

代理到容器(同一网络)
# docker-compose.yml
services:
  caddy:
    image: caddy:2-alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy_data:/data
    networks:
      - web

  app:
    image: myapp
    networks:
      - web
    expose:
      - "8080"
# Caddyfile - use container name as hostname
example.com {
    reverse_proxy app:8080
}
代理到主机服务
services:
  caddy:
    extra_hosts:
      - "host.docker.internal:host-gateway"
example.com {
    reverse_proxy host.docker.internal:8080
}

TLS 配置

自动配置(默认)

Caddy 会在满足以下条件时自动获取证书:

  • 域名 DNS 指向服务器
  • 80/443 端口可访问
通配符证书

需要 DNS 提供商插件:

*.example.com {
    tls {
        dns cloudflare {env.CF_API_TOKEN}
    }

    @app1 host app1.example.com
    handle @app1 {
        reverse_proxy app1:8080
    }

    @app2 host app2.example.com
    handle @app2 {
        reverse_proxy app2:8080
    }
}
内部/开发环境
localhost {
    tls internal
    reverse_proxy app:8080
}

请求匹配器

# Path matching
@api path /api/*

# Header matching
@websocket header Connection *Upgrade*

# Method matching
@post method POST

# Combined (AND logic)
@api_post {
    path /api/*
    method POST
}

# Use matcher
handle @api {
    reverse_proxy api:8080
}

负载均衡

example.com {
    reverse_proxy node1:80 node2:80 node3:80 {
        lb_policy round_robin
        health_uri /health
        health_interval 30s
    }
}

常见配置

安全标头
(security) {
    header {
        Strict-Transport-Security "max-age=31536000; includeSubDomains"
        X-Content-Type-Options nosniff
        X-Frame-Options SAMEORIGIN
        Referrer-Policy strict-origin-when-cross-origin
    }
}

example.com {
    import security
    reverse_proxy backend:8080
}
www 重定向
www.example.com {
    redir https://example.com{uri} permanent
}
SPA(单页应用)
example.com {
    root * /srv
    try_files {path} /index.html
    file_server
}
gRPC / HTTP/2 明文传输
example.com {
    reverse_proxy h2c://grpc-server:9000
}

全局选项

{
    email [email protected]

    # Use staging for testing
    # acme_ca https://acme-staging-v02.api.letsencrypt.org/directory
}

example.com {
    # site config
}

参考文件

文件阅读时机
reverse-proxy.md负载均衡、运行状况检查、传输选项
caddyfile-syntax.md匹配器、handle 块、指令
tls-certificates.mdDNS 挑战、通配符、mTLS
docker-patterns.mdDocker Compose、网络、主机访问
troubleshooting.md常见错误和诊断

常见问题

问题解决方案
"no upstreams available"检查后端是否正在运行,以及是否处于同一 Docker 网络
"connection refused"后端应绑定到 0.0.0.0,而不是 127.0.0.1
未获取到证书检查 DNS 是否指向服务器,以及 80/443 端口是否开放
403 Forbidden后端需要 header_up Host localhost
WebSocket 失败通常可以正常工作;对于 SSE,请检查 flush_interval -1

验证命令

# Validate config
caddy validate --config /etc/caddy/Caddyfile

# Format config
caddy fmt --overwrite /etc/caddy/Caddyfile

# Reload (zero-downtime)
caddy reload --config /etc/caddy/Caddyfile

# Debug mode
# Add to global options: { debug }

# Check certificate
openssl s_client -connect example.com:443 -servername example.com

官方文档

主题URL
Caddyfilehttps://caddyserver.com/docs/caddyfile
reverse_proxyhttps://caddyserver.com/docs/caddyfile/directives/reverse_proxy
自动 HTTPShttps://caddyserver.com/docs/automatic-https
常见模式https://caddyserver.com/docs/caddyfile/patterns

评论

支持 Markdown