1.1 Caddy简介

1.1.1 什么是Caddy

Caddy 是一个现代化的、开源的 Web 服务器,由 Go 语言编写。它以简单易用、自动 HTTPS 和强大的功能而著称。Caddy 的设计理念是让 Web 服务器的配置和管理变得简单直观。

1.1.2 Caddy的核心特性

  1. 自动 HTTPS

    • 自动获取和续期 SSL/TLS 证书
    • 支持 Let’s Encrypt 和其他 ACME 提供商
    • 零配置 HTTPS 部署
  2. 简单配置

    • 人性化的 Caddyfile 配置语法
    • JSON 配置支持
    • 热重载配置
  3. 现代架构

    • HTTP/2 和 HTTP/3 支持
    • 模块化设计
    • 高性能和低内存占用
  4. 丰富功能

    • 反向代理和负载均衡
    • 静态文件服务
    • 模板引擎
    • 中间件系统

1.1.3 Caddy vs 其他Web服务器

特性 Caddy Nginx Apache
配置复杂度 简单 中等 复杂
自动HTTPS
HTTP/2支持
HTTP/3支持
内存占用 中等
学习曲线 平缓 陡峭 陡峭
插件生态 中等 丰富 丰富

1.1.4 适用场景

Caddy 特别适合以下场景:

  • 小型到中型网站:配置简单,维护成本低
  • 微服务架构:优秀的反向代理和负载均衡功能
  • 开发环境:快速搭建本地开发服务器
  • 静态网站:优秀的静态文件服务性能
  • 需要快速部署HTTPS的项目:自动证书管理

1.2 安装Caddy

1.2.1 系统要求

  • 操作系统:Linux、macOS、Windows、FreeBSD
  • 架构:amd64、arm64、386、arm
  • 内存:最少 64MB RAM
  • 存储:最少 50MB 可用空间

1.2.2 Linux安装

方法1:官方安装脚本(推荐)

# 下载并执行官方安装脚本
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

方法2:下载二进制文件

# 下载最新版本
wget https://github.com/caddyserver/caddy/releases/latest/download/caddy_linux_amd64.tar.gz

# 解压
tar -xzf caddy_linux_amd64.tar.gz

# 移动到系统路径
sudo mv caddy /usr/local/bin/

# 设置执行权限
sudo chmod +x /usr/local/bin/caddy

方法3:使用包管理器

Ubuntu/Debian:

sudo apt install caddy

CentOS/RHEL/Fedora:

# CentOS/RHEL
sudo yum install caddy

# Fedora
sudo dnf install caddy

Arch Linux:

sudo pacman -S caddy

1.2.3 macOS安装

使用Homebrew(推荐)

# 安装Homebrew(如果未安装)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# 安装Caddy
brew install caddy

下载二进制文件

# 下载macOS版本
wget https://github.com/caddyserver/caddy/releases/latest/download/caddy_darwin_amd64.tar.gz

# 解压并安装
tar -xzf caddy_darwin_amd64.tar.gz
sudo mv caddy /usr/local/bin/

1.2.4 Windows安装

方法1:下载可执行文件

  1. 访问 Caddy Releases
  2. 下载 caddy_windows_amd64.zip
  3. 解压到目标目录(如 C:\caddy
  4. 将目录添加到系统 PATH 环境变量

方法2:使用Chocolatey

# 安装Chocolatey(如果未安装)
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))

# 安装Caddy
choco install caddy

方法3:使用Scoop

# 安装Scoop(如果未安装)
iwr -useb get.scoop.sh | iex

# 安装Caddy
scoop install caddy

1.2.5 Docker安装

# 拉取官方镜像
docker pull caddy:latest

# 运行容器
docker run -d \
  --name caddy \
  -p 80:80 \
  -p 443:443 \
  -v $PWD/Caddyfile:/etc/caddy/Caddyfile \
  -v caddy_data:/data \
  -v caddy_config:/config \
  caddy:latest

1.2.6 从源码编译

# 安装Go(版本1.19+)
wget https://golang.org/dl/go1.21.0.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.21.0.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin

# 克隆源码
git clone https://github.com/caddyserver/caddy.git
cd caddy

# 编译
go build -o caddy cmd/caddy/main.go

# 安装
sudo mv caddy /usr/local/bin/

1.3 验证安装

1.3.1 检查版本

caddy version

输出示例:

v2.7.6 h1:w0NymbG2m9PcvKWsrXO6EEkY9Ru4FJK8uQbYY7UGwiA=

1.3.2 查看帮助信息

caddy help

1.3.3 快速测试

创建一个简单的测试页面:

# 创建测试目录
mkdir ~/caddy-test
cd ~/caddy-test

# 创建测试页面
echo '<h1>Hello, Caddy!</h1>' > index.html

# 启动Caddy
caddy file-server --listen :8080

在浏览器中访问 http://localhost:8080,应该能看到 “Hello, Caddy!” 页面。

1.4 基本命令

1.4.1 常用命令概览

# 启动Caddy(使用当前目录的Caddyfile)
caddy run

# 后台启动
caddy start

# 停止Caddy
caddy stop

# 重新加载配置
caddy reload

# 验证配置文件
caddy validate

# 格式化Caddyfile
caddy fmt

# 查看当前配置
caddy config

1.4.2 文件服务器命令

# 启动文件服务器(当前目录)
caddy file-server

# 指定端口
caddy file-server --listen :8080

# 指定根目录
caddy file-server --root /var/www

# 启用目录浏览
caddy file-server --browse

1.4.3 反向代理命令

# 简单反向代理
caddy reverse-proxy --from localhost:8080 --to localhost:3000

# 多个后端
caddy reverse-proxy --from localhost:8080 --to localhost:3000 --to localhost:3001

1.5 配置文件位置

1.5.1 默认配置文件路径

Linux: - 配置文件:/etc/caddy/Caddyfile - 数据目录:/var/lib/caddy - 日志目录:/var/log/caddy

macOS: - 配置文件:/usr/local/etc/caddy/Caddyfile - 数据目录:~/Library/Application Support/Caddy

Windows: - 配置文件:%APPDATA%\Caddy\Caddyfile - 数据目录:%APPDATA%\Caddy

1.5.2 自定义配置文件

# 使用指定的配置文件
caddy run --config /path/to/Caddyfile

# 使用JSON配置
caddy run --config config.json

1.6 系统服务配置

1.6.1 Linux Systemd服务

创建服务文件:

sudo nano /etc/systemd/system/caddy.service

服务文件内容:

[Unit]
Description=Caddy
Documentation=https://caddyserver.com/docs/
After=network.target network-online.target
Requires=network-online.target

[Service]
Type=notify
User=caddy
Group=caddy
ExecStart=/usr/bin/caddy run --environ --config /etc/caddy/Caddyfile
ExecReload=/usr/bin/caddy reload --config /etc/caddy/Caddyfile --force
TimeoutStopSec=5s
LimitNOFILE=1048576
LimitNPROC=1048576
PrivateTmp=true
ProtectSystem=full
AmbientCapabilities=CAP_NET_BIND_SERVICE

[Install]
WantedBy=multi-user.target

创建caddy用户:

# 创建系统用户
sudo useradd --system --home /var/lib/caddy --create-home --shell /bin/false caddy

# 设置目录权限
sudo chown -R caddy:caddy /var/lib/caddy
sudo chown caddy:caddy /etc/caddy/Caddyfile

启用和启动服务:

# 重新加载systemd
sudo systemctl daemon-reload

# 启用服务
sudo systemctl enable caddy

# 启动服务
sudo systemctl start caddy

# 查看状态
sudo systemctl status caddy

1.6.2 macOS LaunchDaemon

创建plist文件:

sudo nano /Library/LaunchDaemons/com.caddyserver.caddy.plist

文件内容:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.caddyserver.caddy</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/caddy</string>
        <string>run</string>
        <string>--config</string>
        <string>/usr/local/etc/caddy/Caddyfile</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <true/>
    <key>StandardErrorPath</key>
    <string>/var/log/caddy.log</string>
    <key>StandardOutPath</key>
    <string>/var/log/caddy.log</string>
</dict>
</plist>

加载服务:

sudo launchctl load /Library/LaunchDaemons/com.caddyserver.caddy.plist

1.7 故障排除

1.7.1 常见问题

问题1:权限被拒绝

# 错误信息
listen tcp :80: bind: permission denied

# 解决方案
# 1. 使用sudo运行
sudo caddy run

# 2. 或者使用非特权端口
caddy run --listen :8080

# 3. 或者设置capabilities(Linux)
sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/caddy

问题2:配置文件语法错误

# 验证配置文件
caddy validate --config Caddyfile

# 格式化配置文件
caddy fmt --overwrite Caddyfile

问题3:端口被占用

# 查看端口占用
sudo netstat -tlnp | grep :80
# 或者
sudo ss -tlnp | grep :80

# 杀死占用进程
sudo kill -9 <PID>

1.7.2 日志调试

# 启用详细日志
caddy run --config Caddyfile --debug

# 查看系统日志
sudo journalctl -u caddy -f

# 查看Caddy日志文件
tail -f /var/log/caddy/access.log

1.7.3 配置测试

# 测试配置文件
caddy validate

# 干运行(不实际启动)
caddy run --config Caddyfile --dry-run

# 检查配置语法
caddy fmt --diff Caddyfile

本章总结

本章我们学习了:

  1. Caddy简介:了解了Caddy的特性和优势
  2. 安装方法:掌握了多种平台的安装方式
  3. 基本命令:学会了常用的Caddy命令
  4. 配置文件:了解了配置文件的位置和结构
  5. 系统服务:学会了将Caddy配置为系统服务
  6. 故障排除:掌握了常见问题的解决方法

通过本章的学习,你应该能够: - 在各种操作系统上成功安装Caddy - 使用基本命令启动和管理Caddy - 解决常见的安装和配置问题 - 将Caddy配置为系统服务

练习题

基础练习

  1. 安装验证

    • 在你的系统上安装Caddy
    • 验证安装是否成功
    • 查看Caddy版本信息
  2. 快速启动

    • 创建一个简单的HTML页面
    • 使用Caddy启动文件服务器
    • 在浏览器中访问页面
  3. 命令练习

    • 尝试使用不同的端口启动Caddy
    • 练习启动、停止、重载命令
    • 使用help命令查看更多选项

进阶练习

  1. 系统服务

    • 将Caddy配置为系统服务
    • 设置开机自启动
    • 测试服务的启动、停止、重启
  2. 配置文件

    • 创建自定义的Caddyfile
    • 使用不同的配置文件启动Caddy
    • 验证配置文件语法
  3. 故障排除

    • 故意制造一些常见错误
    • 练习使用日志和调试功能
    • 解决端口冲突问题

实战练习

  1. 多站点部署

    • 在一台服务器上部署多个静态网站
    • 使用不同的端口或域名
    • 配置基本的访问日志
  2. Docker部署

    • 使用Docker运行Caddy
    • 挂载配置文件和网站目录
    • 配置数据持久化

下一章我们将学习Caddy的配置文件Caddyfile的详细语法和使用方法。