Caddy 安装与 HTTPS 配置指南


目录

  1. 环境准备
  2. [下载安装 Caddy](#下载安装 Caddy)
  3. [生成自签名 SSL 证书](#生成自签名 SSL 证书)
  4. [编写 Caddyfile 配置](#编写 Caddyfile 配置)
  5. 准备网站根目录
  6. 启动与验证
  7. [配置 systemd 服务(开机自启)](#配置 systemd 服务(开机自启))
  8. 配置访问日志
  9. 常见问题排查
  10. [完整 Caddyfile 示例](#完整 Caddyfile 示例)

1. 环境准备

本文基于以下环境编写,请确认你的系统满足最低要求:

项目 要求
操作系统 主流 Linux 发行版
Caddy 版本 2.11.4(Linux amd64 架构)
所需工具 openssl、systemd
权限 root 或 sudo 权限

说明:Caddy 的最大优势在于自动管理 HTTPS 证书。如果你的服务器有公网域名,可以直接使用 Let's Encrypt 自动签发证书,无需手动生成。本指南同时涵盖内网自签名证书的方案。


2. 下载安装 Caddy

步骤 1:下载预编译二进制包

从 Caddy 官方 GitHub Releases 页面下载对应平台的压缩包。本文以 Linux amd64 为例:

bash 复制代码
wget https://github.com/caddyserver/caddy/releases/download/v2.11.4/caddy_2.11.4_linux_amd64.tar.gz

步骤 2:解压并安装到系统路径

bash 复制代码
tar zxvf caddy_2.11.4_linux_amd64.tar.gz
mv caddy /usr/local/bin/
chmod +x /usr/local/bin/caddy

步骤 3:清理安装包

bash 复制代码
rm -rf caddy_2.11.4_linux_amd64.tar.gz

步骤 4:验证安装

bash 复制代码
caddy version

输出 v2.11.4 表示安装成功。


3. 生成自签名 SSL 证书

如果你在内网环境、没有公网域名,或者需要快速搭建 HTTPS 测试环境,可以使用 openssl 生成自签名证书。

注意 :自签名证书会被浏览器标记为"不安全"。生产环境建议使用公网域名配合 Caddy 的自动 HTTPS 功能。请将下方命令中的 192.168.100.131 替换为你实际的服务器 IP 或域名。

步骤 1:创建证书存放目录

bash 复制代码
mkdir -p /etc/caddy/ssl

步骤 2:生成证书和私钥

bash 复制代码
openssl req -x509 -newkey rsa:2048 \
  -keyout /etc/caddy/ssl/key.pem \
  -out /etc/caddy/ssl/cert.pem \
  -days 3650 \
  -nodes \
  -subj "/CN=192.168.100.132"
  • -x509:生成自签名证书(非 CSR)
  • -newkey rsa:2048:同时生成 2048 位 RSA 私钥
  • -days 3650:有效期 10 年
  • -nodes:私钥不加密(Caddy 需要读取明文私钥)
  • -subj "/CN=IP":证书的通用名称,填写服务器 IP 或域名

4. 编写 Caddyfile 配置

Caddyfile 是 Caddy 的核心配置文件,语法简洁。以下提供一个支持 HTTPS 的静态网站配置示例。

步骤 1:编写 Caddyfile

bash 复制代码
vim /etc/caddy/Caddyfile

填入以下内容(将 192.168.100.131 替换为你的实际 IP 或域名):

caddy 复制代码
# /etc/caddy/Caddyfile

192.168.100.132 {
    root * /var/www/html

    file_server

    tls /etc/caddy/ssl/cert.pem /etc/caddy/ssl/key.pem

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

    header {
        X-Content-Type-Options "nosniff"
        X-Frame-Options "DENY"
        Strict-Transport-Security "max-age=31536000; includeSubDomains"
    }
}

关于证书的两条路径

  • 内网自签名 :使用上方配置中的 tls 指令手动指定证书路径。
  • 公网域名 :如果你的服务器有公网域名,只需将 192.168.100.131 替换为域名,并删除 tls ... 那行,Caddy 会自动通过 Let's Encrypt 签发和续期证书。

步骤 2:设置文件权限

bash 复制代码
# Caddyfile 归 root 所有,caddy 组可读
chown root:caddy /etc/caddy/Caddyfile
chmod 644 /etc/caddy/Caddyfile

# 证书目录权限
chown -R caddy:caddy /etc/caddy/ssl/
chmod 600 /etc/caddy/ssl/key.pem
chmod 644 /etc/caddy/ssl/cert.pem

步骤 4:验证配置语法

bash 复制代码
caddy validate --config /etc/caddy/Caddyfile

无报错输出即表示配置正确。


5. 准备网站根目录

步骤 1:创建根目录并写入测试页面

bash 复制代码
mkdir -p /var/www/html
vim /var/www/html/index.html

写入以下测试内容:

html 复制代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <title>Caddy HTTPS Test</title>
</head>
<body>
  <h1>Hello, Caddy! HTTPS is working.</h1>
  <p>This page is served over HTTPS.</p>
</body>
</html>

步骤 2:设置目录权限

Caddy 默认以 caddy 用户运行,需要确保该用户对网站目录有读取权限:

bash 复制代码
chown -R caddy:caddy /var/www/html/

6. 启动与验证

前台运行(测试用)

bash 复制代码
# 启动
caddy start --config /etc/caddy/Caddyfile

# 修改配置后热重载(无需停机)
caddy reload --config /etc/caddy/Caddyfile

# 停止
caddy stop

访问测试 :浏览器打开 https://192.168.100.131(请替换为你的实际地址)。如果是自签名证书,浏览器会提示安全警告,点击"高级"并选择继续访问即可。页面显示 "Hello, Caddy!" 说明 HTTPS 配置成功。

7. 配置 systemd 服务(开机自启)

在生产环境中,建议将 Caddy 注册为 systemd 服务,实现开机自启和进程守护。

前提 :请确保系统上已创建 caddy 用户。如果没有,执行 useradd -r -s /sbin/nologin caddy

步骤 1:创建 systemd 服务文件

bash 复制代码
vim /etc/systemd/system/caddy.service

写入以下内容:

ini 复制代码
[Unit]
Description=Caddy HTTP/2 Web Server
After=network-online.target
Wants=network-online.target

[Service]
Type=notify
User=caddy
Group=caddy
ExecStart=/usr/local/bin/caddy run --config /etc/caddy/Caddyfile
ExecReload=/usr/local/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

步骤 2:重载 systemd 并启动服务

bash 复制代码
# 重新加载 systemd 配置
systemctl daemon-reload

# 设置开机自启并立即启动
systemctl enable caddy
systemctl start caddy

步骤 3:管理服务

bash 复制代码
# 查看服务状态
systemctl status caddy

# 重启服务(修改配置后)
systemctl restart caddy

# 停止服务
systemctl stop caddy

# 查看日志
journalctl -u caddy -f

8. 常见问题排查

Caddy 启动失败

错误信息 原因与解决方法
permission denied 检查 caddy 用户对 /var/www/html//etc/caddy/ssl//var/log/caddy/ 的读取权限
address already in use 80 或 443 端口被占用,使用 `ss -tlnp
invalid config Caddyfile 语法错误,运行 caddy validate --config /etc/caddy/Caddyfile 查看详细提示
caddy.service: failed 确认 /etc/systemd/system/caddy.serviceExecStart 路径正确,执行 systemctl daemon-reload 后重试

证书相关

问题 解决方法
浏览器显示"不安全" 自签名证书的正常行为,点击"高级"继续访问即可。如需消除警告,请使用公网域名 + Let's Encrypt
证书续期 自签名证书无法自动续期,到期前需手动重新生成。Let's Encrypt 证书由 Caddy 自动续期
CN 与访问地址不匹配 确保 -subj "/CN=..." 中的值与浏览器地址栏输入的 IP 或域名完全一致