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

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

介绍

例如,它可以从 Let's Encrypt自动获取和管理TLS证书,以启用HTTPS,并包括对HTTP/2的支持。

在本教程中,您将使用 xcaddy创建Caddy源,并使用它来托管使用HTTPS保护的网站。这包括编译,使用Caddyfile配置并安装插件。

前提条件

*一个有根权限的Ubuntu 22.04服务器,至少有2GB RAM和一个二级,非根账户. 您可以遵循我们的 [Ubuntu 22.04] (https://andsky.com/tech/tutorials/initial-server-setup-with-ubuntu-22-04) 初始服务器设置指南来设置此功能 。 对于此教程,非根端用户是安装在您的服务器上的'Sammy'. *' The [Go language (https://golang.org/)工具链. 在How To Install Go on Ubuntu 20.04中跟随步骤1和2来设置最新的Go版本(Caddy需要Go版本17或更高).

  • A全注册域名. 此教程将始终使用 您的域 。 您可以在 [Namecheap] (https://www.namecheap.com/) 上购买域名, 在 [Freenom] (https://www.freenom.com/en/index.html?lang=en 上免费获取域名, 或者使用您选择的域名注册员 。
  • A DNS 记录, 并带有 你的_domain' 指向您的服务器的公共IP地址和 CNAME DNS 记录, 并带有 www.your_domain'指向 。 您可以跟随[此介绍到 DigitalOcean DNS (https://www.digitalocean.com/docs/networking/dns/quickstart/), 了解如何添加它们的细节.
  • 个人访问令牌(API key), 并附带您的 DigitalOcean 账户的读写权限. 访问 如何创建个人访问token创建一.

步骤 1 - 建造卡迪

在此步骤中,您将从源头构建Caddy,并有能力稍后添加插件,而不会改变Caddy的源代码。

请访问 xcaddy 发布页面并复制为 linux_amd64 平台的最新版本的链接。

1cd /tmp

然后,使用wget下载最新版本:

1wget https://github.com/caddyserver/xcaddy/releases/download/v0.3.1/xcaddy_0.3.1_linux_amd64.tar.gz

一旦下载,只提取二进制:

1tar xvf xcaddy_0.3.1_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]
 22022/08/10 15:55:18 [INFO] Temporary folder: /tmp/buildenv_2022-08-10-1555.834895411
 32022/08/10 15:55:18 [INFO] Writing main module: /tmp/buildenv_2022-08-10-1555.834895411/main.go
 4package main
 5
 6import (
 7        caddycmd "github.com/caddyserver/caddy/v2/cmd"
 8
 9        // plug in Caddy modules here
10        _ "github.com/caddyserver/caddy/v2/modules/standard"
11)
12
13func main() {
14        caddycmd.Main()
15}
162022/08/10 15:55:18 [INFO] Initializing Go module
172022/08/10 15:55:18 [INFO] exec (timeout=10s): /usr/local/go/bin/go mod init caddy
18go: creating new go.mod: module caddy
19go: to add module requirements and sums:
20        go mod tidy
212022/08/10 15:55:18 [INFO] Pinning versions
222022/08/10 15:55:18 [INFO] exec (timeout=0s): /usr/local/go/bin/go get -d -v github.com/caddyserver/caddy/v2
23go: downloading github.com/caddyserver/caddy v1.0.5
24...
252022/08/10 15:55:49 [INFO] Build environment ready
262022/08/10 15:55:49 [INFO] Building Caddy
272022/08/10 15:55:49 [INFO] exec (timeout=0s): /usr/local/go/bin/go mod tidy
28...
292022/08/10 15:55:57 [INFO] exec (timeout=0s): /usr/local/go/bin/go build -o /home/sammy/caddy/caddy -ldflags -w -s -trimpath
302022/08/10 15:58:48 [INFO] Build complete: ./caddy
312022/08/10 15:58:48 [INFO] Cleaning up temporary folder: /tmp/buildenv_2022-08-10-1555.834895411

一旦完成,你将有caddy可用在当前文件夹中。 将其移动到/usr/bin来安装它:

1sudo mv caddy /usr/bin

您可以尝试运行caddy来检查它是否正确安装:

1caddy version

输出将包含你刚刚编译的 Caddy 版本:

1[secondary_label Output]
2v2.6.1 h1:EDqo59TyYWhXQnfde93Mmv4FJfYe00dO60zMiEt+pzo=

您现在已经建立并运行了 Caddy. 在下一步,您将安装 Caddy 作为服务,以便它在启动时自动启动,然后您将调整所有权和权限设置以确保服务器的安全性。

步骤 2 – 安装 Caddy

现在你已经验证了你能够构建和运行Caddy,你可以配置一个systemd服务,以便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用户将创建自己的家庭目录,因为其壳设置为nologin,因此无法登录为caddy

将Caddy二进制的所有权更改为用户:

1sudo chown root:root /usr/bin/caddy

然而,虽然用户将拥有Caddy,但建议您使用系统上存在的其他非根帐户执行它,就像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 服务,请从 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'

你会得到这样的答案:

 1[secondary_label Output]
 2 % Total    % Received % Xferd Average Speed Time Time Time Current
 3                                 Dload Upload Total Spent Left Speed
 4100 1030 100 1030 0 0 4698 0 --:--:-- --:--:-- --:--:--  4703
 5```
 6
 7Modify the service file's permissions so it can only be modified by its owner, `root`:
 8
 9​```command
10sudo chmod 644 /etc/systemd/system/caddy.service

然后,重新加载systemd来检测Caddy服务:

1sudo systemctl daemon-reload

检查systemd是否通过运行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: inactive (dead)
5       Docs: https://caddyserver.com/docs/

如果你有相同的输出,那么新的服务被systemd检测到。

作为初始服务器设置的一部分,您启用了ufw,并允许 SSH 连接. 为了让 Caddy 从您的服务器上服务 HTTP 和 HTTPS 流量,您需要通过运行以下命令来允许它们进入ufw:

1sudo ufw allow proto tcp from any to any port 80,443

产量将是:

1[secondary_label Output]
2Rule added
3Rule added (v6)

使用ufw status来验证您的更改:

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配置。

创建一个名为 index.html 的基本 HTML 文件在 /var/www 中:

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 服务的 **. 保存并关闭该文件。

Caddy 會從名為「Caddyfile」的檔案讀取其配置,儲存在「/etc/caddy」下。

1sudo nano /etc/caddy/Caddyfile

添加以下几行:

1[label /etc/caddy/Caddyfile]
2http:// {
3    root * /var/www
4    encode gzip
5    file_server
6}

这个基本的 Caddy 配置声明,所有的 HTTP 流量到您的服务器应该由 /var/www(标记为 root)的文件( file_server)提供,并使用 gzip 压缩以减少客户端页面加载时间。

例如, log 指令可用于记录发生的所有 HTTP 请求,您可以在 官方指令文档页面查看更多选项。

完成后,保存并关闭文件。

要测试一切是否正常运行,请启动 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 Wed 2022-08-10 15:02:41 UTC; 2s ago
 5       Docs: https://caddyserver.com/docs/
 6   Main PID: 5443 (caddy)
 7      Tasks: 7 (limit: 1119)
 8     Memory: 7.5M
 9        CPU: 30ms
10     CGroup: /system.slice/caddy.service
11             └─5443 /usr/bin/caddy run --environ --config /etc/caddy/Caddyfile

您现在可以在 Web 浏览器中访问您的服务器的 IP。

"This page is being served via Caddy" message that displays when visiting your server's IP in a web browser

您现在已经配置了 Caddy 来从您的服务器服务静态文件. 在下一步,您将通过插件扩展 Caddy 的功能。

步骤 4 – 使用 Let’s Encrypt 启用自动 TLS

插件可以更改和扩展Caddy的行为. 通常,它们根据您的使用情况提供更多的配置指令. 在此步骤中,您将启用自动Let's Encrypt证书提供和更新,使用TXT DNS记录进行验证。 要使用TXT DNS记录进行验证,您将安装官方插件(https://github.com/caddy-dns/digitalocean),以与DigitalOcean DNS API进行交互。

要添加一个插件,您需要使用xcaddy重新编译 Caddy,指定应该可用的插件存储库。 运行以下命令来编译支持 DigitalOcean DNS 的 Caddy:

1xcaddy build --with github.com/caddy-dns/digitalocean@master

结果将类似于此:

 1[secondary_label Output]
 2...
 32022/08/10 15:03:24 [INFO] exec (timeout=0s): /usr/local/go/bin/go get -d -v github.com/caddy-dns/digitalocean@master github.com/caddyserver/caddy/v2
 4go: downloading github.com/caddy-dns/digitalocean v0.0.0-20220527005842-9c71e343246b
 5go: downloading github.com/libdns/digitalocean v0.0.0-20220518195853-a541bc8aa80f
 6go: downloading github.com/digitalocean/godo v1.41.0
 7go: downloading github.com/google/go-querystring v1.0.0
 8go: downloading golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c
 9go: downloading google.golang.org/appengine v1.6.6
10go: added github.com/caddy-dns/digitalocean v0.0.0-20220527005842-9c71e343246b
11go: added github.com/digitalocean/godo v1.41.0
12go: added github.com/libdns/digitalocean v0.0.0-20220518195853-a541bc8aa80f
132022/08/10 15:03:33 [INFO] exec (timeout=0s): /usr/local/go/bin/go get -d -v
14go: downloading github.com/antlr/antlr4 v0.0.0-20200503195918-621b933c7a7f
15go: downloading github.com/Masterminds/semver v1.4.2
16go: downloading github.com/cenkalti/backoff v2.2.1+incompatible
17go: downloading github.com/cpuguy83/go-md2man v1.0.10
18go: downloading github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220804214150-8b0cc382067f
19go: downloading github.com/antlr/antlr4 v4.10.1+incompatible
20go: upgraded github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220418222510-f25a4f6275ed => v0.0.0-20220804214150-8b0cc382067f
21go: upgraded golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c => v0.0.0-20211104180415-d3ed0bb246c8
22go: upgraded google.golang.org/appengine v1.6.6 => v1.6.7
232022/08/10 15:03:39 [INFO] Build environment ready
242022/08/10 15:03:39 [INFO] Building Caddy
252022/08/10 15:03:39 [INFO] exec (timeout=0s): /usr/local/go/bin/go mod tidy
262022/08/10 15:03:40 [INFO] exec (timeout=0s): /usr/local/go/bin/go build -o /home/sammy/caddy/caddy -ldflags -w -s -trimpath
272022/08/10 15:03:56 [INFO] Build complete: ./caddy
282022/08/10 15:03:56 [INFO] Cleaning up temporary folder: /tmp/buildenv_2022-08-10-1503.1377463227

编译完成后,通过运行将结果的二进制移动到 `/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,因此您将编辑它的systemd单元文件。

1sudo nano /etc/systemd/system/caddy.service

[服务]部分中添加突出的行,以您的 API 代码代替your_token_here:

 1[label /etc/systemd/system/caddy.service]
 2...
 3[Service]
 4Type=notify
 5User=caddy
 6Group=caddy
 7Environment=DO_AUTH_TOKEN=your_token_here
 8ExecStart=/usr/bin/caddy run --environ --config /etc/caddy/Caddyfile
 9ExecReload=/usr/bin/caddy reload --config /etc/caddy/Caddyfile
10TimeoutStopSec=5s
11LimitNOFILE=1048576
12LimitNPROC=512
13PrivateTmp=true
14ProtectSystem=full
15AmbientCapabilities=CAP_NET_BIND_SERVICE
16...

保存并关闭此文件,然后重新加载systemd对象,以确保配置更新:

1sudo systemctl daemon-reload

运行systemctl重新启动,查看您的配置更改:

1sudo systemctl restart caddy

然后运行systemctl status来检查它是否正确运行:

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 Wed 2022-08-10 15:06:01 UTC; 2s ago
 5       Docs: https://caddyserver.com/docs/
 6   Main PID: 5620 (caddy)
 7      Tasks: 7 (limit: 1119)
 8     Memory: 7.5M
 9        CPU: 37ms
10     CGroup: /system.slice/caddy.service
11             └─5620 /usr/bin/caddy run --environ --config /etc/caddy/Caddyfile

接下来,你需要对你的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 digitalocean {env.DO_AUTH_TOKEN}
 9    }
10}

使用域名而不是主机名称的协议指定器将导致Caddy通过HTTPS服务请求。tls指令配置Caddy在使用TLS时的行为,你命令Caddy使用digitalocean插件来设置DNS记录并要求证书。

保存并关闭文件。

有了这个,你的网站已经准备好部署了,然后用systemctl重新启动Caddy,然后启用它,以便它启动:

1sudo systemctl restart caddy
2sudo systemctl enable caddy

当您访问您的域名时,您将自动重定向到 HTTPS 与相同的 ** 此页面正在通过Caddy**消息提供。

您的 Caddy 安装现在已完成和安全,您可以根据您的使用情况进一步定制。

结论

您现在已经在您的服务器上安装并配置了 Caddy,在您想要的域中提供静态页面,并通过免费的 Let's Encrypt TLS 证书进行安全保护。

例如,您可以使用 Atom feed for Caddy releases或一个专用的服务,如 dependencies.io

您也可以在 How To Code in Go上了解有关使用 Go 语言的更多信息。

Published At
Categories with 技术
comments powered by Disqus