前言

在现代网络服务部署中,为您的应用提供安全访问是至关重要的。本文将详细介绍如何在 Debian 12 VPS 上使用 Caddy 作为反向代理,并通过 Cloudflare 配置域名访问,实现自动 HTTPS 证书申请和续期。

无论您是运行 Docker 容器、个人博客还是小型 Web 应用,本教程将为您提供清晰、分步的指导,帮助您轻松实现安全、高效的域名访问。

目录

  1. 目标与适用场景
  2. 为什么选择 Caddy
  3. 前置条件检查
  4. Cloudflare DNS 配置
  5. Caddy 安装与配置
  6. 测试与故障排除
  7. 安全优化建议
  8. 完整部署流程总结
  9. 延伸阅读与资源

目标与适用场景

配置目标

通过本教程,我们将实现以下访问映射:

1
2
https://myapp.example.com      -> 127.0.0.1:8319
https://blog.example.net -> 127.0.0.1:1998

适用场景

本教程特别适合以下场景:

  • 在 VPS 上运行了多个 Docker 容器,需要统一入口访问
  • 后端服务或应用程序监听在本机端口
  • 希望使用域名访问服务并自动启用 HTTPS
  • 域名 DNS 托管在 Cloudflare
  • 希望自动化 HTTPS 证书的申请和续期过程

为什么选择 Caddy

Caddy 是一个现代化的 Web 服务器和反向代理工具,特别适合个人开发者和小型团队使用。与传统的 Nginx 相比,Caddy 具有显著优势:

主要优势

  1. 极简配置:使用声明式配置语法,直观易懂
  2. 自动 HTTPS:默认启用,无需手动配置证书
  3. 自动证书管理:自动申请和续期 Let’s Encrypt 证书
  4. 性能优化:自动启用 HTTP/2 和 gzip 压缩
  5. 热重载:配置更改后无需重启服务
  6. 丰富的插件系统:可根据需要扩展功能

Caddy vs Nginx

特性 Caddy Nginx
HTTPS 配置 自动 需手动配置 Certbot
配置语法 简洁直观 复杂,需要深入学习
证书管理 自动 需单独管理
HTTP/2 支持 默认启用 需手动配置
配置热重载 支持 需重启服务

前置条件检查

在开始之前,请确保满足以下条件:

1. VPS 有公网 IP

假设您的 VPS 公网 IP 是:

1
1.2.3.4

请将本文中的 1.2.3.4 替换成您自己的 VPS 公网 IP。

2. 域名托管在 Cloudflare

本教程假设域名在 Cloudflare 上管理,例如:

1
example.com

3. 服务端口已正常运行

确保您的 Docker 容器或本地服务已经监听:

1
2
127.0.0.1:8319
127.0.0.1:1998

测试服务可用性

在 VPS 上执行以下命令测试服务是否正常运行:

1
2
3
4
5
6
7
8
9
10
# 测试服务响应
curl -I http://127.0.0.1:8319
curl -I http://127.0.0.1:1998

# 如果服务不支持 HEAD 请求,使用详细模式
curl -v http://127.0.0.1:8319
curl -v http://127.0.0.1:1998

# 检查端口监听状态
ss -tulpn | grep -E ':8319|:1998'

4. 开放必要端口

Caddy 需要监听以下端口:

  • 80/tcp:用于 HTTP 访问和证书申请验证
  • 443/tcp:用于 HTTPS 访问

需要在 VPS 云厂商安全组、防火墙中放行这些端口:

1
2
3
4
5
6
7
# 使用 UFW 防火墙(Ubuntu/Debian)
ufw allow 80/tcp
ufw allow 443/tcp

# 或使用 iptables
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

Cloudflare DNS 配置

1. 登录 Cloudflare 控制台

访问 Cloudflare 控制台,选择您的域名,然后进入:

1
DNS -> Records

2. 配置主域名

根据您的域名结构,配置记录:

情况一:Cloudflare 区域为 example.com

1
2
3
4
类型:A
名称:@
内容:1.2.3.4 (您的 VPS 公网 IP)
代理状态:DNS only,灰色云朵

情况二:Cloudflare 区域为 example.net

1
2
3
4
类型:A
名称:myapp
内容:1.2.3.4 (您的 VPS 公网 IP)
代理状态:DNS only,灰色云朵

3. 配置第二个域名

同样根据您的域名结构,配置第二个域名:

情况一:Cloudflare 区域为 example.com

1
2
3
4
类型:A
名称:blog
内容:1.2.3.4 (您的 VPS 公网 IP)
代理状态:DNS only,灰色云朵

情况二:Cloudflare 区域为 example.org

1
2
3
4
类型:A
名称:blog.example
内容:1.2.3.4 (您的 VPS 公网 IP)
代理状态:DNS only,灰色云朵

4. 关于代理状态的建议

初次配置时使用灰色云朵(DNS only),这会使请求直接到达您的 VPS,简化证书申请和问题排查过程。

初始访问链路:

1
2
3
4
浏览器
-> VPS
-> Caddy
-> 本地服务端口

确认两个域名都能正常访问后,再考虑开启 Cloudflare 代理(橙色云朵):

1
2
3
4
5
浏览器
-> Cloudflare
-> VPS
-> Caddy
-> 本地服务端口

Caddy 安装与配置

1. 安装 Caddy

在 Debian 12 上,可以直接使用 apt 安装 Caddy:

1
2
3
4
5
6
7
8
# 更新软件源
apt update

# 安装 Caddy
apt install -y caddy

# 检查服务状态
systemctl status caddy

如果 Caddy 已经正常运行,说明安装成功。

2. 备份默认配置

修改配置前,建议先备份默认配置文件:

1
2
3
4
5
# 创建带时间戳的备份
cp /etc/caddy/Caddyfile /etc/caddy/Caddyfile.bak.$(date +%F-%H%M%S)

# 查看备份文件
ls -l /etc/caddy/Caddyfile.bak.*

3. 配置反向代理

编辑 Caddy 配置文件:

1
nano /etc/caddy/Caddyfile

写入以下内容:

1
2
3
4
5
6
7
8
9
# 主域名反向代理
myapp.example.com {
reverse_proxy 127.0.0.1:8319
}

# 第二个域名反向代理
blog.example.net {
reverse_proxy 127.0.0.1:1998
}

配置说明

  • myapp.example.comblog.example.net 是要绑定的域名
  • reverse_proxy 127.0.0.1:8319 表示将请求转发到本地 8319 端口
  • Caddy 会自动处理 HTTPS 证书申请和续期

4. 验证配置

修改完成后,先验证配置是否正确:

1
2
3
4
5
6
7
8
# 验证配置语法
caddy validate --config /etc/caddy/Caddyfile

# 格式化配置(可选)
caddy fmt --overwrite /etc/caddy/Caddyfile

# 查看最终配置
cat /etc/caddy/Caddyfile

5. 启动并重载 Caddy

1
2
3
4
5
6
7
8
9
10
11
# 启用并启动服务
systemctl enable --now caddy

# 重载配置
systemctl reload caddy

# 检查服务状态
systemctl status caddy

# 查看日志
journalctl -u caddy --no-pager -n 100

测试与故障排除

1. 基本测试

等待几十秒到几分钟(让 Caddy 申请证书),然后访问:

1
2
https://myapp.example.com
https://blog.example.net

也可以使用命令行测试:

1
2
curl -I https://myapp.example.com
curl -I https://blog.example.net

如果返回类似 HTTP/2 200HTTP/2 302,通常说明配置正常。

2. 常见问题及解决方案

DNS 没生效

1
2
3
4
5
6
7
# 检查域名解析
getent hosts myapp.example.com
getent hosts blog.example.net

# 或使用 dig
dig +short myapp.example.com
dig +short blog.example.net

如果返回的不是您的 VPS IP,请检查 Cloudflare DNS 记录。

80 或 443 端口被占用

1
2
# 检查端口占用
ss -tulpn | grep -E ':80|:443'

如果已有其他服务(如 Nginx、Apache)占用这些端口,需要:

  1. 停止其他服务
  2. 或调整其他服务端口
  3. 或只保留一个反向代理入口

Caddy 证书申请失败

查看详细日志:

1
journalctl -u caddy --no-pager -n 200

常见原因:

  • DNS 没解析到当前 VPS
  • 80/443 端口未开放
  • 防火墙阻止访问
  • 域名 CAA 记录限制了证书签发机构

502 Bad Gateway 错误

1
502 Bad Gateway

这表明 Caddy 无法连接到后端服务。检查:

1
2
3
4
5
6
# 测试后端服务
curl -v http://127.0.0.1:8319
curl -v http://127.0.0.1:1998

# 检查端口监听
ss -tulpn | grep -E ':8319|:1998'

开启 Cloudflare 橙色云朵后异常

如果灰色云朵时正常,橙色云朵后异常:

  1. 检查 Cloudflare SSL/TLS 模式是否为 完整(严格)
  2. 确认未误选 灵活 / Flexible
  3. 检查 Caddy 证书是否正常
  4. 确认源站 443 端口开放
  5. 检查后端应用是否有特殊的 HTTPS/Host/Header 校验

安全优化建议

1. 隐藏业务端口

如果通过 Caddy 访问服务,公网只需开放 80 和 443 端口,业务端口(如 8319、1998)可以不直接暴露。

对于 Docker 服务,修改端口映射:

1
2
3
4
5
6
# 原方式(可能暴露公网)
-p 8319:8319

# 更安全的方式(仅本地访问)
-p 127.0.0.1:8319:8319
-p 127.0.0.1:1998:1998

2. 配置 Caddy 安全增强

可以在 Caddy 配置中添加安全增强选项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
myapp.example.com {
# 启用基本安全头
header {
# 防止点击劫持
X-Frame-Options "SAMEORIGIN"
# 防止MIME类型混淆攻击
X-Content-Type-Options "nosniff"
# 启用XSS保护
X-XSS-Protection "1; mode=block"
# 强制HTTPS(如果已配置)
Strict-Transport-Security "max-age=31536000; includeSubDomains"
}

# 限制请求大小
body_limit 100MB

# 反向代理
reverse_proxy 127.0.0.1:8319
}

3. 访问控制

如果需要限制访问,可以添加基本认证:

1
2
3
4
5
6
7
8
blog.example.net {
# 添加基本认证
basicauth /* {
username password_hash
}

reverse_proxy 127.0.0.1:1998
}

密码可以使用以下命令生成:

1
caddy hash-password

完整部署流程总结

  1. 准备阶段

    • 确认 VPS 有公网 IP
    • 确认域名在 Cloudflare 管理
    • 确认后端服务正常运行
  2. DNS 配置

    • 在 Cloudflare 添加 A 记录
    • 初次配置使用灰色云朵(DNS only)
  3. 防火墙配置

    • 开放 80 和 443 端口
  4. 安装 Caddy

    • 使用 apt 安装 Caddy
    • 启动并检查服务状态
  5. 配置反向代理

    • 编辑 /etc/caddy/Caddyfile
    • 添加域名和后端服务配置
  6. 验证与测试

    • 使用 caddy validate 检查配置
    • 重载 Caddy 服务
    • 访问域名测试功能
  7. 可选优化

    • 确认正常后,可开启 Cloudflare 橙色云朵
    • 设置 SSL/TLS 为 完整(严格)
    • 添加安全增强选项

延伸阅读与资源

官方文档

相关工具


通过本教程,您已经学会了如何在 Debian 12 上使用 Caddy 和 Cloudflare 配置安全的反向代理服务。这种方法不仅简化了 HTTPS 证书管理,还提供了灵活的访问控制和负载均衡能力,非常适合个人项目和小型团队使用。

随着需求的增长,您可以进一步探索 Caddy 的高级功能和 Cloudflare 的更多服务,构建更强大、更安全的网络基础设施。