Caddy 是一个由 Go 语言编写的现代化、开源的 Web 服务器。它以其自动化 HTTPS 功能、易于配置和高性能而闻名。Caddy 的设计目标是让 Web 服务器的部署和管理变得更加简单、安全和可靠,尤其是在 HTTPS 配置方面,它将 Let’s Encrypt 的证书管理完全自动化,免去了传统服务器配置 SSL/TLS 的繁琐步骤。

核心思想:Caddy 是一个“开箱即用”的现代 Web 服务器,其核心亮点在于自动化的 HTTPS 管理简洁的配置文件(Caddyfile),极大简化了 Web 服务部署的复杂性。


一、Caddy 简介

1.1 什么是 Caddy?

Caddy 是一款多功能 Web 服务器和反向代理,它拥有一系列现代 Web 技术特性:

  • 自动化 HTTPS:这是 Caddy 最突出的特性。它使用 Let’s Encrypt 或其他 ACME 提供商自动获取、续订和管理 SSL/TLS 证书,实现了零配置 HTTPS。
  • HTTP/2 和 HTTP/3 支持:Caddy 原生支持最新的 HTTP 协议,提供更快的性能和更好的用户体验。
  • 易于配置:采用简洁明了的 Caddyfile 配置格式,消除了传统服务器配置文件的复杂性。
  • 单一二进制文件:Caddy 被编译成一个单一的可执行文件,没有外部依赖,便于部署和分发。
  • Go 语言编写:得益于 Go 语言的并发特性,Caddy 具有高性能和高稳定性。
  • 多功能:除了作为静态文件服务器,它还可以作为反向代理、负载均衡器、API 网关等。

1.2 Caddy 的优势

  • 简化 HTTPS 部署:解决了传统 Web 服务器配置 SSL 证书的痛点,尤其对于非专业人员极其友好。
  • 开箱即用:下载即可运行,无需复杂安装。
  • 现代协议支持:默认支持 HTTP/2 和 HTTP/3,无需额外配置。
  • 轻量高效:Go 语言的特性使其在资源占用和性能之间取得良好平衡。
  • 配置简洁Caddyfile 易学易用,减少了出错的可能性。

1.3 适用场景

  • 部署静态网站:最常见的用途,提供自动化 HTTPS 的静态文件服务。
  • 微服务网关:作为微服务架构的前置反向代理或 API 网关。
  • 个人项目与博客:开发者可以轻松为个人网站添加 HTTPS。
  • 开发环境:提供一个快速搭建的本地 HTTP/HTTPS 服务器。
  • 内部服务代理:为内部应用提供反向代理和简单的负载均衡。
  • 文件服务器:提供文件列表和下载功能。

二、Caddy 的安装与启动

2.1 安装

Caddy 是一个单一的二进制文件,安装非常简单。可以通过以下几种方式获取:

  1. 从官网下载预编译版本 (推荐)
    访问 Caddy 官网下载页面 1,选择适合您操作系统的最新版本,下载后解压即可得到 caddy 可执行文件。

    • Linux/macOS:将 caddy 文件放到 $PATH 中的某个目录(如 /usr/local/bin)并添加执行权限。
      1
      2
      sudo mv caddy /usr/local/bin/
      sudo chmod +x /usr/local/bin/caddy
    • Windows:将 caddy.exe 放到一个目录中,并确保该目录在系统 Path 环境变量中。
  2. 通过包管理器安装 (如 apt, yum, brew 等)
    Caddy 官方提供了针对各种操作系统的包管理仓库。例如在 Debian/Ubuntu 上:

    1
    2
    3
    4
    5
    6
    sudo apt update
    sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
    curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
    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
    sudo apt install caddy

    (具体命令请参考官网说明)

  3. Docker
    Caddy 也提供了官方 Docker 镜像,方便在容器环境中部署。

    1
    docker run -p 80:80 -p 443:443 -d caddy/caddy

2.2 启动

  1. 作为静态文件服务器 (最简单方式)
    进入到您的静态网站根目录,然后运行 caddy run

    1
    2
    cd /path/to/your/website
    caddy run

    Caddy 会自动检测当前目录下的 Caddyfile。如果不存在,它会默认在 80 端口启动一个 HTTP 服务器,并将当前目录作为网站根目录。如果指定了域名,它还会尝试自动获取并使用 HTTPS。

  2. 使用 Caddyfile 启动
    推荐的方式是在项目根目录创建一个名为 Caddyfile 的配置文件,然后使用 caddy run 命令启动。

    1
    2
    3
    4
    5
    cd /path/to/my/project
    # 编辑 Caddyfile
    vi Caddyfile
    # 启动 Caddy
    caddy run
  3. 后台运行 (推荐生产环境)
    在生产环境中,通常会将 Caddy 配置为系统服务 (如 systemd)。

    • 如果通过包管理器安装,Caddy 通常会自动配置好 systemd 服务。
      1
      2
      3
      sudo systemctl start caddy
      sudo systemctl enable caddy
      sudo systemctl status caddy
    • 如果手动下载二进制文件,需要手动创建 systemd 单元文件。

三、Caddyfile 配置详解

Caddyfile 是 Caddy 的核心配置文件,它的语法非常简洁直观。

3.1 Serving 静态文件

最基本的配置,为当前目录下的文件提供服务:

1
2
3
:80 # 监听 80 端口
root * ./public # 将 ./public 目录作为网站根目录
file_server # 启用文件服务器

或者直接指定域名,Caddy 会自动处理 HTTPS:

1
2
3
4
example.com {
root * ./public
file_server
}

当您访问 example.com 时,Caddy 会自动获取并配置 Let’s Encrypt 证书,并重定向 HTTP 请求到 HTTPS。

3.2 反向代理 (Reverse Proxy)

将请求代理到其他服务,这在微服务或前后端分离架构中非常常见。

1
2
3
4
5
6
7
8
api.example.com {
reverse_proxy localhost:8080 # 将所有请求代理到本地 8080 端口的服务
}

# 也可以代理到多个后端进行负载均衡
backend.example.com {
reverse_proxy 192.168.1.100:8080 192.168.1.101:8081
}

反向代理匹配路径:

1
2
3
4
5
6
7
8
9
10
# 将所有以 /api/ 开头的请求代理到后端
example.com {
handle /api/* {
reverse_proxy localhost:3000
}
handle { # 处理其他所有请求
root * ./public
file_server
}
}

3.3 负载均衡

Caddy 的 reverse_proxy 指令本身就支持负载均衡。只需指定多个后端地址,Caddy 会默认使用轮询 (round robin) 策略进行分发。

1
2
3
4
5
6
7
8
9
10
11
my-app.example.com {
reverse_proxy 10.0.0.1:8080 10.0.0.2:8080 10.0.0.3:8080 {
# 负载均衡策略 (可选):
# random_choose:随机
# first:第一个可用
# least_conn:最少连接数
# uri_hash:基于URI哈希
# ...
lb_policy least_conn
}
}

3.4 SPA (单页应用) 路由回退

对于单页应用,当用户直接访问一个子路由(如 /about)时,服务器需要返回 index.html 而不是 404 错误,以便前端路由能够进行处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# myapp.example.com {
# root * ./dist
# file_server
# # 如果文件不存在,则回退到 index.html
# try_files {path} {path}/index.html index.html
# }

# Caddy v2.6+ 后的标准方式是使用 handle_errors + rewrite
myapp.example.com {
root * ./dist
file_server

# 如果请求路径对应的文件或目录不存在,则重写URL到 /index.html
handle_errors {
revert
rewrite * /index.html
file_server
}
}

3.5 重定向 (Redirects)

1
2
3
4
5
6
7
8
9
10
11
# HTTP 到 HTTPS 的重定向是自动的,无需配置

# 将旧域名重定向到新域名
old.com {
redir https://new.com{uri}
}

# 内部路径重定向
example.com {
redir /old-path /new-path
}

3.6 Gzip/Brotli 压缩

Caddy 默认已经启用了 gzip 压缩,无需手动配置。如果你需要配置更高级的压缩,可以使用 encode 指令。

1
2
3
4
5
example.com {
root * ./public
file_server
encode gzip zstd # 先尝试 zstd,再尝试 gzip
}

3.7 Caddyfile 结构

一个 Caddyfile 可以包含多个站点块:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 第一个站点
example.com {
root * ./public/example
file_server
log {
output file /var/log/caddy/example_access.log
}
}

# 第二个站点
api.example.com {
reverse_proxy localhost:8080
log {
output file /var/log/caddy/api_access.log
}
}

# 第三个站点 (捕获所有未匹配的HTTP请求)
:80 {
respond "Hello World!"
}

四、Caddy 的 API (Admin API)

Caddy 除了可以通过 Caddyfile 配置,还提供了一个强大的 Admin API (管理 API),允许在运行时动态修改配置,而无需重启 Caddy 进程。这对于自动化部署和动态配置管理非常有用。

  • 默认启动:Caddy 默认在 localhost:2019 启动 Admin API。
  • 配置修改:可以通过 curl 等工具向 localhost:2019/config 发送 JSON 格式的配置数据来修改 Caddy 的运行配置。
  • 禁用 Admin API:如果不需要,可以在 Caddyfile 中禁用:
    1
    2
    3
    {
    admin off
    }

五、Caddy 与 Nginx 的对比

特性 Caddy Nginx
自动化 HTTPS 内置,通过 Let’s Encrypt 自动获取和续订,开箱即用 需要手动配置 Certbot 或其他工具进行证书管理
配置语法 Caddyfile (简洁、声明式) Nginx conf (强大、灵活,但有时复杂)
性能 高性能 (Go 语言),对于大多数场景无瓶颈 极高性能 (C 语言),处理高并发的行业标准
HTTP/3 原生支持 (QUIC) 需通过 QUIC patches 或第三方模块才能支持
上手难度 非常简单,尤其对新手友好 相对复杂,需要一定学习曲线
社区生态 较新,活跃度高,但插件和社区资源不如 Nginx 丰富 成熟,庞大且活跃的社区,丰富的模块和文档
部署模型 单一二进制文件,易于部署 通常需要额外安装依赖库,复杂性稍高
适用场景 个人网站、博客、微服务网关、API网关、开发环境 大型高并发网站、复杂企业级应用、CDN、高性能代理

总结

  • 对于需要快速部署简单 Web 服务、享受自动化 HTTPS 便利、追求配置简洁的用户,Caddy 是一个极佳的选择。 它特别适合个人开发者、中小型项目和微服务架构中的简单网关。
  • 对于有极致性能要求、复杂配置需求、现有生态系统依赖(如大量 Nginx 模块)以及大型高并发场景,Nginx 仍然是行业标准,具有不可替代的优势。

六、总结

Caddy 是一款令人印象深刻的现代 Web 服务器,它以“自动化 HTTPS”这一颠覆性特性极大简化了 Web 服务部署。其简洁的 Caddyfile、对 HTTP/2 和 HTTP/3 的原生支持以及 Go 语言带来的高性能,使其成为前端开发者、个人项目以及微服务架构中快速构建和部署 Web 服务的理想选择。虽然其生态系统和极致性能可能不及Nginx,但在许多场景下,Caddy 提供的开发和运维便利性是无与伦比的。随着 Web 技术的不断发展,Caddy 无疑将在未来 Web 服务器领域占据一席之地。