目录
- 环境准备
- [下载安装 Caddy](#下载安装 Caddy)
- [生成自签名 SSL 证书](#生成自签名 SSL 证书)
- [编写 Caddyfile 配置](#编写 Caddyfile 配置)
- 准备网站根目录
- 启动与验证
- [配置 systemd 服务(开机自启)](#配置 systemd 服务(开机自启))
- 配置访问日志
- 常见问题排查
- [完整 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.service 中 ExecStart 路径正确,执行 systemctl daemon-reload 后重试 |
证书相关
| 问题 | 解决方法 |
|---|---|
| 浏览器显示"不安全" | 自签名证书的正常行为,点击"高级"继续访问即可。如需消除警告,请使用公网域名 + Let's Encrypt |
| 证书续期 | 自签名证书无法自动续期,到期前需手动重新生成。Let's Encrypt 证书由 Caddy 自动续期 |
| CN 与访问地址不匹配 | 确保 -subj "/CN=..." 中的值与浏览器地址栏输入的 IP 或域名完全一致 |