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
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
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
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
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 start
./caddy stop
./caddy run
|
📁 目录结构
1 2 3 4 5 6 7 8
| /usr/local/caddy/ ├── caddy ├── Caddyfile ├── 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
| 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
| export CF_Token="XMzEDoVjTvJJuzbjn0GO2RMxOfbKN5X369qUqvFT" export CF_Zone_ID="382fc112abf99c7994ceaedd4844a243"
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
| 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
| { 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
|
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 } }
https://file.meimolihan.eu.org:6663 { root * /mnt encode gzip 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
| 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
| 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_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
| 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 --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
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
acme.sh --renew-all --force
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
|