作者选择了 自由和开源基金作为 写给捐款计划的一部分接受捐款。
介绍
例如,它可以从 Let's Encrypt自动获取和管理TLS证书,以启用HTTPS,并包括对HTTP/2的支持。
在本教程中,您将使用 xcaddy创建Caddy源,并使用它来托管使用HTTPS保护的网站。这包括编译,使用Caddyfile配置并安装插件。
前提条件
您可以通过遵循我们的 初始服务器设置指南 Ubuntu 18.04]来设置此服务器,具有根权利,并具有次要的非根帐户。 对于本教程,非根用户是 sammy
.
- 一个完全注册的域名。 本教程将使用
your_domain
指向您的服务器的公共 IP 地址。 您可以在 Namecheap上购买域名,在 Freenom上免费获得一个域名,或者使用您选择的域名注册商。 - 一个 DNS 记录与
your_domain
指向您的服务器的公共 IP 地址。 您可以遵循 [DigitalOcean DNS
步骤 1 - 建造卡迪
在此步骤中,您将从源头构建Caddy,并有能力稍后添加插件,而不会改变Caddy的源代码。
转到其 发布页面并复制linux_amd64
平台的最新版本的链接。下载前,通过运行以下命令导航到/tmp
:
1cd /tmp
然后,使用wget
下载最新版本:
1wget https://github.com/caddyserver/xcaddy/releases/download/v0.1.8/xcaddy_0.1.8_linux_amd64.tar.gz
一旦下载,只提取二进制:
1tar xvf xcaddy_0.1.8_linux_amd64.tar.gz xcaddy
最后,将xcaddy的可执行文件移动到/usr/bin
,使其在系统范围内可访问:
1sudo mv xcaddy /usr/bin
现在安装了xcaddy
,你将构建Caddy。 为此,创建一个单独的目录来存储它:
1mkdir ~/caddy
通过运行以下命令导航:
1cd ~/caddy
要构建最新版本的 Caddy,没有任何第三方插件,请运行以下命令:
1xcaddy build
此命令需要一段时间才能完成,其输出将类似于以下:
1[secondary_label Output]
22021/02/23 21:12:07 [INFO] Temporary folder: /tmp/buildenv_2021-02-23-2112.542119152
32021/02/23 21:12:07 [INFO] Writing main module: /tmp/buildenv_2021-02-23-2112.542119152/main.go
42021/02/23 21:12:07 [INFO] Initializing Go module
52021/02/23 21:12:07 [INFO] exec (timeout=10s): /usr/local/go/bin/go mod init caddy
6go: creating new go.mod: module caddy
7go: to add module requirements and sums:
8 go mod tidy
92021/02/23 21:12:07 [INFO] Pinning versions
102021/02/23 21:12:07 [INFO] exec (timeout=0s): /usr/local/go/bin/go get -d -v github.com/caddyserver/caddy/v2
11...
122021/02/23 21:12:34 [INFO] Build environment ready
132021/02/23 21:12:34 [INFO] Building Caddy
142021/02/23 21:12:34 [INFO] exec (timeout=0s): /usr/local/go/bin/go mod tidy
15...
162021/02/23 21:12:51 [INFO] exec (timeout=0s): /usr/local/go/bin/go build -o /home/sammy/caddy/caddy -ldflags -w -s -trimpath
172021/02/23 21:14:26 [INFO] Build complete: ./caddy
182021/02/23 21:14:26 [INFO] Cleaning up temporary folder: /tmp/buildenv_2021-02-23-2112.542119152
一旦完成,您将在当前文件夹中使用caddy
可执行,然后将其移动到/usr/bin
来安装:
1sudo mv caddy /usr/bin
您可以尝试运行caddy
来检查它是否正确安装:
1caddy version
输出将包含你刚刚编译的 Caddy 版本:
1[secondary_label Output]
2v2.3.0 h1:fnrqJLa3G5vfxcxmOH/+kJOcunPLhSBnjgIvjXV/QTA=
您现在已经建立并运行了 Caddy. 在下一步,您将安装 Caddy 作为一个服务,以便它在启动时自动启动,然后您将调整其所有权和权限设置,以确保服务器的安全性。
步骤 2 – 安装 Caddy
现在你已经验证了你能够构建和运行Caddy,现在是时候配置系统d服务,以便Caddy可以在系统启动时自动启动。
Caddy 需要自己的用户和组才能作为 systemd 服务运行. 首先,通过运行以下命令创建组:
1sudo groupadd --system caddy
然后,创建一个名为caddy
的新用户,属于caddy
组:
1sudo useradd --system \
2 --gid caddy \
3 --create-home \
4 --home-dir /var/lib/caddy \
5 --shell /usr/sbin/nologin \
6 --comment "Caddy web server" \
7 caddy
新的caddy
用户将有自己的家庭目录创建,无法登录为caddy
,因为其壳设置为nologin
。
将 Caddy 二进制的所有权转移到 root 用户:
1sudo chown root:root /usr/bin/caddy
然而,即使 root 用户拥有 Caddy,建议只使用系统上存在的其他非 root 帐户执行它,就像 systemd 服务一样。
接下来,将二进制文件的权限设置为755
,这会为该文件提供完整的阅读/写入/执行权限,而其他用户只能读取和执行:
1sudo chmod 755 /usr/bin/caddy
您现在已经完成了 Caddy 二进制的设置,并准备开始编写 Caddy 配置。
创建一个目录,在那里你将存储Caddy的配置文件,运行以下命令:
1sudo mkdir /etc/caddy
然后,为它设置正确的用户和组权限:
1sudo chown -R root:caddy /etc/caddy
将用户设置为 root 和组设置为 caddy 确保 Caddy 能够阅读和写入文件夹(通过 caddy 组),只有超级用户帐户才能拥有相同的读取和修改权限。
在稍后的一步中,您将从 Let's Encrypt 启用自动 TLS 证书提供,为此做好准备,创建一个目录来存储 Caddy 将获得的任何 TLS 证书,并给它与 `/etc/caddy’ 目录相同的所有权规则:
1sudo mkdir /etc/ssl/caddy
2sudo chown -R root:caddy /etc/ssl/caddy
Caddy 必须能够将证书写入该目录并从其中读取,以便加密请求. 因此,修改 /etc/ssl/caddy
目录的权限,以便它只能通过 root 和 caddy 访问:
1sudo chmod 0770 /etc/ssl/caddy
接下来,创建一个目录来存储 Caddy 将托管的文件:
1sudo mkdir /var/www
然后,将目录的所有者和组设置为 caddy:
1sudo chown caddy:caddy /var/www
Caddy 会从名为 Caddyfile
的文件中读取其配置,存储在 /etc/caddy
中。
1sudo touch /etc/caddy/Caddyfile
要安装 Caddy 服务,请从 Caddy GitHub 存储库下载 systemd 单元文件到 /etc/systemd/system
,运行:
1sudo sh -c 'curl https://raw.githubusercontent.com/caddyserver/dist/master/init/caddy.service > /etc/systemd/system/caddy.service'
更改服务文件的权限,以便它只能由其所有者修改, root:
1sudo chmod 644 /etc/systemd/system/caddy.service
然后,重新加载 systemd 来检测 Caddy 服务:
1sudo systemctl daemon-reload
检查 systemd 是否通过运行systemctl 状态
来检测到 Caddy 服务:
1sudo systemctl status caddy
你会看到类似的输出:
1[secondary_label Output]
2● caddy.service - Caddy
3 Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: enabled)
4 Active: inactive (dead)
5 Docs: https://caddyserver.com/docs/
如果您看到相同的输出,则新服务被 systemd 正确检测到。
作为初始服务器设置的前提条件的一部分,您启用了ufw
,不复杂的防火墙,并允许SSH连接。
1sudo ufw allow proto tcp from any to any port 80,443
产量将是:
1[secondary_label Output]
2Rule added
3Rule added (v6)
使用ufw状态
来检查您的更改是否奏效:
1sudo ufw status
您将看到以下输出:
1[secondary_label Output]
2Status: active
3
4To Action From
5-- ------ ----
6OpenSSH ALLOW Anywhere
780,443/tcp ALLOW Anywhere
8OpenSSH (v6) ALLOW Anywhere (v6)
980,443/tcp (v6) ALLOW Anywhere (v6)
您的 Caddy 安装现在已经完成,但它没有配置为任何服务. 在下一步,您将配置 Caddy 以从 /var/www
目录中服务的文件。
步骤 3 – 配置 Caddy
在本节中,您将写下从您的服务器服务静态文件的基本Caddy配置。
首先,在 /var/www
中创建一个基本的 HTML 文件,名为 index.html
:
1sudo nano /var/www/index.html
添加以下几行:
1[label /var/www/index.html]
2<!DOCTYPE html>
3<html>
4<head>
5<title>Hello from Caddy!</title>
6</head>
7<body>
8<h1 style="font-family: sans-serif">This page is being served via Caddy</h1>
9</body>
10</html>
当在 Web 浏览器中显示时,该文件会显示一个标题,上面写着 ** 此页面是通过 Caddy 服务的 **. 保存并关闭该文件。
打开您之前为编辑创建的Caddyfile
配置文件:
1sudo nano /etc/caddy/Caddyfile
添加以下几行:
1[label /etc/caddy/Caddyfile]
2http:// {
3 root * /var/www
4 encode gzip
5 file_server
6}
这是一个基本的Caddy配置,并声明,所有HTTP流量到您的服务器应该由文件(‘file_server’)从‘/var/www’(标记为‘root’)提供,并使用‘gzip’压缩以减少客户端页面加载时间。
完成后,保存并关闭文件。
Caddy 对于许多使用案例都有大量不同的指令,例如 php_fastcgi
指令可以帮助启用 PHP。
要测试一切是否正常运行,请启动 Caddy 服务:
1sudo systemctl start caddy
接下来,运行systemctl status
以查找有关Caddy服务的状态的信息:
1sudo systemctl status caddy
你会看到以下:
1[secondary_label Output]
2● caddy.service - Caddy
3 Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: enabled)
4 Active: active (running) since Tue 2020-12-08 11:19:47 UTC; 34s ago
5 Docs: https://caddyserver.com/docs/
6 Main PID: 4631 (caddy)
7 Tasks: 6 (limit: 1137)
8 Memory: 10.4M
9 CGroup: /system.slice/caddy.service
10 └─4631 /usr/bin/caddy run --environ --config /etc/caddy/Caddyfile
11
12Dec 08 11:19:47 ubuntu-s-1vcpu-1gb-fra1-01 caddy[4631]: USER=caddy
13Dec 08 11:19:47 ubuntu-s-1vcpu-1gb-fra1-01 caddy[4631]: INVOCATION_ID=45713fb36abe48ecaf4aa72a12542658
14Dec 08 11:19:47 ubuntu-s-1vcpu-1gb-fra1-01 caddy[4631]: JOURNAL_STREAM=9:33053
15Dec 08 11:19:47 ubuntu-s-1vcpu-1gb-fra1-01 caddy[4631]: {"level":"info","ts":1607426387.425965,"msg":"using provided configuration","config_file":"/etc/caddy/Caddyfile","config_adapter":""}
16Dec 08 11:19:47 ubuntu-s-1vcpu-1gb-fra1-01 caddy[4631]: {"level":"info","ts":1607426387.4281814,"logger":"admin","msg":"admin endpoint started","address":"tcp/localhost:2019","enforce_origin":false,"origins":["127.0.0.1:2019","localhost:2019","[::1]:2019"]}
17Dec 08 11:19:47 ubuntu-s-1vcpu-1gb-fra1-01 caddy[4631]: {"level":"info","ts":1607426387.4285417,"logger":"http","msg":"server is listening only on the HTTP port, so no automatic HTTPS will be applied to this server","server_name":"srv0","http_port":80}
18Dec 08 11:19:47 ubuntu-s-1vcpu-1gb-fra1-01 caddy[4631]: {"level":"info","ts":1607426387.430661,"msg":"autosaved config","file":"/var/lib/caddy/.config/caddy/autosave.json"}
19Dec 08 11:19:47 ubuntu-s-1vcpu-1gb-fra1-01 caddy[4631]: {"level":"info","ts":1607426387.430849,"msg":"serving initial configuration"}
20Dec 08 11:19:47 ubuntu-s-1vcpu-1gb-fra1-01 caddy[4631]: {"level":"info","ts":1607426387.4311824,"logger":"tls.cache.maintenance","msg":"started background certificate maintenance","cache":"0xc00021f0a0"}
21Dec 08 11:19:47 ubuntu-s-1vcpu-1gb-fra1-01 caddy[4631]: {"level":"info","ts":1607426387.4313655,"logger":"tls","msg":"cleaned up storage units"}
您现在可以在 Web 浏览器中浏览到您的服务器的 IP。
您现在已经配置了 Caddy 来从您的服务器服务静态文件. 在下一步,您将通过使用插件来扩展 Caddy 的功能。
步骤 4 – 使用 Let’s Encrypt 启用自动 TLS
插件提供了一种改变和扩展Caddy的行为的方式。一般来说,它们为您提供更多的配置指南,根据您的使用情况。在本节中,您将启用自动Let's Encrypt证书提供和更新,使用TXT DNS记录进行验证。 要使用TXT DNS记录进行验证,您将安装官方插件用于接口与DigitalOcean DNS API。
<$>[注] **注:**您可能会注意到我们在这个步骤中使用的官方插件被标记为已过期,这是因为它正在被基于 libdns的新型模块化库所取代。
然而,digitalocean图书馆目前处于开发状态,有一些问题已打开,直到这些问题得到解决,我们将使用以前的插件,尽管被标记为过时 <$>
要添加一个插件,您需要使用xcaddy
重新编译 Caddy,但要指定应该可用的插件存储库。
1xcaddy build --with github.com/caddy-dns/lego-deprecated
结果将类似于此:
1[secondary_label Output]
22021/02/23 21:18:46 [INFO] Temporary folder: /tmp/buildenv_2021-02-23-2118.769615504
32021/02/23 21:18:46 [INFO] Writing main module: /tmp/buildenv_2021-02-23-2118.769615504/main.go
42021/02/23 21:18:46 [INFO] Initializing Go module
52021/02/23 21:18:46 [INFO] exec (timeout=10s): /usr/local/go/bin/go mod init caddy
6go: creating new go.mod: module caddy
7go: to add module requirements and sums:
8 go mod tidy
92021/02/23 21:18:46 [INFO] Pinning versions
102021/02/23 21:18:46 [INFO] exec (timeout=0s): /usr/local/go/bin/go get -d -v github.com/caddyserver/caddy/v2
11go get: added github.com/caddyserver/caddy/v2 v2.3.0
122021/02/23 21:18:49 [INFO] exec (timeout=0s): /usr/local/go/bin/go get -d -v github.com/caddy-dns/lego-deprecated
13...
142021/02/23 21:19:17 [INFO] Build environment ready
152021/02/23 21:19:17 [INFO] Building Caddy
162021/02/23 21:19:17 [INFO] exec (timeout=0s): /usr/local/go/bin/go mod tidy
17...
182021/02/23 21:19:20 [INFO] exec (timeout=0s): /usr/local/go/bin/go build -o /home/sammy/caddy/caddy -ldflags -w -s -trimpath
192021/02/23 21:20:09 [INFO] Build complete: ./caddy
202021/02/23 21:20:09 [INFO] Cleaning up temporary folder: /tmp/buildenv_2021-02-23-2118.769615504
编译完成后,通过运行将结果的二进制移动到 `/usr/bin:
1sudo mv caddy /usr/bin
然后,设置适当的许可:
1sudo chown root:root /usr/bin/caddy
2sudo chmod 755 /usr/bin/caddy
接下来,您将配置Caddy以与DigitalOcean的API合作,以设置DNS记录。Caddy需要读取您的API代币作为环境变量来配置DigitalOcean的DNS,因此您将编辑其系统d单元文件:
1sudo nano /etc/systemd/system/caddy.service
在[服务]
部分中添加突出的行,以您的 API 代码代替your_token_here
:
1[label /etc/systemd/system/caddy.service]
2...
3[Service]
4User=caddy
5Group=caddy
6Environment=DO_AUTH_TOKEN=your_token_here
7ExecStart=/usr/bin/caddy run --environ --config /etc/caddy/Caddyfile
8ExecReload=/usr/bin/caddy reload --config /etc/caddy/Caddyfile
9TimeoutStopSec=5s
10LimitNOFILE=1048576
11LimitNPROC=512
12PrivateTmp=true
13ProtectSystem=full
14AmbientCapabilities=CAP_NET_BIND_SERVICE
15...
保存并关闭此文件,然后像之前一样重新加载 systemd daemon,以确保配置更新:
1sudo systemctl daemon-reload
运行systemctl重新启动
以检查您的配置更改是否正常:
1sudo systemctl restart caddy
然后,运行systemctl状态
,看看它是否正确运行:
1sudo systemctl status caddy
结果将看起来像:
1[secondary_label Output]
2● caddy.service - Caddy
3 Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: enabled)
4 Active: active (running) since Tue 2020-12-08 13:39:17 UTC; 1s ago
5 Docs: https://caddyserver.com/docs/
6 Main PID: 5440 (caddy)
7 Tasks: 5 (limit: 1137)
8 Memory: 9.8M
9 CGroup: /system.slice/caddy.service
10 └─5440 /usr/bin/caddy run --environ --config /etc/caddy/Caddyfile
11...
您需要对您的Caddyfile
做一些轻微的更改,所以打开它来编辑:
1sudo nano /etc/caddy/Caddyfile
将突出的行添加到Caddyfile
,确保将your_domain
替换为您的域名(而不是仅仅是http://
)并添加tls
块,指定DigitalOcean DNS应该使用:
1[label /etc/caddy/Caddyfile]
2your_domain {
3 root * /var/www
4 encode gzip
5 file_server
6
7 tls {
8 dns lego_deprecated digitalocean
9 }
10}
使用域名而不是仅仅是主机名称的协议指标将导致Caddy通过HTTPS服务请求. tls
指令配置Caddy使用TLS
时的行为,而dns
子指令规定Caddy应该使用DigitalOcean DNS系统,而不是HTTP。
有了这个,你的网站已经准备好部署了,用systemctl
重新启动Caddy,然后启用
它,这样它就可以启动:
1sudo systemctl restart caddy
2sudo systemctl enable caddy
如果您浏览到您的域,您将自动重定向到 HTTPS,显示相同的消息。
您的 Caddy 安装现在已完成和安全,您可以根据您的使用情况进一步定制。
结论
您现在已经在您的服务器上安装并配置了Caddy,在您想要的域中提供静态页面,安全使用免费的Let's Encrypt TLS证书。
例如,你可以使用 Atom feed for Caddy releases,或一个专用的服务,如 dependencies.io。
您可以浏览 Caddy 的文档以获取有关配置 Caddy 的更多信息。