Kanade's Dev Journal

用 Caddy 代替 Nginx,轻松实现反向代理

Multi domain proxy with caddy.jpg
Published on
/6 mins read/---

Caddy 简介

Caddy 是一个用 Go 语言编写的开源 Web 服务器,具有以下特点:

  1. 自动 HTTPS:Caddy 自动为你的站点获取和更新 SSL 证书,无需手动配置。
  2. 简洁的配置:Caddy 使用 Caddyfile 作为配置文件,语法简单易懂。
  3. 高性能:Caddy 基于 Go 语言,具有出色的性能和低资源消耗。
  4. 模块化设计:Caddy 支持插件扩展,可以根据需要添加功能。

Caddy 的核心原理是通过监听 HTTP/HTTPS 请求,并根据配置文件中的规则将请求转发到相应的后端服务。Caddy 的配置文件(Caddyfile)定义了如何处理不同的域名和路径。

Caddy 和 Nginx 的区别

Caddy 和 Nginx 都是流行的 Web 服务器和反向代理工具,广泛应用于现代 Web 开发中。尽管它们的功能相似,但在设计理念、配置方式、性能特性等方面存在显著差异。以下是两者的主要区别:

  1. 设计理念
  • Caddy:简化 Web 服务器的配置和管理,提供开箱即用的功能。
  • Nginx:提供高性能、高并发的 Web 服务器和反向代理。
  1. 配置方式
  • Caddy:使用 Caddyfile,语法简洁直观。
  • Nginx:使用自定义的配置文件,语法复杂但功能强大。
  1. 性能
  • Caddy:性能良好,适合中小型应用。

  • Nginx:性能卓越,适合高并发、高性能场景。

  1. 自动 HTTPS
  • Caddy:默认启用,自动从 Let's Encrypt 获取证书。

  • Nginx:需要手动配置 SSL 证书。

  1. 插件/模块
  • Caddy:插件生态正在发展。

  • Nginx:模块生态丰富。

  1. 适用场景
  • Caddy:适合中小型应用、开发环境。

  • Nginx:适合高并发场景、生产环境。

使用 Docker 安装 Caddy

安装 Docker、Docker Compose

首先,确保你的系统上已经安装了 Docker。如果尚未安装,可以参考 安装指南

创建 Caddy 配置文件

在项目目录下创建一个名为 Caddyfile 的文件,用于定义 Caddy 的配置。以下是一个简单的示例:

example.com {
    reverse_proxy /api/* localhost:8000
    reverse_proxy /static/* localhost:8001
}
 
anotherexample.com {
    reverse_proxy / localhost:9000
}

在这个配置中:

  • example.com 和 anotherexample.com 是两个不同的域名。

  • example.com 的 /api/_ 路径被代理到 localhost:8000,而 /static/_ 路径被代理到 localhost:8001。

  • anotherexample.com 的所有请求都被代理到 localhost:9000。

创建 Docker Compose 文件

为了简化 Caddy 的部署,我们可以使用 Docker Compose。在项目目录下创建一个名为 docker-compose.yml 的文件,内容如下:

version: '3.7'
 
services:
  caddy:
    image: caddy:latest
    container_name: caddy
    ports:
      - '80:80'
      - '443:443'
      - '443:443/udp'
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - ./caddy_data:/data
      - ./caddy_config:/config
    restart: unless-stopped
 
volumes:
  caddy_data:
  caddy_config:

在这个配置中:

  • 使用 caddy:latest 镜像启动一个名为 caddy 的容器。

  • 将主机的 80 和 443 端口映射到容器的相应端口。

  • 将本地的 Caddyfile 挂载到容器的 /etc/caddy/Caddyfile 路径。

  • 使用两个 Docker 卷 caddy_data 和 caddy_config 来持久化 Caddy 的数据和配置。

启动 Caddy

在项目目录下运行以下命令启动 Caddy:

docker-compose up -d

Caddy 容器将会启动,并根据 Caddyfile 中的配置开始监听请求。

验证配置

你可以通过访问 http://example.comhttp://anotherexample.com 来验证配置是否正确。Caddy 会自动处理 HTTPS 请求,并为你的域名获取 SSL 证书。

高级配置

自定义 SSL 证书

如果你已经有自己的 SSL 证书,可以通过以下方式配置:

example.com {
    tls /path/to/cert.pem /path/to/key.pem
    reverse_proxy / localhost:8000
}

负载均衡

Caddy 支持简单的负载均衡配置。例如,将请求分发到多个后端服务器:

example.com {
    reverse_proxy / localhost:8000 localhost:8001 localhost:8002
}

使用环境变量

Caddy 支持使用环境变量来动态配置。例如:

example.com {
    reverse_proxy / {env.BACKEND_HOST}
}

docker-compose.yml 中定义环境变量:

environment:
  - BACKEND_HOST=localhost:8000

NOTE

更多配置请参考 官方文档

结语

通过 Docker 安装和配置 Caddy,我们可以轻松地实现多域名代理,并将不同的请求转发到不同的后端服务。Caddy 的自动 HTTPS 功能和简洁的配置语法使其成为现代 Web 开发的理想选择。希望本文能帮助你快速上手 Caddy,并在实际项目中应用它。

Happy reading!