Caddy 部署静态网站 🌐

🚀 快速搭建高性能静态网站,支持HTTPS自动加密和现代化功能
📖 目录导航
📦 Caddy 安装与配置
🐧 Ubuntu 系统安装
1. 创建目录结构
1 2 3
| sudo mkdir -p /usr/local/caddy/ssl cd /usr/local/caddy
|
2. 下载Caddy服务器
推荐方法:使用官方脚本安装
1 2 3 4 5 6 7 8 9 10
| sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl 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
wget "https://caddyserver.com/api/download?os=linux&arch=amd64&p=github.com%2Fcaddyserver%2Freplace-response&p=github.com%2Fcaddyserver%2Fwebdav" -O caddy sudo chmod +x caddy
|
3. 验证安装
1 2 3 4 5 6 7 8
| caddy version
caddy list-modules
sudo systemctl status caddy
|
4. 创建系统服务
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
| sudo tee /etc/systemd/system/caddy.service <<'EOF' [Unit] Description=Caddy HTTP/2 web server Documentation=https://caddyserver.com/docs/ After=network.target
[Service] User=www-data Group=www-data ExecStart=/usr/bin/caddy run --config /etc/caddy/Caddyfile ExecReload=/usr/bin/caddy reload --config /etc/caddy/Caddyfile TimeoutStopSec=5s LimitNOFILE=1048576 LimitNPROC=512 PrivateTmp=true ProtectSystem=full AmbientCapabilities=CAP_NET_BIND_SERVICE
[Install] WantedBy=multi-user.target EOF
sudo systemctl daemon-reload sudo systemctl enable caddy sudo systemctl start caddy
|
🌐 域名静态站点部署
📁 创建网站目录结构
1 2 3 4 5 6 7 8
| sudo mkdir -p /var/www/html/web sudo chown -R www-data:www-data /var/www/html sudo chmod -R 755 /var/www/html
sudo mkdir -p /var/log/caddy sudo chown -R www-data:www-data /var/log/caddy
|
🎨 创建示例静态页面
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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
| sudo tee /var/www/html/web/index.html <<'EOF' <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>🎯 墨不凡 - 静态网站示例</title> <style> * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background: linear-gradient(135deg, min-height: 100vh; display: flex; justify-content: center; align-items: center; color: } .container { background: rgba(255, 255, 255, 0.95); padding: 3rem; border-radius: 15px; box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1); text-align: center; max-width: 600px; width: 90%; backdrop-filter: blur(10px); } h1 { color: margin-bottom: 1.5rem; font-size: 2.5rem; } .path-info { background: padding: 1.5rem; border-radius: 8px; margin: 2rem 0; border-left: 4px solid font-family: 'Courier New', monospace; word-break: break-all; } .features { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 1rem; margin: 2rem 0; } .feature { background: padding: 1rem; border-radius: 8px; font-size: 0.9rem; } .emoji { font-size: 2rem; margin-bottom: 0.5rem; } </style> </head> <body> <div class="container"> <h1>🚀 欢迎访问静态网站</h1> <div class="path-info"> <strong>📁 网站路径:</strong><br> /var/www/html/web/index.html </div> <div class="features"> <div class="feature"> <div class="emoji">⚡</div> <div>高性能</div> </div> <div class="feature"> <div class="emoji">🔒</div> <div>HTTPS加密</div> </div> <div class="feature"> <div class="emoji">📱</div> <div>响应式设计</div> </div> <div class="feature"> <div class="emoji">🎨</div> <div>现代界面</div> </div> </div> <p>✨ 由 <strong>Caddy Server</strong> 提供支持</p> </div> </body> </html> EOF
|
🔧 配置Caddy域名站点
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 42 43 44 45 46 47 48 49 50 51 52 53
| sudo mkdir -p /etc/caddy/conf.d
sudo tee /etc/caddy/conf.d/jingtai.conf <<'EOF'
jingtai.meimolihan.eu.org:6663 { encode gzip zstd tls { ciphers TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 curves x25519 secp521r1 secp384r1 alpn http/1.1 h2 } root * /var/www/html/web file_server browse header { X-Content-Type-Options nosniff X-Frame-Options DENY X-XSS-Protection "1; mode=block" Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" Referrer-Policy "strict-origin-when-cross-origin" Permissions-Policy "geolocation=(), microphone=(), camera=()" } log { output file /var/log/caddy/jingtai.access.log { roll_size 100MB roll_keep 10 roll_keep_for 2160h } format json } handle_errors { @404 { expression {http.error.status_code} == 404 } rewrite @404 /404.html file_server } } EOF
|
🔄 应用配置
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
| sudo tee /etc/caddy/Caddyfile <<'EOF'
{ admin off auto_https disable_redirects log { level INFO } }
import conf.d/*.conf EOF
sudo caddy fmt --overwrite /etc/caddy/Caddyfile
sudo systemctl reload caddy
sudo caddy validate --config /etc/caddy/Caddyfile
|
🏠 内网静态站点部署
📂 创建内网站点
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
| sudo tee /var/www/html/web/internal.html <<'EOF' <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>🏠 内网测试页面</title> <style> body { font-family: Arial, sans-serif; margin: 40px; background: .container { max-width: 800px; margin: 0 auto; background: white; padding: 20px; border-radius: 10px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); } h1 { color: .info { background: </style> </head> <body> <div class="container"> <h1>🏠 内网静态网站测试</h1> <div class="info"> <strong>📍 访问地址:</strong> http://10.10.10.247:9300<br> <strong>📁 文件路径:</strong> /var/www/html/web/internal.html </div> <p>这是一个内网测试页面,仅在内网环境中可访问。</p> </div> </body> </html> EOF
|
🔧 配置内网站点
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
| sudo tee /etc/caddy/conf.d/internal.conf <<'EOF'
:9300 { encode gzip root * /var/www/html/web file_server try_files {path} /internal.html @blocked { not remote_ip 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 } respond @blocked 403 "Forbidden" header { X-Content-Type-Options nosniff X-Frame-Options DENY } } EOF
|
🚀 启动内网服务
1 2 3 4 5 6 7 8 9 10 11
| sudo systemctl reload caddy
sudo systemctl status caddy
curl -I http://10.10.10.247:9300
sudo ss -tuln | grep 9300
|
🔧 高级配置技巧
🔄 多站点配置
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
| sudo tee /etc/caddy/conf.d/multiple.conf <<'EOF'
site1.example.com { root * /var/www/site1 file_server encode gzip }
blog.example.com { root * /var/www/blog file_server encode gzip try_files {path} /index.html }
api.example.com { reverse_proxy /api/* localhost:3000 request_body { max_size 10MB } } EOF
|
🌐 虚拟主机配置
1 2 3 4 5 6 7 8 9 10 11 12 13
| sudo tee /etc/caddy/conf.d/vhost.conf <<'EOF'
site1.example.com, site2.example.com, www.site1.example.com { root * /var/www/html/sites file_server encode gzip @primary host site1.example.com redir @primary https://site1.example.com{uri} permanent } EOF
|
📊 日志配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| sudo tee /etc/caddy/conf.d/logging.conf <<'EOF'
:2015 { log { output file /var/log/caddy/access.log { roll_size 100MB roll_keep 10 roll_keep_for 720h } format json { time_format "2006-01-02T15:04:05Z07:00" } } } EOF
|
⚡ 性能优化
🚀 启用HTTP/3
1 2 3 4 5 6 7 8
| { servers { protocol { experimental_http3 } } }
|
📦 静态资源缓存
1 2 3 4 5 6 7 8 9 10 11 12 13
| @static { path *.css *.js *.png *.jpg *.jpeg *.gif *.ico *.svg *.woff *.woff2 *.ttf *.eot }
header @static Cache-Control "public, max-age=31536000, immutable"
encode { gzip zstd min_length 256 }
|
🔄 负载均衡配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| reverse_proxy /api/* { to server1:8080 server2:8080 server3:8080 lb_policy round_robin health_check /health health_interval 30s health_timeout 5s transport http { keepalive 30s keepalive_interval 10s keepalive_idle_conns 100 } }
|
🔒 安全加固
🛡️ 安全头部
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| header { X-Content-Type-Options "nosniff" X-Frame-Options "DENY" X-XSS-Protection "1; mode=block" Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" Referrer-Policy "strict-origin-when-cross-origin" Permissions-Policy "geolocation=(), microphone=(), camera=()" Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' https://cdn.example.com; style-src 'self' 'unsafe-inline' https://cdn.example.com; img-src 'self' data: https:;" }
|
🔐 访问控制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| @blocked { not remote_ip 192.168.1.0/24 10.10.10.0/24 }
respond @blocked 403 "Forbidden"
basicauth /admin/* { admin $2y$10$AbCdEfGhIjKlMnOpQrStUvWxYzAbCdEfGhIjKlMnOpQrStUv }
@rate_limit { remote_ip 192.168.1.0/24 } limit_rate @rate_limit 100k
|
🐛 故障排除
🔍 常见问题解决
端口被占用
1 2 3 4 5
| sudo netstat -tulnp | grep :6663
sudo fuser -k 6663/tcp
|
权限问题
1 2 3 4 5 6 7 8 9
| sudo chown -R www-data:www-data /var/www/html sudo chmod -R 755 /var/www/html
getenforce
sudo setenforce 0
|
配置错误
1 2 3 4 5
| sudo caddy validate --config /etc/caddy/Caddyfile
sudo caddy run --config /etc/caddy/Caddyfile --adapter caddyfile
|
📋 日志检查
1 2 3 4 5 6 7 8 9 10 11
| sudo journalctl -u caddy -f
sudo tail -f /var/log/caddy/access.log
sudo tail -f /var/log/caddy/*.log | grep -i error
sudo top -p $(pgrep caddy)
|
💡 实用技巧
🎯 一键部署脚本
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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| #!/bin/bash
set -e
echo "开始部署静态网站..."
echo "安装Caddy..." sudo apt update sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl 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
echo "创建网站目录..." sudo mkdir -p /var/www/html/web sudo chown -R www-data:www-data /var/www/html sudo chmod -R 755 /var/www/html
echo "创建示例页面..." sudo tee /var/www/html/web/index.html <<'HTML' <!DOCTYPE html> <html> <head> <title>Welcome</title> <style>body{font-family:Arial,sans-serif;margin:40px;text-align:center}</style> </head> <body> <h1>🚀 网站部署成功!</h1> <p>你的静态网站已经成功部署</p> </body> </html> HTML
echo "创建Caddy配置..." sudo mkdir -p /etc/caddy/conf.d sudo tee /etc/caddy/Caddyfile <<'EOF' { admin off auto_https disable_redirects }
:80 { root * /var/www/html/web file_server encode gzip } EOF
echo "启动Caddy服务..." sudo systemctl enable caddy sudo systemctl start caddy
echo "✅ 部署完成! 网站已启动"
|
🔄 自动更新证书
1 2 3 4 5 6 7 8
|
sudo caddy renew
sudo caddy validate
|
📊 监控状态
1 2 3 4 5 6 7 8 9 10 11
| sudo systemctl status caddy
sudo ss -tulpn | grep caddy
sudo ps aux | grep caddy
sudo tail -f /var/log/caddy/access.log | jq '.'
|
💡 专业提示: Caddy的自动HTTPS功能让它成为部署静态网站的绝佳选择。对于生产环境,建议使用完整的Caddyfile配置,并定期检查日志以确保服务稳定运行。