acme.sh + Caddy 完全指南 🚀
🌐 现代化的 Web 服务器与自动化 SSL 证书管理
📋 目录导航
🎯 快速开始
🌟 一站式安装脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#!/bin/bash
# 🚀 Caddy + acme.sh 快速部署脚本
echo "开始安装 Caddy 和 acme.sh..."
# 创建目录
sudo mkdir -p /usr/local/caddy/{ssl,conf.d} /var/www/html
sudo chmod -R 755 /usr/local/caddy /var/www/html
# 下载 Caddy
cd /usr/local/caddy
wget -O caddy "https://caddyserver.com/api/download?os=linux&arch=amd64&p=github.com%2Fcaddyserver%2Fcaddy/v2"
chmod +x caddy
# 安装 acme.sh
curl https://get.acme.sh | sh -s email=meimolihan@live.com
source ~/.bashrc
echo "安装完成!"
|
📦 Caddy 安装配置
🐧 安装 Caddy
1
2
3
4
5
6
7
8
9
10
11
12
|
# 创建安装目录
sudo mkdir -p /usr/local/caddy
cd /usr/local/caddy
# 下载 Caddy(包含常用模块)
wget -O caddy "https://caddyserver.com/api/download?os=linux&arch=amd64&p=github.com%2Fcaddyserver%2Fcaddy/v2&p=github.com%2Fcaddyserver%2Fwebdav"
# 设置执行权限
chmod +x caddy
# 验证安装
./caddy version
|
🔧 基本管理命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
# 查看版本
./caddy version
# 列出已安装模块
./caddy list-modules
# 验证配置文件
./caddy validate
# 格式化配置文件
./caddy fmt --overwrite
# 重新加载配置
./caddy reload
# 启动 Caddy
./caddy start
# 停止 Caddy
./caddy stop
# 运行 Caddy(前台)
./caddy run
|
📁 目录结构
1
2
3
4
5
6
7
8
|
/usr/local/caddy/
├── caddy # Caddy 二进制文件
├── Caddyfile # 主配置文件
├── ssl/ # SSL 证书目录
│ ├── full_chain.pem
│ └── private.key
└── conf.d/ # 子配置文件目录
└── *.conf # 各个服务的配置文件
|
🚀 开机自启动
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
# 创建启动脚本
sudo tee /etc/systemd/system/caddy.service > /dev/null <<'EOF'
[Unit]
Description=Caddy Web Server
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/usr/local/caddy
ExecStart=/usr/local/caddy/caddy run --config /usr/local/caddy/Caddyfile
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
# 启用并启动服务
sudo systemctl daemon-reload
sudo systemctl enable caddy
sudo systemctl start caddy
|
🔐 SSL 证书管理
📦 安装 acme.sh
1
2
3
4
5
6
7
8
9
10
11
|
# 安装 acme.sh
curl https://get.acme.sh | sh -s email=meimolihan@live.com
# 或者使用国内镜像
curl https://gitcode.net/cert/cn-acme.sh/-/raw/master/install.sh?inline=false | sh -s email=meimolihan@live.com
# 重新加载配置
source ~/.bashrc
# 验证安装
acme.sh --version
|
🌐 Cloudflare DNS 验证
1
2
3
4
5
6
7
8
9
10
11
12
|
# 设置 Cloudflare API Token
export CF_Token="XMzEDoVjTvJJuzbjn0GO2RMxOfbKN5X369qUqvFT"
export CF_Zone_ID="382fc112abf99c7994ceaedd4844a243"
# 设置默认 CA
acme.sh --set-default-ca --server letsencrypt
# 申请泛域名证书
acme.sh --issue --dns dns_cf \
-d "meimolihan.eu.org" \
-d "*.meimolihan.eu.org" \
--keylength ec-256
|
📁 证书安装
1
2
3
4
5
|
# 安装证书到 Caddy
acme.sh --install-cert -d meimolihan.eu.org \
--key-file /usr/local/caddy/ssl/private.key \
--fullchain-file /usr/local/caddy/ssl/full_chain.pem \
--reloadcmd "cd /usr/local/caddy && ./caddy reload"
|
🔄 证书维护
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
# 查看证书列表
acme.sh --list
# 查看证书信息
acme.sh --info -d meimolihan.eu.org
# 手动续签
acme.sh --renew -d meimolihan.eu.org --force
# 设置自动更新
acme.sh --upgrade --auto-upgrade
# 撤销证书
acme.sh --revoke -d meimolihan.eu.org
acme.sh --remove -d meimolihan.eu.org
|
⏰ 自动续签配置
1
2
3
4
5
|
# 添加计划任务
(crontab -l; echo '10 20 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null') | crontab -
# 验证计划任务
crontab -l | grep acme
|
🔄 反向代理配置
🎯 主配置文件
1
2
3
4
5
6
7
8
|
# /usr/local/caddy/Caddyfile
{
http_port 86
https_port 6663
order reverse_proxy before file_server
}
import /usr/local/caddy/conf.d/*.conf
|
🌐 反向代理示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
# /usr/local/caddy/conf.d/proxy.conf
# PVE 管理界面
https://pve.meimolihan.eu.org:6663 {
encode gzip
tls /usr/local/caddy/ssl/full_chain.pem /usr/local/caddy/ssl/private.key
reverse_proxy https://10.10.10.254:8006 {
transport http {
tls_insecure_skip_verify
}
header_up Host {http.reverse_proxy.upstream.hostport}
}
# 错误处理
handle_errors {
rewrite * /50x.html
root * /var/www/html
file_server
}
}
# WebDAV 文件服务
https://file.meimolihan.eu.org:6663 {
root * /mnt
encode gzip
# Basic 认证
basic_auth {
admin $2a$14$yZXju.olCFqnybbcXmOfyuA64uPlejIBQVNgd9e7epWJrnB/aT57K
}
tls /usr/local/caddy/ssl/full_chain.pem /usr/local/caddy/ssl/private.key
route {
rewrite /webdav /webdav/
webdav /webdav/* {
prefix /webdav
}
file_server browse
}
}
|
🛡️ 安全头部配置
1
2
3
4
5
6
7
8
9
10
11
12
|
# 安全增强配置
header {
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
X-Content-Type-Options "nosniff"
X-Frame-Options "DENY"
X-XSS-Protection "1; mode=block"
Referrer-Policy "strict-origin-when-cross-origin"
Permissions-Policy "fullscreen=(self)"
}
# 隐藏服务器信息
server_tokens off
|
📊 负载均衡配置
1
2
3
4
5
6
7
8
9
|
# 负载均衡示例
https://api.example.com:6663 {
reverse_proxy {
to server1:8080 server2:8080 server3:8080
lb_policy round_robin
health_uri /health
health_interval 30s
}
}
|
⚡ 性能优化
🚀 Caddy 性能调优
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# 全局性能配置
{
# 连接限制
servers {
max_connections 1000
}
# 缓冲区大小
buffers {
read 4096
write 4096
}
# 超时设置
timeouts {
read 30s
write 30s
idle 60s
}
}
|
📦 压缩和缓存
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
# Gzip 压缩
encode gzip
# 静态资源缓存
header /assets/* {
Cache-Control "public, max-age=31536000"
}
# 代理缓存
reverse_proxy {
@static {
path *.css *.js *.png *.jpg *.jpeg *.gif *.ico *.svg *.woff *.woff2
}
header @static Cache-Control "public, max-age=31536000"
}
|
🔍 监控和日志
1
2
3
4
5
6
7
8
|
# 查看 Caddy 日志
journalctl -u caddy -f
# 实时监控连接数
watch -n 1 "netstat -an | grep :6663 | wc -l"
# 性能测试
ab -n 1000 -c 100 https://pve.meimolihan.eu.org:6663/
|
🔧 维护管理
📋 备份和恢复
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#!/bin/bash
# backup-caddy.sh
BACKUP_DIR="/backup/caddy/$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR
# 备份配置和证书
cp -r /usr/local/caddy $BACKUP_DIR/
cp -r /var/www/html $BACKUP_DIR/html/
# 创建压缩包
tar -czf $BACKUP_DIR/caddy-backup.tar.gz $BACKUP_DIR
echo "备份完成: $BACKUP_DIR/caddy-backup.tar.gz"
|
🛠️ 故障排除
1
2
3
4
5
6
7
8
9
10
11
12
|
# 检查配置语法
cd /usr/local/caddy && ./caddy validate
# 调试模式运行
cd /usr/local/caddy && ./caddy run --debug
# 检查证书状态
openssl x509 -in /usr/local/caddy/ssl/full_chain.pem -noout -dates
# 检查端口占用
sudo lsof -i :6663
sudo netstat -tulnp | grep :6663
|
🔄 更新和维护
1
2
3
4
5
6
7
8
9
10
11
12
|
# 更新 Caddy
cd /usr/local/caddy
wget -O caddy.new "https://caddyserver.com/api/download?os=linux&arch=amd64"
mv caddy.new caddy
chmod +x caddy
./caddy reload
# 更新 acme.sh
acme.sh --upgrade
# 清理旧日志
find /var/log -name "caddy*" -mtime +30 -delete
|
💡 最佳实践
🛡️ 安全建议
1
2
3
4
5
6
7
8
9
10
11
12
|
# 定期更新软件
cd /usr/local/caddy && wget -O caddy "https://caddyserver.com/api/download?os=linux&arch=amd64"
acme.sh --upgrade
# 文件权限设置
chmod 755 /usr/local/caddy
chmod 600 /usr/local/caddy/ssl/private.key
chmod 644 /usr/local/caddy/ssl/full_chain.pem
# 防火墙配置
ufw allow 6663/tcp comment 'Caddy HTTPS'
ufw allow 86/tcp comment 'Caddy HTTP'
|
📊 监控告警
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#!/bin/bash
# monitor-caddy.sh
# 检查服务状态
if ! systemctl is-active --quiet caddy; then
echo "Caddy 服务异常" | mail -s "Caddy 服务告警" admin@example.com
systemctl restart caddy
fi
# 检查证书过期
EXPIRY_DAYS=$(openssl x509 -in /usr/local/caddy/ssl/full_chain.pem -checkend 864000 | grep -c "will expire")
if [ $EXPIRY_DAYS -eq 1 ]; then
echo "SSL 证书即将过期" | mail -s "证书告警" admin@example.com
fi
|
🔧 自动化脚本
1
2
3
4
5
6
7
8
9
10
11
|
#!/bin/bash
# renew-certificates.sh
# 续签证书
acme.sh --renew-all --force
# 重载 Caddy
cd /usr/local/caddy && ./caddy reload
# 记录日志
echo "$(date): 证书续签完成" >> /var/log/caddy-renew.log
|
📝 文档和资源
🎯 提示: 建议在生产环境部署前充分测试所有配置。定期检查日志和监控状态,确保服务稳定运行。
🚀 扩展功能:
- 🔄 多服务器负载均衡
- 🌐 CDN 集成
- 📊 访问日志分析
- 🛡️ WAF 防火墙
- 📱 移动端优化
📞 紧急恢复:
1
2
3
4
5
6
7
8
9
|
# 服务异常时重启
systemctl restart caddy
# 证书问题重新申请
acme.sh --renew -d meimolihan.eu.org --force
# 配置回滚
cp /backup/caddy/Caddyfile /usr/local/caddy/
cd /usr/local/caddy && ./caddy reload
|