caddy保持运行

虽然可以直接通过命令行界面运行 Caddy,但使用服务管理器来保持其运行有许多好处,例如确保系统重启时自动启动以及捕获 stdout/stderr 日志。

  • Linux 服务

  • 环境变量

  • run
     和 reload
     覆盖

  • 崩溃时重启

  • 单元文件

  • 手动安装

  • 使用服务

  • 本地 HTTPS

  • 覆盖

  • SELinux 考虑事项

  • Windows 服务

  • sc.exe

  • WinSW

  • Docker Compose

  • 设置

  • 使用

  • 本地 HTTPS

Linux 服务

在带有 systemd 的 Linux 发行版上运行 Caddy 的推荐方式是使用我们提供的官方 systemd 单元文件。

单元文件

我们提供了两种不同的 systemd 单元文件,你可以根据你的使用场景选择:

  • caddy.service
    :如果你使用 Caddyfile 配置 Caddy。如果你更喜欢使用其他配置适配器或 JSON 配置文件,你可以覆盖 ExecStart
     和 ExecReload
     命令。

  • caddy-api.service
    :如果你仅通过 Caddy 的 API 配置 Caddy。此服务使用 --resume
     选项,将通过默认持久化的 autosave.json
     启动 Caddy。

它们非常相似,但 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/

1
2
  
测试是否成功:

caddy version

1
2
3
  
创建一个名为 caddy
 的组:

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

1
2
  
验证服务是否运行:

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

1
2
  
你可以通过以下命令停止服务:

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


### 本地 HTTPS 与 systemd

当你使用 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 考虑事项  

在启用了 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

  
  

![江达小记](/images/wechatmpscan.png)