在Ubuntu VPS上安装Caddy Web服务器并自动启用HTTPS

Caddy是什么,为何比Nginx/Apache更简便

Caddy是一款以Go语言编写的现代Web服务器,将简洁性作为首要设计原则。其核心特性是通过Let's Encrypt和ZeroSSL实现自动SSL证书申请——无需安装Certbot、无需配置计划任务、无需手动续期,Caddy在后台静默完成这一切。

配置Nginx的HTTPS需要多个步骤:安装Certbot、运行certbot --nginx、用计划任务验证续期,以及分别维护HTTP和HTTPS的服务器块。Caddy将这一切压缩成一个人类可读的配置文件——Caddyfile。一个完整的HTTPS站点不超过五行即可完成配置。

安装前的准备条件

在VPS上安装Caddy前,请确认以下条件已满足:

最后一点至关重要:若Let's Encrypt无法通过80端口访问你的服务器,Caddy将无法签发SSL证书。若DNS尚未完全生效,或80端口已被其他服务占用,ACME验证将失败。

通过官方APT软件仓库在Ubuntu上安装Caddy

Caddy在Debian/Ubuntu上推荐通过官方APT软件仓库安装,这样可在新版本发布时自动获得更新。按顺序执行以下命令:

# 1. 安装必要依赖
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl

# 2. 添加Caddy的GPG签名密钥
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' \
  | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg

# 3. 添加Caddy的APT软件仓库
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' \
  | sudo tee /etc/apt/sources.list.d/caddy-stable.list

# 4. 更新并安装Caddy
sudo apt update
sudo apt install caddy

安装完成后,Caddy将自动注册为systemd服务。运行以下命令验证其是否正常运行:

sudo systemctl status caddy

Caddyfile基本结构

Caddy的配置文件Caddyfile默认位于/etc/caddy/Caddyfile。其结构基于块:每个域名拥有自己的块,其中包含各项指令。以下是一个最简示例:

# /etc/caddy/Caddyfile

# 为静态站点启用自动HTTPS
example.com {
    root * /var/www/html
    file_server
}

# 将www重定向至非www
www.example.com {
    redir https://example.com{uri} permanent
}

仅此而已。Caddy将自动为example.com申请SSL证书、配置TLS,并将所有HTTP流量重定向至HTTPS。无需像Nginx那样单独设置listen 80和listen 443块。

Caddyfile示例:静态站点与反向代理

带压缩和日志的静态网站

# /etc/caddy/Caddyfile

mywebsite.com {
    root * /var/www/mywebsite
    file_server
    encode gzip
    log {
        output file /var/log/caddy/mywebsite.log
    }
}

反向代理至Node.js应用(端口3000)

app.mywebsite.com {
    reverse_proxy localhost:3000
}

反向代理至PHP-FPM

php.mywebsite.com {
    root * /var/www/phpapp
    php_fastcgi unix//run/php/php8.2-fpm.sock
    file_server
}

反向代理至Python/Flask应用(端口5000)

api.mywebsite.com {
    reverse_proxy localhost:5000 {
        header_up Host {host}
        header_up X-Real-IP {remote}
    }
}

通过在单个Caddyfile中叠加多个块,即可为多个域名提供服务。Caddy会自动为每个域名单独申请SSL证书,使在单台VPS上托管多个应用变得轻而易举。

Caddy vs Nginx vs Apache:对比一览

选择Web服务器需要在配置便捷性、原始性能和生态成熟度之间权衡。下表总结了三者的主要差异:

功能 Caddy Nginx Apache
自动SSL 内置 需要Certbot 需要Certbot
配置复杂度 非常简单 中等 中等至复杂
HTTP/3 (QUIC) 内置 需额外配置 需额外模块
原始性能 良好 优秀 良好
插件生态 有限 丰富 最广泛
新手友好度 最佳 中等 中等

总结:若希望以最少的配置立即启用HTTPS,选Caddy;若团队熟悉服务器管理且对原始吞吐量有要求,选Nginx;若需要最广泛的兼容性或大量依赖.htaccess规则,选Apache。

高级Caddyfile配置:安全响应头、身份验证与日志

除提供文件服务和流量代理外,Caddy还内置了安全加固和可观测性指令,无需额外模块。

添加安全响应头

mywebsite.com {
    root * /var/www/mywebsite
    file_server
    header {
        # 防止点击劫持
        X-Frame-Options "SAMEORIGIN"
        # 强制HTTPS一年
        Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
        # 禁止MIME类型嗅探
        X-Content-Type-Options "nosniff"
        # 隐藏服务器指纹
        -Server
    }
}

用基础认证保护管理后台

首先使用caddy hash-password生成bcrypt密码哈希,然后在Caddyfile中引用:

admin.mywebsite.com {
    reverse_proxy localhost:8080
    basicauth {
        # 用户名: admin,哈希由 caddy hash-password 生成
        admin JDJhJDEyJGF....(hash)
    }
}

生产环境的结构化JSON日志

{
    log {
        format json
        output file /var/log/caddy/access.log {
            roll_size 100mb
            roll_keep 5
        }
    }
}

mywebsite.com {
    root * /var/www/mywebsite
    file_server
}

全局块(位于所有站点块之前的大括号)对Caddyfile中的所有站点生效。roll_size和roll_keep选项会自动轮转日志,防止生产环境磁盘耗尽。

监控Caddy并诊断常见问题

在生产环境中维护Caddy需要定期检查证书状态,并理解出错时的日志输出。

检查证书状态

# 列出Caddy管理的所有证书
sudo caddy list-certificates

# 应用变更前验证Caddyfile语法
sudo caddy validate --config /etc/caddy/Caddyfile

关键诊断命令

手动强制续期证书

# 停止Caddy释放80端口,然后强制续期
sudo systemctl stop caddy
sudo caddy run --config /etc/caddy/Caddyfile &
# Caddy启动时将尝试续期所有证书
# 之后恢复正常服务模式
sudo systemctl start caddy

由于Caddy会在到期前30天自动续期,手动续期极少需要。上述步骤适用于证书已过期且因长时间服务中断导致自动续期被打断的情况。

通过systemctl管理Caddy

由于Caddy作为systemd服务运行,所有管理操作均通过标准systemctl命令完成:

# 启动Caddy
sudo systemctl start caddy

# 停止Caddy
sudo systemctl stop caddy

# 编辑Caddyfile后重载配置(无需重启)
sudo systemctl reload caddy

# 查看服务状态和近期日志
sudo systemctl status caddy

# 实时流式查看日志
sudo journalctl -u caddy -f

# 设置Caddy随服务器重启自动启动
sudo systemctl enable caddy

编辑Caddyfile后最常用的命令是sudo systemctl reload caddy。与完全重启不同,重载会优雅地应用新配置,不会中断现有连接,可在生产环境中安全使用。

重要提示:SSL签发前域名必须解析至VPS

Caddy的自动HTTPS依赖ACME HTTP-01验证,需要Let's Encrypt向服务器的80端口发起HTTP请求。在以下任何情况下,SSL签发都将失败:

若遇到ACME相关错误,请使用sudo journalctl -u caddy -n 50检查Caddy日志以定位根本原因,修复后重载Caddy重新申请证书。

核心优势:Caddy每60天自动续期SSL证书,无需计划任务、无需Certbot命令、无需人工干预。只要Caddy服务正常运行且域名可访问,证书将在到期前自动续期——消除了最常见的HTTPS意外中断来源之一。

在AsiaGB VPS上部署Caddy

AsiaGB VPS套餐起价500泰铢/月,配备专用公网IP、支持Ubuntu,并开放80/443端口——一切就绪,让你立即通过HTTPS运行Caddy并对外提供服务。

查看VPS套餐