1.1 Caddy简介
1.1.1 什么是Caddy
Caddy 是一个现代化的、开源的 Web 服务器,由 Go 语言编写。它以简单易用、自动 HTTPS 和强大的功能而著称。Caddy 的设计理念是让 Web 服务器的配置和管理变得简单直观。
1.1.2 Caddy的核心特性
自动 HTTPS
- 自动获取和续期 SSL/TLS 证书
- 支持 Let’s Encrypt 和其他 ACME 提供商
- 零配置 HTTPS 部署
简单配置
- 人性化的 Caddyfile 配置语法
- JSON 配置支持
- 热重载配置
现代架构
- HTTP/2 和 HTTP/3 支持
- 模块化设计
- 高性能和低内存占用
丰富功能
- 反向代理和负载均衡
- 静态文件服务
- 模板引擎
- 中间件系统
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:下载可执行文件
- 访问 Caddy Releases
- 下载
caddy_windows_amd64.zip
- 解压到目标目录(如
C:\caddy
) - 将目录添加到系统 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
本章总结
本章我们学习了:
- Caddy简介:了解了Caddy的特性和优势
- 安装方法:掌握了多种平台的安装方式
- 基本命令:学会了常用的Caddy命令
- 配置文件:了解了配置文件的位置和结构
- 系统服务:学会了将Caddy配置为系统服务
- 故障排除:掌握了常见问题的解决方法
通过本章的学习,你应该能够: - 在各种操作系统上成功安装Caddy - 使用基本命令启动和管理Caddy - 解决常见的安装和配置问题 - 将Caddy配置为系统服务
练习题
基础练习
安装验证
- 在你的系统上安装Caddy
- 验证安装是否成功
- 查看Caddy版本信息
快速启动
- 创建一个简单的HTML页面
- 使用Caddy启动文件服务器
- 在浏览器中访问页面
命令练习
- 尝试使用不同的端口启动Caddy
- 练习启动、停止、重载命令
- 使用help命令查看更多选项
进阶练习
系统服务
- 将Caddy配置为系统服务
- 设置开机自启动
- 测试服务的启动、停止、重启
配置文件
- 创建自定义的Caddyfile
- 使用不同的配置文件启动Caddy
- 验证配置文件语法
故障排除
- 故意制造一些常见错误
- 练习使用日志和调试功能
- 解决端口冲突问题
实战练习
多站点部署
- 在一台服务器上部署多个静态网站
- 使用不同的端口或域名
- 配置基本的访问日志
Docker部署
- 使用Docker运行Caddy
- 挂载配置文件和网站目录
- 配置数据持久化
下一章我们将学习Caddy的配置文件Caddyfile的详细语法和使用方法。