Featured image of post Caddy 部署静态网站 🌐

Caddy 部署静态网站 🌐

Caddy 部署静态网站 🌐 🚀 快速搭建高性能静态网站,支持HTTPS自动加密和现代化功能

Caddy 部署静态网站 🌐

🚀 快速搭建高性能静态网站,支持HTTPS自动加密和现代化功能


📖 目录导航


📦 Caddy 安装与配置

🐧 Ubuntu 系统安装

1. 创建目录结构

1
2
3
# 创建Caddy主目录和SSL证书目录
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

# 或者手动下载特定版本(包含WebDAV插件)
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版本
caddy version

# 查看已安装的插件
caddy list-modules

# 检查Caddy运行状态
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
# 创建systemd服务文件
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

# 重新加载systemd配置
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, #667eea 0%, #764ba2 100%);
            min-height: 100vh;
            display: flex;
            justify-content: center;
            align-items: center;
            color: #333;
        }
        
        .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: #4a5568;
            margin-bottom: 1.5rem;
            font-size: 2.5rem;
        }
        
        .path-info {
            background: #f7fafc;
            padding: 1.5rem;
            border-radius: 8px;
            margin: 2rem 0;
            border-left: 4px solid #4299e1;
            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: #ebf8ff;
            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
# 创建Caddy配置目录
sudo mkdir -p /etc/caddy/conf.d

# 创建域名站点配置
sudo tee /etc/caddy/conf.d/jingtai.conf <<'EOF'
# 🎯 静态网站配置 - 带域名HTTPS
jingtai.meimolihan.eu.org:6663 {
    # 启用Gzip压缩
    encode gzip zstd
    
    # SSL证书配置(Caddy支持自动SSL)
    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
# 创建主Caddyfile
sudo tee /etc/caddy/Caddyfile <<'EOF'
# 全局配置
{
    # 管理接口(可选)
    admin off
    
    # 自动HTTPS
    auto_https disable_redirects
    
    # 日志
    log {
        level INFO
    }
}

# 导入各个站点配置
import conf.d/*.conf
EOF

# 格式化配置文件
sudo caddy fmt --overwrite /etc/caddy/Caddyfile

# 重新加载Caddy配置
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: #f0f4f8; }
        .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: #2c5282; }
        .info { background: #ebf8ff; padding: 15px; border-radius: 5px; margin: 15px 0; }
    </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 {
    # 启用Gzip压缩
    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'
# 站点1 - 主站点
site1.example.com {
    root * /var/www/site1
    file_server
    encode gzip
}

# 站点2 - 博客
blog.example.com {
    root * /var/www/blog
    file_server
    encode gzip
    
    # 重写规则
    try_files {path} /index.html
}

# 站点3 - API
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 {
    # 防止MIME类型混淆
    X-Content-Type-Options "nosniff"
    
    # 防止点击劫持
    X-Frame-Options "DENY"
    
    # XSS保护
    X-XSS-Protection "1; mode=block"
    
    # HSTS
    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
# IP访问限制
@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. 端口被占用

    1
    2
    3
    4
    5
    
    # 检查端口占用
    sudo netstat -tulnp | grep :6663
    
    # 终止占用进程
    sudo fuser -k 6663/tcp
    
  2. 权限问题

    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
    
    # 检查SELinux状态
    getenforce
    
    # 临时禁用SELinux(如需)
    sudo setenforce 0
    
  3. 配置错误

    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
# 查看Caddy日志
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
# 🚀 Caddy静态网站一键部署脚本

set -e

echo "开始部署静态网站..."

# 安装Caddy
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

# 创建Caddy配置
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
# 使用Caddy内置的自动SSL
# Caddy会自动处理证书的获取和续期

# 手动续期检查
sudo caddy renew

# 查看证书状态
sudo caddy validate

📊 监控状态

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 查看Caddy状态
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配置,并定期检查日志以确保服务稳定运行。

最后更新于 2025-09-28