如何在 Ubuntu 18.04 上使用 Caddy 托管网站

作者选择了 自由和开源基金作为 写给捐款计划的一部分接受捐款。

介绍

例如,它可以从 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 目录的权限,以便它只能通过 rootcaddy 访问:

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。

Message from Caddy

您现在已经配置了 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 的更多信息。

Published At
Categories with 技术
comments powered by Disqus