本目录包含用于通过 systemd 管理 Caddy 的服务配置文件。
标准的 systemd 服务配置,使用固定路径。
包含额外的安全限制和环境变量支持,推荐用于生产环境。
sudo groupadd --system caddy
sudo useradd --system \
--gid caddy \
--create-home \
--home-dir /var/lib/caddy \
--shell /usr/sbin/nologin \
--comment "Caddy web server" \
caddy
sudo mkdir -p /etc/caddy
sudo mkdir -p /var/lib/caddy
sudo mkdir -p /var/log/caddy
sudo chown -R caddy:caddy /var/lib/caddy
sudo chown -R caddy:caddy /var/log/caddy
sudo chown -R caddy:caddy /etc/caddy
# 1. 复制 Caddy 可执行文件
sudo cp ./caddy /usr/local/bin/caddy
sudo chmod +x /usr/local/bin/caddy
# 2. 为 Caddy 设置网络绑定权限(允许监听 80/443 端口)
sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/caddy
# 3. 使用 CaddyHelper 生成配置
# (在你的工作目录下运行 CaddyHelper 命令)
CaddyHelper site static --domain example.com --root /var/www/html
CaddyHelper dns cloudflare --domain example.com --api-token YOUR_TOKEN
# 4. 复制生成的 Caddyfile 到系统目录
sudo cp Caddyfile /etc/caddy/Caddyfile
sudo chown caddy:caddy /etc/caddy/Caddyfile
# 5. 安装 systemd 服务
sudo cp systemd/caddy.service /etc/systemd/system/
sudo systemctl daemon-reload
# 6. 启用并启动服务
sudo systemctl enable caddy
sudo systemctl start caddy
# 7. 查看状态
sudo systemctl status caddy
# 前 4 步与方法一相同
# 5. 自定义配置路径(可选)
# 编辑 /etc/systemd/system/caddy.service.d/override.conf
sudo mkdir -p /etc/systemd/system/caddy.service.d
sudo tee /etc/systemd/system/caddy.service.d/override.conf > /dev/null <<EOF
[Service]
Environment="CADDY_BIN=/usr/local/bin/caddy"
Environment="CADDYFILE=/etc/caddy/Caddyfile"
EOF
# 6. 安装安全加固服务
sudo cp systemd/caddy-secure.service /etc/systemd/system/caddy.service
sudo systemctl daemon-reload
# 7. 启用并启动
sudo systemctl enable caddy
sudo systemctl start caddy
# 启动服务
sudo systemctl start caddy
# 停止服务
sudo systemctl stop caddy
# 重启服务
sudo systemctl restart caddy
# 重载配置(无需中断服务)
sudo systemctl reload caddy
# 查看状态
sudo systemctl status caddy
# 查看日志
sudo journalctl -u caddy -f
# 查看最近的错误
sudo journalctl -u caddy -p err
# 开机自启
sudo systemctl enable caddy
# 禁用开机自启
sudo systemctl disable caddy
使用 systemd 管理 Caddy 后,推荐的配置更新流程:
# 1. 在工作目录使用 CaddyHelper 修改配置
cd ~/caddy-config
CaddyHelper site proxy --domain api.example.com --upstream 127.0.0.1:8080
# 2. 验证生成的配置
CaddyHelper validate
# 3. 复制到系统目录
sudo cp Caddyfile /etc/caddy/Caddyfile
# 4. 重载 Caddy(平滑更新,零停机)
sudo systemctl reload caddy
# 5. 检查状态
sudo systemctl status caddy
| 特性 | CaddyHelper (start/stop) | systemd |
|---|---|---|
| 适用场景 | 开发、测试 | 生产环境 |
| 进程管理 | 手动 | 自动(守护进程) |
| 开机自启 | 不支持 | 支持 |
| 日志管理 | 文件 | journald |
| 监控重启 | 不支持 | 支持 |
| 权限管理 | 当前用户 | 专用用户 |
开发环境:使用 CaddyHelper start/stop
# 快速启动测试
CaddyHelper site static --domain localhost --root ./public
CaddyHelper start
# 修改配置后重启
CaddyHelper stop
CaddyHelper start
生产环境:使用 systemd
# 配置生成
CaddyHelper site proxy --domain api.example.com --upstream 10.0.1.10:8080
sudo cp Caddyfile /etc/caddy/Caddyfile
# 服务管理
sudo systemctl start caddy
sudo systemctl enable caddy
# 查看详细错误信息
sudo systemctl status caddy -l
# 查看完整日志
sudo journalctl -u caddy -xe
# 手动测试 Caddy
sudo -u caddy /usr/local/bin/caddy run --config /etc/caddy/Caddyfile
# 检查文件权限
ls -la /etc/caddy/Caddyfile
ls -la /var/lib/caddy
ls -la /var/log/caddy
# 修复权限
sudo chown -R caddy:caddy /var/lib/caddy
sudo chown -R caddy:caddy /var/log/caddy
sudo chown caddy:caddy /etc/caddy/Caddyfile
# 检查 capabilities
getcap /usr/local/bin/caddy
# 应该显示:cap_net_bind_service=ep
# 检查端口占用
sudo ss -tlnp | grep :80
sudo ss -tlnp | grep :443
# 如果有其他服务占用,需要停止
sudo systemctl stop apache2 # 或 nginx
# 使用 CaddyHelper 验证
CaddyHelper validate --config /etc/caddy/Caddyfile
# 或直接使用 Caddy
sudo -u caddy /usr/local/bin/caddy validate --config /etc/caddy/Caddyfile
最小权限原则:
caddy 用户运行服务文件权限:
sudo chmod 640 /etc/caddy/Caddyfile
sudo chmod 750 /var/lib/caddy
敏感信息:
日志轮转(可选):
sudo tee /etc/logrotate.d/caddy > /dev/null <<EOF
/var/log/caddy/*.log {
daily
rotate 14
compress
delaycompress
notifempty
missingok
postrotate
systemctl reload caddy > /dev/null 2>&1 || true
endscript
}
EOF
创建环境文件 /etc/caddy/caddy.env:
# Cloudflare API Token
CF_API_TOKEN=your_cloudflare_token
# AliDNS credentials
ALIYUN_ACCESS_KEY_ID=your_access_key
ALIYUN_ACCESS_KEY_SECRET=your_secret
修改服务配置使用环境文件:
sudo tee /etc/systemd/system/caddy.service.d/env.conf > /dev/null <<EOF
[Service]
EnvironmentFile=/etc/caddy/caddy.env
EOF
sudo chmod 600 /etc/caddy/caddy.env
sudo chown root:root /etc/caddy/caddy.env
sudo systemctl daemon-reload
如果需要运行多个 Caddy 实例:
# 复制并重命名服务文件
sudo cp /etc/systemd/system/caddy.service /etc/systemd/system/caddy@.service
# 编辑配置,使用实例名
sudo nano /etc/systemd/system/caddy@.service
# 修改:
# Environment="CADDYFILE=/etc/caddy/Caddyfile.%i"
# 创建不同的配置文件
sudo cp /etc/caddy/Caddyfile /etc/caddy/Caddyfile.instance1
sudo cp /etc/caddy/Caddyfile /etc/caddy/Caddyfile.instance2
# 启动不同实例
sudo systemctl start caddy@instance1
sudo systemctl start caddy@instance2