虽然可以直接通过命令行界面运行 Caddy,但使用服务管理器来保持其运行有许多好处,例如确保系统重启时自动启动以及捕获 stdout/stderr 日志。
-
Linux 服务
-
环境变量
-
run
和 reload
覆盖
-
崩溃时重启
-
单元文件
-
手动安装
-
使用服务
-
本地 HTTPS
-
覆盖
-
SELinux 考虑事项
-
Windows 服务
-
sc.exe
-
WinSW
-
Docker Compose
-
设置
-
使用
-
本地 HTTPS
Linux 服务
在带有 systemd 的 Linux 发行版上运行 Caddy 的推荐方式是使用我们提供的官方 systemd 单元文件。
单元文件
我们提供了两种不同的 systemd 单元文件,你可以根据你的使用场景选择:
它们非常相似,但 ExecStart
和 ExecReload
命令有所不同,以适应不同的工作流程。
如果你需要在服务之间切换,你应该先禁用并停止之前的服务,然后再启用并启动另一个服务。例如,从 caddy
服务切换到 caddy-api
服务:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| sudo systemctl disable --now caddy sudo systemctl enable --now caddy-api
```
某些安装方法会自动设置 Caddy 以服务形式运行。如果你选择的安装方法没有这样做,你可以按照以下说明进行操作: **要求:** - 你下载或从源代码构建的 caddy 二进制文件 - systemctl --version 232 或更高版本 - sudo 权限 将 caddy 二进制文件移动到你的 $PATH 中,例如:
|
sudo mv caddy /usr/bin/
caddy version
sudo groupadd --system caddy
1 2 3
| 创建一个名为 caddy 的用户,并为其分配一个可写的家目录:
|
sudo useradd --system
--gid caddy
--create-home
--home-dir /var/lib/caddy
--shell /usr/sbin/nologin
--comment “Caddy web server”
caddy
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| 如果你使用配置文件,请确保刚刚创建的 caddy 用户可以读取该文件。 接下来,根据你的使用场景选择一个 systemd 单元文件。 **仔细检查 ExecStart 和 ExecReload 指令。** 确保二进制文件的位置和命令行参数与你的安装一致!例如:如果你使用配置文件,请根据实际情况更改 --config 的路径(默认路径为 /etc/caddy/Caddyfile )。 通常将服务文件保存在 /etc/systemd/system/caddy.service 。 保存服务文件后,你可以通过以下命令首次启动服务:
|
sudo systemctl daemon-reload
sudo systemctl enable --now caddy
systemctl status caddy
1 2 3 4 5 6 7
| 现在,你已经准备好使用该服务了! ### 使用服务 如果你使用 Caddyfile,可以通过 nano 、vi 或你偏好的编辑器编辑配置:
|
sudo nano /etc/caddy/Caddyfile
1 2 3 4 5 6 7
| 你可以将静态网站文件放在 /var/www/html 或 /srv 中。确保 caddy 用户有权限读取这些文件。 要验证服务是否运行:
|
systemctl status caddy
1 2 3 4 5 6
| status 命令还会显示当前运行的服务文件的位置。 当使用我们的官方服务文件时,Caddy 的输出将被重定向到 journalctl 。要查看完整的日志并避免行被截断,请运行以下命令:
|
journalctl -u caddy --no-pager | less +G
1 2
| 如果你使用配置文件,在进行任何更改后可以优雅地重新加载 Caddy:
|
sudo systemctl reload caddy
sudo systemctl stop 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
| Caddy 进程将作为 caddy 用户运行,其 $HOME 设置为 /var/lib/caddy 。这意味着: - 默认数据存储位置(用于证书和其他状态信息)将位于 /var/lib/caddy/.local/share/caddy 。 - 默认配置存储位置(用于自动保存的 JSON 配置,主要用于 caddy-api 服务)将位于 /var/lib/caddy/.config/caddy 。
当你使用 Caddy 进行本地开发并使用 HTTPS 时,你可能会使用类似 localhost 或 app.localhost 的主机名。这将启用 Caddy 的本地 CA 来签发证书。 由于 Caddy 作为服务运行时以 caddy 用户身份运行,它将没有权限将根 CA 证书安装到系统信任存储中。为此,请运行 sudo caddy trust 来执行安装。 如果你希望其他设备能够连接到使用 internal 颁发者的服务器,你还需要在这些设备上安装根 CA 证书。你可以在 /var/lib/caddy/.local/share/caddy/pki/authorities/local/root.crt 找到根 CA 证书。许多现代网络浏览器使用自己的信任存储(忽略系统的信任存储),因此你可能还需要手动将证书安装到浏览器中。
覆盖服务文件的最好方式是使用以下命令:
|
sudo systemctl edit caddy
1 2 3 4 5
| 这将打开一个空白文件,使用你的默认终端文本编辑器,你可以在此文件中覆盖或添加单元定义的指令。这被称为“drop-in”文件。 #### 环境变量 如果你需要为配置定义环境变量,可以这样做:
|
[Service]
Environment=“CF_API_TOKEN=super-secret-cloudflare-tokenvalue”
1 2 3
| 同样,如果你更喜欢维护一个单独的文件来管理环境变量(envfile),你可以使用 EnvironmentFile 指令,如下所示:
|
[Service]
EnvironmentFile=/etc/caddy/.env
1 2 3 4
| 然后,你的 /etc/caddy/.env 文件可能如下所示(不要在值周围使用 " 引号):
|
CF_API_TOKEN=super-secret-cloudflare-tokenvalue
1 2 3 4
| #### run 和 reload 覆盖 如果你需要将配置文件从默认的 Caddyfile 更改为使用 JSON 文件(注意 Exec* 指令必须先用空字符串重置,然后才能设置新值):
|
[Service]
ExecStart=
ExecStart=/usr/bin/caddy run --environ --config /etc/caddy/caddy.json
ExecReload=
ExecReload=/usr/bin/caddy reload --config /etc/caddy/caddy.json
1 2 3
| #### 崩溃时重启 如果你希望 Caddy 在意外崩溃后 5 秒内自动重启:
|
[Service]
自动重启 Caddy,除非退出代码为 1
RestartPreventExitStatus=1
Restart=on-failure
RestartSec=5s
1 2
| 然后,保存文件并退出文本编辑器,然后重启服务以使更改生效:
|
sudo systemctl restart caddy
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 在启用了 SELinux 的系统上,你有两种选择: 1. 使用 COPR 仓库安装 Caddy。你的 systemd 文件和 caddy 二进制文件将已经被正确创建和标记(因此你可以忽略本节)。如果你希望使用 Caddy 的自定义构建版本,你需要按照以下说明对可执行文件进行标记。 1. 从我们的网站下载 Caddy,或者使用 xcaddy 编译它。在这两种情况下,你需要自己标记文件。 systemd 单元文件及其可执行文件必须分别标记为 systemd_unit_file_t 和 bin_t 才能运行。 systemd_unit_file_t 标签会自动应用于在 /etc/systemd/... 中创建的文件,因此请确保按照手动安装说明在该位置创建你的 caddy.service 文件。 要标记 caddy 二进制文件,可以使用以下命令:
|
semanage fcontext -a -t bin_t /usr/bin/caddy && restorecon -Rv /usr/bin/caddy
1 2 3 4 5 6
| ## Windows 服务 在 Windows 上,有两种方法可以将 Caddy 作为服务运行:sc.exe 或 WinSW。 ### sc.exe 要创建服务,请运行以下命令:
|
sc.exe create caddy start= auto binPath= "YOURPATH
