Caddy 从入门到实战指南(一)
Caddy 是一个自动化、高性能的 HTTP/2 Web 服务器,使用 Go 语言编写,能够自动为网站启用 HTTPS。与传统的 Nginx 相比,Caddy 的配置更加简洁,且默认开启 HTTPS,无需额外配置。Caddy 的模块化设计使其功能丰富且易于扩展。
一、Caddy vs Nginx 优缺点对比
1. 核心优势对比
特性 | Caddy | Nginx |
---|---|---|
配置复杂度 | ✅ 配置文件仅需5行完成HTTPS | ❌ 需要手动配置证书和加密套件 |
HTTPS支持 | 🔑 全自动证书申请与续签 | ⚙️ 需手动配置Let’s Encrypt |
性能 | 🚀 中等并发(5k-10k QPS) | 🚀 高并发(10k+ QPS) |
配置语法 | 📝 类自然语言(Caddyfile) | 📝 自定义语法(需学习) |
内存占用 | 📦 约15MB内存 | 📦 约5MB内存 |
生态扩展 | 🔌 插件需重新编译 | 🔌 动态模块加载 |
2. 选型建议
- 选择Caddy:快速搭建HTTPS服务/个人项目/小型网站
- 选择Nginx:高并发生产环境/需要精细调优的场景
二、环境安装指南
1. Linux CentOS 安装
# 添加Caddy仓库
sudo dnf install 'dnf-command(copr)'
sudo dnf copr enable @caddy/caddy
# 安装Caddy
sudo dnf install caddy
# 验证安装
caddy version # 输出版本信息即成功
2. Windows 安装
# 使用Chocolatey包管理器
choco install caddy
# 或手动安装步骤:
# 1. 访问 https://caddyserver.com/download
# 2. 下载Windows版zip文件
# 3. 解压到C:\Caddy目录
# 4. 将C:\Caddy添加到PATH环境变量
三、核心功能实战
1. 反向代理配置
场景:将域名代理到本地3000端口的Node应用
# 经典示例:全自动HTTPS反向代理
app.example.com {
reverse_proxy localhost:8080
}
# 带负载均衡配置
{
servers {
lb1 localhost:3001
lb2 localhost:3002
}
}
# 将 app.example.com 转发到上面配置的lb1和lb2
app.example.com {
reverse_proxy @servers {
lb_policy round_robin
}
}
对比nginx的反向代理配置
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
2. 静态资源托管
场景:托管/var/www
目录下的前端项目
static.example.com {
root * /var/www
file_server
}
# 带缓存控制的进阶配置
static.example.com {
root * /var/www
file_server {
precompressed br gzip # 开启压缩
}
header Cache-Control "public, max-age=604800"
}
static.example.com
是站点的域名,root
指令指定站点的根目录,file_server
指令启用文件服务器功能。
nginx静态资源代理
server {
listen 80;
server_name example.com;
location / {
root /var/www/static;
index index.html index.htm;
}
}
3. URL路径操作
场景:将/api/v1/user
重写为/user
api.example.com {
# 路径替换(浏览器地址栏不变)
rewrite /api/v1/user /user
# 正则表达式匹配
@user path_regexp ^/user/(\w+)
handle @user {
rewrite /user/(\w+) /profile?name={re.user.1}
}
reverse_proxy localhost:8080
}
nginx配置
server {
listen 80;
server_name example.com;
location /oldpath {
rewrite ^/oldpath(.*)$ /newpath$1 permanent;
}
location / {
root /var/www/html;
index index.html index.htm;
}
}
4. HTTPS自动配置
场景:自动申请并续期SSL证书
# 全自动配置(需开放80/443端口)
your.example.com {
reverse_proxy http://192.168.100.100:8080
}
将 your.example.com 替换为你的域名,并确保域名已解析到服务器的 IP 地址
# 手动指定证书(企业级场景)
example.com {
tls /path/cert.pem /path/key.pem
respond "Custom Cert!"
}
nginx配置
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /path/to/cert.crt;
ssl_certificate_key /path/to/cert.key;
location / {
root /var/www/html;
index index.html index.htm;
}
}
四、日志分析技巧
1. 日志位置
- Linux:
/var/log/caddy/access.log
和error.log
- Windows:
C:\Caddy\logs\access.log
2. 实时监控日志
# Linux
tail -f /var/log/caddy/access.log | grep '404'
# Windows
Get-Content C:\Caddy\logs\access.log -Wait | Select-String "500"
3. 日志格式解析
示例日志条目:
2024/02/20 14:30 "GET /about HTTP/2.0" 200 1523 "https://google.com" "Mozilla/5.0"
各字段含义:
[日期] [请求方法] [路径] [协议] [状态码] [响应大小] [来源页] [客户端标识]
五、跨平台配置差异
1. 服务管理
操作 | Linux | Windows |
---|---|---|
启动服务 | sudo systemctl start caddy | Start-Service Caddy |
查看状态 | systemctl status caddy | Get-Service Caddy |
开机自启 | sudo systemctl enable caddy | Set-Service Caddy -StartupType Automatic |
2. 配置文件路径
- Linux:
/etc/caddy/Caddyfile
- Windows:
C:\Caddy\Caddyfile
六、经典问题解决方案
1. 证书申请失败
症状:日志出现acme: error: 400
错误
# 解决方案:
# 1. 检查DNS解析是否正确
# 2. 确保服务器开放80/443端口
# 3. 清理旧证书缓存
sudo rm -rf /var/lib/caddy/.local/share/caddy
2. 权限问题处理
# 错误提示:permission denied
sudo setcap 'cap_net_bind_service=+ep' /usr/bin/caddy
sudo chown -R caddy:caddy /var/www
七、性能调优建议
1. 提升并发能力
{
# 最大并发连接数
servers 2000
# 每个连接最大请求数
max_requests_per_conn 1000
}
2. 开启HTTP/3
:443 {
protocols h2 h3
}