作者选择了 自由和开源基金作为 写给捐款计划的一部分接受捐款。
介绍
例如,它可以从 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
目录的权限,以便它只能通过 root
和 caddy
访问:
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。
您现在已经配置了 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 语言的更多信息。