Hugo博客公告弹窗

Caddy 实战:一个配置文件搞定 Docker + 多站点 + 负载均衡

记住:Caddy 会自动为这个域名申请和续期 SSL 证书。

安装的部分请看我上一篇帖子,或者使用我的caddy管理脚本

curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/caddy_manager.sh && chmod +x caddy_manager.sh && ./caddy_manager.sh

格式规范的警告,使用以下命令修复

caddy fmt --overwrite /etc/caddy/Caddyfile

场景一:Docker 环境下的简单反向代理

以下配置适用于 Docker 环境,如果你有多个项目,只需要复制配置块并修改域名和端口即可:

(common_config) {
    tls {
        protocols tls1.2 tls1.3
    }
    header { 
        Permissions-Policy interest-cohort=() 
        Strict-Transport-Security max-age=31536000; 
        X-Content-Type-Options nosniff 
        Referrer-Policy strict-origin-when-cross-origin 
        X-XSS-Protection "1; mode=block"
        -Via 
        -Alt-Svc 
        -Server
    }
}
www.2345.com {
    import common_config
    reverse_proxy 127.0.0.1:80
}
portainer.2345.com {
    import common_config
    reverse_proxy 127.0.0.1:8000
}
new.example.com {
    import common_config
    reverse_proxy 127.0.0.1:8888

}

场景二:多站点管理与配置复用

当你管理多个网站时,重复写相同的配置会很繁琐。Caddy 的 import 功能可以让你定义可复用的配置片段,大大简化配置管理。

这个配置展示了如何使用配置片段来管理多个站点,同时处理域名重定向:

(common_config) {
    tls {
        protocols tls1.2 tls1.3
    }
    header { 
        Permissions-Policy interest-cohort=() 
        Strict-Transport-Security max-age=31536000; 
        X-Content-Type-Options nosniff 
        Referrer-Policy strict-origin-when-cross-origin 
        X-XSS-Protection "1; mode=block"
        -Via 
        -Alt-Svc 
        -Server
    }
}
2345.com {
    redir https://www.2345.com{uri} permanent
}
www.2345.com {
    import common_config
    reverse_proxy 后端服务器ip:80
}
new.example.com {
    import common_config
    reverse_proxy 后端服务器ip:8888

}

配置详解

配置片段定义(common_config) 定义了一个名为 common_config 的配置片段,包含了所有站点通用的配置。括号语法是 Caddy 定义片段的方式。

域名重定向2345.com 块配置了从裸域名到 www 域名的永久重定向。{uri} 是 Caddy 的变量,表示原始请求的 URI 路径。

配置导入import common_config 将之前定义的配置片段导入到当前站点块中,避免重复配置。

后端服务器配置reverse_proxy 后端服务器ip:80 中的"后端服务器ip"需要替换为你实际的服务器 IP 地址,比如 192.168.1.100:80

场景三:负载均衡与高可用配置

对于生产环境,你可能需要配置负载均衡来提高服务的可用性和性能。这个配置展示了 Caddy 的高级负载均衡功能。

这是一个完整的负载均衡配置,包含了健康检查、故障转移和错误处理:

# 定义可复用的配置片段 
(common_config) { 
    reverse_proxy { 
        to 后端服务器1:80 后端服务器2:80
         
        # 负载均衡策略(可选:round_robin, least_conn, ip_hash) 
        lb_policy round_robin 
         
        # 故障转移配置 
        lb_try_duration 30s 
        lb_try_interval 250ms 
        
        # 被动健康检查
        fail_duration 30s
        max_fails 3
        unhealthy_status 5xx
         
    } 
     
    tls { 
        protocols tls1.2 tls1.3 
    } 
     
    header { 
        Permissions-Policy interest-cohort=() 
        Strict-Transport-Security max-age=31536000; 
        X-Content-Type-Options nosniff 
        Referrer-Policy strict-origin-when-cross-origin 
        X-XSS-Protection "1; mode=block"
        -Via 
        -Alt-Svc 
        -Server
    } 
    
    # 错误处理
    handle_errors {
        @5xx expression {http.error.status_code} >= 500
        respond @5xx "服务暂时不可用,请稍后重试" 503
        
        @4xx expression {http.error.status_code} >= 400
        respond @4xx "请求错误" {http.error.status_code}
    }
} 
 
 
2345.com {
    redir https://www.2345.com{uri} permanent
}
www.2345.com {
    import common_config
}

后端服务器列表to 后端服务器1:80 后端服务器2:80 定义了两个后端服务器。实际使用时,请替换为真实的服务器地址,例如:

to 192.168.1.10:80 192.168.1.11:80

负载均衡策略

  • round_robin:轮询(默认),按顺序分配请求
  • least_conn:最少连接,将请求分配给连接数最少的服务器
  • ip_hash:IP 哈希,根据客户端 IP 分配,确保同一客户端总是访问同一服务器

故障转移配置

重试机制

  • lb_try_duration 30s:在 30 秒内尝试故障转移
  • lb_try_interval 250ms:每次重试间隔 250 毫秒

健康检查配置

被动健康检查(基于实际请求):

  • fail_duration 30s:服务器被标记为不健康后,30 秒内不会接收新请求
  • max_fails 3:连续失败 3 次后标记为不健康
  • unhealthy_status 5xx:5xx 状态码被视为失败

主动健康检查(定期探测):

  • health_uri /:使用根路径进行健康检查
  • health_interval 15s:每 15 秒检查一次
  • health_timeout 3s:健康检查超时时间为 3 秒

错误处理配置

错误分类处理

  • @5xx 匹配器:捕获 500-599 状态码的服务器错误
  • @4xx 匹配器:捕获 400-499 状态码的客户端错误
  • respond 指令:返回自定义错误页面

总结

通过这三个配置示例,你已经掌握了 Caddy 的主要使用场景:

  1. Docker 环境:适合简单的单应用部署
  2. 多站点管理:使用配置片段提高配置复用性
  3. 负载均衡:提供高可用性和容错能力

记住,Caddy 会自动处理 SSL 证书的申请和续期,你只需要确保域名正确解析到你的服务器即可。

CC BY-NC-SA 4.0 转载请注明
最后更新于 2025-08-08 11:15
clarity统计