华为云Linux云服务器搭建Caddy:从零到自动HTTPS的极简Web服务器部署指南
1. Caddy 简介
Caddy 是一款用 Go 语言编写的开源 Web 服务器,自 2015 年诞生以来,以其"默认安全、开箱即用"的设计理念迅速赢得了开发者社区的青睐。与传统的 Nginx 和 Apache 相比,Caddy 最突出的特点是自动 HTTPS——它能够自动向 Let's Encrypt 申请 SSL/TLS 证书、自动配置 HTTPS 加密、并在证书到期前自动续期,全程无需人工干预。此外,Caddy 使用简洁的 Caddyfile 进行配置,语法直观、易于上手,即使是没有深厚运维经验的开发者也能在几分钟内完成一个安全网站的部署。
Caddy 内置了丰富的功能模块:静态文件服务、反向代理、负载均衡、Gzip 压缩、HTTP/2 与 HTTP/3 支持、WebSocket 代理、请求限流等,几乎涵盖了现代 Web 服务器所需的全部能力。更重要的是,Caddy 是静态编译的单二进制文件,无任何外部依赖,可以轻松部署在 Linux、macOS、Windows 等各类平台上。在华为云 Linux 云服务器上部署 Caddy,能够以极低的运维成本快速搭建具备自动 HTTPS 加密能力的 Web 服务,无论是个人博客、企业官网、API 网关还是微服务反向代理,Caddy 都是一个极具竞争力的选择。
需要先登录华为云控制台,点击:华为云控制台,还没有账号,点击:注册并关联,已有账号点击:登录后关联
2. 环境准备
2.1 华为云弹性云服务器选购
在华为云上搭建 Caddy,首先需要一台 Linux 弹性云服务器(ECS)。对于 Caddy 来说,硬件要求非常低——Caddy 本身的内存占用通常在 20MB 左右,即使是 1 核 1GB 的轻量配置也能轻松运行。推荐选择 Ubuntu 22.04 LTS 或 Debian 12 等主流 Linux 发行版作为操作系统镜像。在华为云控制台的"计算 > 弹性云服务器"页面购买实例时,建议至少选择 1 核 CPU、1GB 内存、40GB 系统盘的配置,带宽根据实际访问量选择(个人站点 1-5Mbps 即可)。
2.2 安全组端口配置
华为云安全组相当于虚拟防火墙,默认拒绝所有来自外部的入方向请求。为了让 Caddy 能够对外提供 Web 服务,必须在安全组中放行相应的端口。Web 服务最基本需要开放 80 端口(HTTP)和 443 端口(HTTPS)。在华为云控制台中,进入弹性云服务器详情页,选择"安全组"页签,点击"配置规则 > 入方向规则",添加如下两条规则:
- 协议端口:TCP 80,源地址:0.0.0.0/0(允许所有 IP 访问)
- 协议端口:TCP 443,源地址:0.0.0.0/0
如果后续需要 SSH 远程管理服务器,还需要确保 22 端口已开放。若服务器上运行了其他需要对外访问的服务,也需在安全组中相应放行对应端口。
2.3 域名准备与 DNS 解析
Caddy 的自动 HTTPS 功能依赖 Let's Encrypt 的 ACME 协议进行域名所有权验证。因此,如果计划使用自动 HTTPS,必须准备一个已备案的域名(若服务器在中国大陆区域),并将域名解析到华为云服务器的公网 IP 地址。在域名服务商的控制台中,添加一条 A 记录,将域名(如 example.com)指向服务器的公网 IP。解析生效后,Caddy 在首次启动时会自动完成证书申请与配置。
3. Caddy 安装
Caddy 提供了多种安装方式,适应不同的使用场景。下面分别介绍在华为云 Linux 服务器上最常用的四种安装方法。
3.1 方式一:使用 APT 包管理器安装(推荐)
对于 Debian/Ubuntu 系统,推荐使用 Caddy 官方 APT 仓库进行安装,这种方式会自动配置 systemd 服务并设置开机自启。依次执行以下命令:
# 添加 Caddy 官方 GPG 密钥
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo tee /etc/apt/trusted.gpg.d/caddy-stable.asc
# 添加 Caddy 官方 APT 源
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
# 更新软件包索引
sudo apt update
# 安装 Caddy
sudo apt install -y caddy安装完成后,Caddy 的二进制文件位于 /usr/bin/caddy,配置文件位于 /etc/caddy/Caddyfile,网站根目录默认为 /var/www/html,systemd 服务名为 caddy。
3.2 方式二:使用官方一键脚本安装
Caddy 官方提供了一键安装脚本,适用于各类 Linux 发行版:
curl -fsSL https://get.caddyserver.com | bash -s personal该脚本会自动下载最新的 Caddy 二进制文件并安装到系统路径。但需要注意,这种方式不会自动配置 systemd 服务,需要手动管理 Caddy 的启动和停止。
3.3 方式三:手动下载二进制文件
如果需要特定版本或自定义插件,可以从 Caddy 官方 GitHub Releases 页面下载预编译的二进制文件:
# 下载 Caddy 2.11.4 Linux amd64 版本
wget https://github.com/caddyserver/caddy/releases/download/v2.11.4/caddy_2.11.4_linux_amd64.tar.gz
# 解压并安装到 /usr/local/bin
tar zxvf caddy_2.11.4_linux_amd64.tar.gz
sudo mv caddy /usr/local/bin/
sudo chmod +x /usr/local/bin/caddy
# 验证安装
caddy version输出 Caddy 版本号即表示安装成功。
3.4 方式四:使用 Docker 容器化部署
对于习惯容器化运维的团队,Docker 方式也是非常便捷的选择:
# 拉取 Caddy 官方镜像
docker pull caddy:latest
# 启动一个简单的文件服务器容器
docker run -d -p 80:80 -p 443:443 --name mycaddy caddy caddy file-server如果需要挂载自定义配置和网站文件,可以使用卷挂载:
docker run -d -p 80:80 -p 443:443 \
-v /path/to/Caddyfile:/etc/caddy/Caddyfile \
-v /path/to/data:/data \
-v /path/to/config:/config \
--name mycaddy caddy4. Caddyfile 配置详解
Caddy 的核心配置文件称为 Caddyfile,其语法设计极为简洁。Caddy 2 的原生配置语言实际上是 JSON,而 Caddyfile 是一种更人性化的配置适配器,会在内部自动转换为 JSON。Caddyfile 默认位于 /etc/caddy/Caddyfile。
4.1 Caddyfile 基本语法
Caddyfile 由若干"站点块"组成,每个站点块以域名或地址开头,后跟一对花括号 {},内部包含各种指令。最简单的 Caddyfile 只需三行:
example.com {
root * /var/www/html
file_server
}这个配置的含义是:对于域名 example.com 的请求,从 /var/www/html 目录提供静态文件服务。Caddy 会自动为该域名申请并配置 HTTPS 证书。
4.2 核心指令说明
root:指定网站的根目录,*表示匹配所有路径。file_server:启用静态文件服务,是部署静态网站的核心指令。reverse_proxy:配置反向代理,将请求转发到后端服务。tls:配置 TLS/HTTPS,Caddy 默认自动处理,也可用于指定自定义证书。log:配置访问日志。header:设置 HTTP 响应头,可用于安全加固。
4.3 部署静态网站
假设我们有一个静态网站,文件存放在 /var/www/mysite 目录,域名是 mysite.com。Caddyfile 配置如下:
mysite.com {
root * /var/www/mysite
file_server
# 启用 gzip 压缩
encode gzip
# 设置安全响应头
header {
X-Content-Type-Options "nosniff"
X-Frame-Options "DENY"
Strict-Transport-Security "max-age=31536000; includeSubDomains"
}
}配置完成后,重启 Caddy 使配置生效:
sudo systemctl restart caddy浏览器访问 https://mysite.com,Caddy 会自动完成 HTTPS 证书的申请与配置。
4.4 配置反向代理
Caddy 的反向代理功能极其简洁。假设后端有一个运行在 localhost:8080 的 Node.js 应用,需要将 api.example.com 的请求全部转发到该后端:
api.example.com {
reverse_proxy localhost:8080
}如果需要负载均衡,可以指定多个后端:
api.example.com {
reverse_proxy localhost:8080 localhost:8081 {
lb_policy round_robin
}
}对于需要代理 WebSocket 的场景,Caddy 默认支持 WebSocket 升级,无需额外配置。如果后端是 HTTPS 服务且使用了自签名证书,可以添加 tls_insecure_skip_verify 跳过证书验证:
api.example.com {
reverse_proxy https://192.168.1.100:8443 {
transport http {
tls_insecure_skip_verify
}
}
}4.5 多站点配置(虚拟主机)
Caddy 可以在一个 Caddyfile 中配置多个站点:
example.com {
root * /var/www/example
file_server
}
blog.example.com {
root * /var/www/blog
file_server
}
api.example.com {
reverse_proxy localhost:3000
}每个站点块独立配置,互不干扰。
4.6 路径匹配与路由
Caddy 支持基于路径的路由,可以将不同路径的请求转发到不同的后端:
example.com {
# /api 路径转发到后端 API 服务
handle /api/* {
reverse_proxy localhost:8080
}
# 其他路径提供静态文件
handle {
root * /var/www/example
file_server
}
}5. HTTPS 与证书管理
5.1 自动 HTTPS 的工作原理
Caddy 的自动 HTTPS 功能基于 ACMEv2 协议(RFC 8555)与 Let's Encrypt 证书颁发机构交互。当 Caddy 启动时,会检查配置中的域名,对于每个域名,Caddy 会向 Let's Encrypt 发起证书申请请求。Let's Encrypt 会验证域名所有权,通常通过 HTTP-01 质询方式——Caddy 会在 /.well-known/acme-challenge/ 路径下提供验证令牌,Let's Encrypt 通过公网访问该路径完成验证。验证通过后,证书会被颁发并保存到 Caddy 的数据目录中,同时自动配置 HTTPS 并启用 HTTP 到 HTTPS 的重定向。
证书的有效期为 90 天,Caddy 会在证书到期前 30 天自动尝试续期。整个过程完全自动化,无需人工干预。
5.2 使用自定义证书
在某些场景下(如内网环境、需要使用通配符证书等),可能需要使用自定义证书。Caddy 也支持手动指定证书文件:
example.com {
tls /etc/caddy/ssl/cert.pem /etc/caddy/ssl/key.pem
root * /var/www/example
file_server
}5.3 生成自签名证书(测试环境)
如果是在没有公网域名的测试环境中,可以使用 openssl 生成自签名证书:
# 创建证书存放目录
sudo mkdir -p /etc/caddy/ssl
# 生成自签名证书(有效期 10 年)
sudo openssl req -x509 -newkey rsa:2048 \
-keyout /etc/caddy/ssl/key.pem \
-out /etc/caddy/ssl/cert.pem \
-days 3650 -nodes \
-subj "/CN=192.168.1.100"然后将 /etc/caddy/ssl/cert.pem 和 /etc/caddy/ssl/key.pem 的路径配置到 Caddyfile 的 tls 指令中即可。需要注意的是,自签名证书会被浏览器标记为"不安全",仅适合内部测试使用。
6. Caddy 运维管理
6.1 systemd 服务管理
通过 APT 方式安装的 Caddy 会自动配置 systemd 服务。常用管理命令如下:
# 启动 Caddy
sudo systemctl start caddy
# 停止 Caddy
sudo systemctl stop caddy
# 重启 Caddy(配置修改后使用)
sudo systemctl restart caddy
# 查看 Caddy 运行状态
sudo systemctl status caddy
# 设置开机自启
sudo systemctl enable caddy6.2 日志配置
Caddy 默认以 JSON 格式记录访问日志,包含请求时间、方法、URL、状态码、响应时间等关键信息。可以通过 log 指令自定义日志输出:
example.com {
root * /var/www/example
file_server
log {
output file /var/log/caddy/access.log {
roll_size 100mb
roll_keep 5
}
format json
}
}上述配置将访问日志写入 /var/log/caddy/access.log,单文件达到 100MB 时自动轮转,保留最近 5 个文件。如果需要将日志输出到标准输出(适用于 Docker 环境),可以将 output file 替换为 output stdout。
6.3 配置验证与重载
Caddy 支持零停机配置重载,修改 Caddyfile 后无需重启服务:
# 验证配置文件语法
caddy validate --config /etc/caddy/Caddyfile
# 重新加载配置(零停机)
sudo systemctl reload caddyreload 命令会优雅地应用新配置,不会中断正在处理的请求。
7. 性能优化
7.1 启用 Gzip 压缩
使用 encode 指令可以启用 Gzip 压缩,减少传输数据量:
example.com {
encode gzip
root * /var/www/example
file_server
}7.2 静态资源缓存
通过 header 指令设置缓存策略,可以大幅提升静态资源的加载速度:
example.com {
root * /var/www/example
file_server
# 对静态资源设置长期缓存
header /assets/* {
Cache-Control "public, max-age=31536000, immutable"
}
}7.3 启用 HTTP/3
Caddy 原生支持 HTTP/3(基于 QUIC 协议),可以通过全局配置启用:
{
servers {
protocol {
experimental_http3
}
}
}
example.com {
root * /var/www/example
file_server
}8. 安全加固
8.1 安全响应头
在 Caddyfile 中添加安全响应头可以防范常见的 Web 攻击:
example.com {
header {
# 防止 MIME 类型嗅探
X-Content-Type-Options "nosniff"
# 防止点击劫持
X-Frame-Options "DENY"
# 强制 HSTS
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
# 防止 XSS 攻击
X-XSS-Protection "1; mode=block"
# 限制内容来源
Content-Security-Policy "default-src 'self'"
}
root * /var/www/example
file_server
}8.2 访问控制与限流
Caddy 支持基于 IP 的访问控制和请求限流:
example.com {
# 只允许特定 IP 访问管理后台
handle /admin/* {
@blocked {
not remote_ip 192.168.1.0/24
}
rewrite @blocked /403.html
reverse_proxy localhost:8080
}
root * /var/www/example
file_server
}9. 华为云环境特别优化
9.1 内网访问与免流量
如果后端服务也部署在华为云同一地域的 ECS 上,可以使用内网 IP 进行通信,避免产生公网流量费用。例如,后端数据库或应用服务器使用内网 IP 192.168.0.10:
api.example.com {
reverse_proxy 192.168.0.10:8080
}9.2 使用华为云 OBS 作为静态资源存储
Caddy 可以作为反向代理,将静态资源请求转发到华为云 OBS 对象存储。这样可以降低 ECS 的存储压力,同时利用 OBS 的高可用性。配置示例:
static.example.com {
reverse_proxy https://bucket-name.obs.cn-north-4.myhuaweicloud.com {
header_up Host "bucket-name.obs.cn-north-4.myhuaweicloud.com"
}
}通过这种方式,Caddy 作为反向代理服务器,对外暴露统一的域名,同时隐藏 OBS 桶的真实域名,增强数据安全性。
10. 常见问题排查
10.1 80/443 端口被占用
如果服务器上已经运行了 Nginx 或 Apache 等其他 Web 服务器,80 和 443 端口可能已被占用。可以先停止冲突的服务,或者修改 Caddy 的默认端口。在 Caddyfile 顶部添加全局配置修改端口:
{
http_port 8080
https_port 8443
}
example.com {
root * /var/www/example
file_server
}10.2 证书申请失败
Let's Encrypt 证书申请失败通常有以下原因:
- 域名未正确解析到服务器公网 IP
- 服务器 80 端口未对外开放(ACME HTTP-01 质询需要 80 端口)
- 华为云安全组未放行 80 和 443 端口
- 服务器时间不准确(证书验证依赖准确的时间)
可以通过 sudo journalctl -u caddy -f 查看 Caddy 的详细日志,定位具体错误原因。
11. 总结
本文全面介绍了在华为云 Linux 云服务器上搭建 Caddy Web 服务器的完整流程。从华为云环境准备、安全组配置,到 Caddy 的多种安装方式、Caddyfile 配置详解,再到静态网站部署、反向代理、自动 HTTPS 证书管理、日志与性能优化等进阶内容,涵盖了 Caddy 运维的方方面面。Caddy 以其"极简配置、自动 HTTPS、开箱即用"的核心理念,大幅降低了 Web 服务器部署与运维的门槛。无论是个人开发者搭建博客、小型团队部署业务系统,还是企业级微服务架构中的反向代理网关,Caddy 都是一个兼具效率与安全性的优秀选择。在华为云高效、稳定的基础设施之上,Caddy 能够帮助用户以最低的运维成本快速构建安全、可靠的 Web 服务体系。
Q&A
问 1:Caddy 与 Nginx 的主要区别是什么?
答:Caddy 最核心的区别在于自动 HTTPS——它内置了 Let's Encrypt 客户端,能够自动申请、配置和续期 SSL 证书,无需人工操作。此外,Caddy 的 Caddyfile 配置语法比 Nginx 简洁得多,学习曲线更平缓。Caddy 是静态编译的单二进制文件,无依赖,部署更简单。不过 Nginx 在极致性能优化和生态成熟度方面仍有优势,适合对性能有极致要求的大型生产环境。
问 2:Caddy 的自动 HTTPS 需要满足什么条件?
答:需要满足三个条件:第一,有一个已备案(中国大陆区域)且已解析到服务器公网 IP 的域名;第二,服务器 80 和 443 端口对公网开放;第三,服务器能够正常访问互联网(用于与 Let's Encrypt 通信)。满足这些条件后,Caddy 会在首次启动时自动完成证书申请和配置。
问 3:如何在华为云上开放 Caddy 所需的端口?
答:在华为云控制台进入弹性云服务器详情页,选择"安全组"页签,点击"配置规则 > 入方向规则"。添加两条规则:协议端口 TCP 80、源地址 0.0.0.0/0;协议端口 TCP 443、源地址 0.0.0.0/0。如果还需要 SSH 管理,确保 22 端口也已开放。
问 4:Caddy 如何配置反向代理 WebSocket?
答:Caddy 的 reverse_proxy 指令默认支持 WebSocket 协议升级,无需额外配置。只需像配置普通 HTTP 反向代理一样配置即可:reverse_proxy localhost:8080。Caddy 会自动识别 WebSocket 的 Upgrade 请求头并正确处理。
问 5:Caddy 的配置文件修改后需要重启服务吗?
答:不需要重启,Caddy 支持零停机配置重载。修改 Caddyfile 后执行 sudo systemctl reload caddy 即可优雅地应用新配置,不会中断正在处理的请求。也可以使用 caddy validate --config /etc/caddy/Caddyfile 先验证配置语法是否正确。
问 6:Caddy 可以在华为云的内网环境中使用吗?
答:可以。如果不需要对外提供公网访问,Caddy 完全可以在内网环境中运行。需要注意的是,内网环境没有公网域名,无法使用 Let's Encrypt 的自动 HTTPS 功能。这种情况下可以使用自签名证书,或者将 Caddy 配置为纯 HTTP 模式(不启用 TLS),仅在内网提供服务。



