Ubuntu 22.04下Caddy建站指南:快速部署与配置

介绍

Caddy 是一款专注于简洁和安全的网络服务器,提供了许多对托管网站有用的功能。例如,它可以自动获取和管理 Let’s Encrypt 的 TLS 证书以启用 HTTPS,并支持 HTTP/2。HTTPS 是一种用于加密用户和服务器之间通信的系统,逐渐成为任何在生产环境中运行的网站的基本期望。如果没有 HTTPS,Chrome 和 Firefox 会警告用户提交登录信息时网站是“不安全”的。

在本教程中,您将使用自定义的 Caddy 构建工具 xcaddy 从源代码构建 Caddy,并使用它来托管一个通过 HTTPS 保护的网站。这包括编译 Caddy,使用 Caddyfile 进行配置,并安装插件。最终,您的域名将提供静态页面,并通过 Let’s Encrypt 提供的免费 TLS 证书进行保护。

先决条件

  • 一台拥有 root 权限的 Ubuntu 22.04 服务器,至少 2GB 内存和一个非 root 账户。您可以按照我们的 Ubuntu 22.04 服务器初始设置指南 进行设置。本教程中,非 root 用户名为 sammy。
  • 服务器上已安装 Go 语言工具链。请按照 如何在 Ubuntu 20.04 上安装 Go 的步骤 1 和 2 设置最新版本的 Go(Caddy 需要 Go 17 或更高版本)。
  • 一个完全注册的域名。本教程将全程使用 your_domain。您可以在 Namecheap 购买域名,在 Freenom 免费获取,或使用您选择的域名注册商。
  • 一个 A 记录,将 your_domain 指向您服务器的公共 IP 地址;以及一个 CNAME 记录,将 www.your_domain 指向 @。您可以参考 Silicon Cloud DNS 简介 了解如何添加这些记录。
  • 一个具有读写权限的 Silicon Cloud 账户个人访问令牌(API 密钥)。请访问 如何创建个人访问令牌 进行创建。

步骤一 — 建立 Caddy

在这一步中,您将使用 Caddy 的源代码构建它,同时保留后续添加插件的能力,而不需要更改 Caddy 的源代码。您将使用 xcaddy 根据您的需求下载并构建 Caddy 及其插件。

访问 xcaddy 的发行页面,并复制适用于 linux_amd64 平台的最新版本链接。在下载之前,通过运行以下命令前往 /tmp 目录。

  1. cd /tmp

然后,使用 wget 命令下载最新版本。

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

下载完成后,仅提取二进制文件。

  1. tar xvf xcaddy_0.3.1_linux_amd64.tar.gz xcaddy

最后,将 xcaddy 可执行文件移动到 /usr/bin,使其在整个系统中可访问。

  1. sudo mv xcaddy /usr/bin

既然 xcaddy 安装完成,你就可以构建 Caddy。为此,创建一个独立的目录来存储它:

  1. mkdir ~/caddy

通过运行以下命令导航至它。

  1. cd ~/caddy

要构建最新版本的 Caddy 而不使用任何第三方插件,请运行以下命令:

  1. xcaddy build

这个命令会花费一些时间才能完成,但它将输出类似于这样的结果。

输出

这是文章《如何在Ubuntu 22.04上使用Caddy托管一个网站》的第2部分(共8部分)。

2022/08/10 15:55:18 [INFO] 临时文件夹: /tmp/buildenv_2022-08-10-1555.834895411
2022/08/10 15:55:18 [INFO] 正在写入主模块: /tmp/buildenv_2022-08-10-1555.834895411/main.go
package main

import (
    caddycmd "github.com/caddyserver/caddy/v2/cmd"
    // 在此处插入Caddy模块
    _ "github.com/caddyserver/caddy/v2/modules/standard"
)

func main() {
    caddycmd.Main()
}
2022/08/10 15:55:18 [INFO] 正在初始化Go模块
2022/08/10 15:55:18 [INFO] 执行 (超时=10s): /usr/local/go/bin/go mod init caddy
go: 正在创建新的go.mod: module caddy
go: 如需添加模块要求和校验和: go mod tidy
2022/08/10 15:55:18 [INFO] 正在锁定版本
2022/08/10 15:55:18 [INFO] 执行 (超时=0s): /usr/local/go/bin/go get -d -v github.com/caddyserver/caddy/v2
go: 正在下载 github.com/caddyserver/caddy v1.0.5 ...
2022/08/10 15:55:49 [INFO] 构建环境就绪
2022/08/10 15:55:49 [INFO] 正在构建Caddy
2022/08/10 15:55:49 [INFO] 执行 (超时=0s): /usr/local/go/bin/go mod tidy ...
2022/08/10 15:55:57 [INFO] 执行 (超时=0s): /usr/local/go/bin/go build -o /home/sammy/caddy/caddy -ldflags -w -s -trimpath
2022/08/10 15:58:48 [INFO] 构建完成: ./caddy
2022/08/10 15:58:48 [INFO] 正在清理临时文件夹: /tmp/buildenv_2022-08-10-1555.834895411

完成后,您将在当前文件夹中获得Caddy可执行文件。将其移动到/usr/bin以完成安装。

  1. sudo mv caddy /usr/bin

 

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

  1. caddy version

 

输出将包含您刚刚编译的Caddy版本。

输出

v2.6.1 h1:EDqo59TyYWhXQnfde93Mmv4FJfYe00dO60zMiEt+pzo=

您现在已经成功构建并执行了Caddy。在下一步中,您将把Caddy安装为一个服务,以便它能够在系统启动时自动启动,然后您将调整所有权和权限设置,以确保服务器的安全性。

第二步——安装Caddy

配置Caddy的Systemd服务

既然您已经确认能够构建并运行Caddy,接下来可以配置一个systemd服务,以便在系统启动时自动启动Caddy。若要深入了解systemd,请查阅我们的Systemd Essentials教程

为了将Caddy作为systemd服务运行,您需要创建专门的用户和组。请使用以下命令创建caddy组:

sudo groupadd --system caddy

然后,创建一个名为caddy的新用户,并将其归属于caddy组:

sudo useradd --system \
--gid caddy \
--create-home \
--home-dir /var/lib/caddy \
--shell /usr/sbin/nologin \
--comment "Caddy web server" \
caddy

新的Caddy用户将拥有自己的主目录。由于其shell设置为nologin,因此无法直接以caddy身份登录系统。

调整Caddy二进制文件权限

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

sudo chown root:root /usr/bin/caddy

此更改将防止其他账户修改可执行文件。尽管root用户将拥有Caddy,但建议您通过系统中的其他非root账户(例如systemd服务)来执行它。从非root账户运行命令可以确保即使Caddy(或其他程序)被攻击者入侵,攻击者也无法修改二进制文件或以root身份执行命令。

接下来,将二进制文件的权限设置为755。这将赋予root用户对该文件的完全读、写和执行权限,而其他用户只能读取和执行它。

sudo chmod 755 /usr/bin/caddy

至此,您已完成Caddy二进制文件的设置,可以开始进行Caddy配置。

配置Caddy相关目录

创建一个目录,用于存储Caddy的配置文件:

sudo mkdir /etc/caddy

然后为其设置用户和组权限:

sudo chown -R root:caddy /etc/caddy

将用户设置为root,组设置为caddy,确保Caddy通过caddy组在文件夹上具有读写权限,并且只有超级用户账户具有相同的读取和修改权限。

在后续步骤中,您将启用Let’s Encrypt的自动TLS证书提供。为此,请创建一个目录来存储Caddy获取的任何TLS证书,并使其与/etc/caddy目录具有相同的所有权规则。

sudo mkdir /etc/ssl/caddy
sudo chown -R root:caddy /etc/ssl/caddy

为了加密请求,Caddy必须能够将证书写入此目录并从中读取。因此,请修改/etc/ssl/caddy目录的权限,使其仅能被rootcaddy访问。

sudo chmod 0770 /etc/ssl/caddy

接下来创建一个目录,用于存储Caddy将托管的文件:

sudo mkdir /var/www

然后,将该目录的所有者和组设置为caddy

sudo chown caddy:caddy /var/www

安装Caddy Systemd服务文件

要安装Caddy服务,请从Caddy GitHub仓库下载systemd unit文件,并通过以下命令将其保存到/etc/systemd/system

sudo sh -c 'curl https://raw.githubusercontent.com/caddyserver/dist/master/init/caddy.service > /etc/systemd/system/caddy.service'

您将收到类似以下内容的输出:

输出

% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 1030 100 1030 0 0 4698 0 –:–:– –:–:– –:–:– 4703

修改服务文件的权限,使其只能由所有者root修改:

sudo chmod 644 /etc/systemd/system/caddy.service

然后,重新加载systemd以检测Caddy服务。

  1. sudo systemctl daemon-reload

运行systemctl status命令,检查系统是否已经检测到Caddy服务。

  1. sudo systemctl status caddy

你将会收到一个类似的输出:

输出

● caddy.service – Caddy
Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: https://caddyserver.com/docs/

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

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

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

输出将是:

输出

Rule added
Rule added (v6)

使用ufw status命令来验证您的更改。

  1. sudo ufw status

您将收到以下输出:

输出

Status: active
To Action From
— —— —-
OpenSSH ALLOW Anywhere
80,443/tcp ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
80,443/tcp (v6) ALLOW Anywhere (v6)

您的Caddy安装现在完成了,但尚未配置为提供任何内容。在下一步中,您将配置Caddy从/var/www目录中提供文件服务。

第三步 – 配置Caddy

在这个部分,您将为您的服务器编写基本的Caddy配置以便提供静态文件的服务。

/var/www目录下创建一个名为index.html的基本HTML文件。

  1. sudo nano /var/www/index.html

请添加以下内容:

/var/www/index.html可以被解释为“位于/var/www目录下的index.html文件”。

这是文章《如何在Ubuntu 22.04上使用Caddy托管一个网站》的第5部分(共8部分)。

内容片段:

<!DOCTYPE html>
<html>
<head>
<title>Hello from Caddy!</title>
</head>
<body>
<h1 style="font-family: sans-serif">此页面通过Caddy提供服务</h1>
</body>
</html>

当在网络浏览器中显示时,此文件将显示一个标题,上面写着“此页面通过Caddy提供服务”。保存并关闭文件。

Caddy从名为Caddyfile的文件中读取配置,该文件存储在/etc/caddy目录下。创建并打开此文件进行编辑:

  1. sudo nano /etc/caddy/Caddyfile

请添加以下行:

  1. http:// {
  2. root * /var/www
  3. encode gzip
  4. file_server
  5. }

在此基本的Caddy配置中,声明所有的HTTP流量都应该通过/var/www的文件服务器(file_server)来提供服务(被标记为根目录),并使用gzip进行压缩,以降低客户端页面加载时间。

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

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

为了测试一切是否正常工作,启动Caddy服务。

  1. sudo systemctl start caddy

接下来,运行systemctl status命令以获取有关Caddy服务状态的信息。

  1. sudo systemctl status caddy

你将会收到以下输出:

输出
● caddy.service - Caddy
   Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: enabled)
   Active: active (running) since Wed 2022-08-10 15:02:41 UTC; 2s ago
     Docs: https://caddyserver.com/docs/
 Main PID: 5443 (caddy)
    Tasks: 7 (limit: 1119)
   Memory: 7.5M
      CPU: 30ms
   CGroup: /system.slice/caddy.service
           └─5443 /usr/bin/caddy run --environ --config /etc/caddy/Caddyfile

您现在可以在网络浏览器中访问您的服务器IP。您的示例网页将显示:

Caddy 默认页面

你已经配置了Caddy来从你的服务器上提供静态文件。接下来的一步,你将通过插件来扩展Caddy的功能。

第四步 – 使用Let’s Encrypt开启自动TLS

第六部分:使用xcaddy编译Caddy并添加DNS插件

插件能够扩展和改变Caddy的功能。通常,它们会根据您的具体用例提供更多的配置指令。在本节中,您将启用Caddy的自动Let’s Encrypt证书提供和更新功能,并通过TXT DNS记录进行验证。为了实现TXT DNS验证,您需要安装官方插件以与Silicon Cloud DNS API进行接口连接。

要添加插件,您需要使用xcaddy工具重新编译Caddy,并指定所需插件的存储库。运行以下命令来编译支持Silicon Cloud DNS的Caddy:

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

输出将与以下内容类似:

输出
... 2022/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
go: downloading github.com/caddy-dns/digitalocean v0.0.0-20220527005842-9c71e343246b
go: downloading github.com/libdns/digitalocean v0.0.0-20220518195853-a541bc8aa80f
go: downloading github.com/digitalocean/godo v1.41.0
go: downloading github.com/google/go-querystring v1.0.0
go: downloading golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c
go: downloading google.golang.org/appengine v1.6.6
go: added github.com/caddy-dns/digitalocean v0.0.0-20220527005842-9c71e343246b
go: added github.com/digitalocean/godo v1.41.0
go: added github.com/libdns/digitalocean v0.0.0-20220518195853-a541bc8aa80f
2022/08/10 15:03:33 [INFO] exec (timeout=0s): /usr/local/go/bin/go get -d -v
go: downloading github.com/antlr/antlr4 v0.0.0-20200503195918-621b933c7a7f
go: downloading github.com/Masterminds/semver v1.4.2
go: downloading github.com/cenkalti/backoff v2.2.1+incompatible
go: downloading github.com/cpuguy83/go-md2man v1.0.10
go: downloading github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220804214150-8b0cc382067f
go: downloading github.com/antlr/antlr4 v4.10.1+incompatible
go: upgraded github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220418222510-f25a4f6275ed => v0.0.0-20220804214150-8b0cc382067f
go: upgraded golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c => v0.0.0-20211104180415-d3ed0bb246c8
go: upgraded google.golang.org/appengine v1.6.6 => v1.6.7
2022/08/10 15:03:39 [INFO] Build environment ready
2022/08/10 15:03:39 [INFO] Building Caddy
2022/08/10 15:03:39 [INFO] exec (timeout=0s): /usr/local/go/bin/go mod tidy
2022/08/10 15:03:40 [INFO] exec (timeout=0s): /usr/local/go/bin/go build -o /home/sammy/caddy/caddy -ldflags -w -s -trimpath
2022/08/10 15:03:56 [INFO] Build complete: ./caddy
2022/08/10 15:03:56 [INFO] Cleaning up temporary folder: /tmp/buildenv_2022-08-10-1503.1377463227

编译完成后,通过执行以下命令将生成的二进制文件移动到/usr/bin目录中:

sudo mv caddy /usr/bin

然后,设置适当的权限:

sudo chown root:root /usr/bin/caddy
sudo chmod 755 /usr/bin/caddy

接下来,您将配置Caddy与Silicon Cloud的API协同工作,以设置DNS记录。Caddy需要将您的API令牌作为环境变量读取,以便配置Silicon Cloud的DNS。因此,您需要编辑其systemd单元文件。打开该文件进行编辑:

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

[Service]部分中添加高亮显示的行,并将your_token_here替换为您的API令牌:

/caddy.service的路径位于/etc/systemd/system

...
[Service]
Type=notify
User=caddy
Group=caddy
Environment=DO_AUTH_TOKEN=your_token_here
ExecStart=/usr/bin/caddy run --environ --config /etc/caddy/Caddyfile
ExecReload=/usr/bin/caddy reload --config /etc/caddy/Caddyfile
TimeoutStopSec=5s
LimitNOFILE=1048576
LimitNPROC=512
PrivateTmp=true
ProtectSystem=full
AmbientCapabilities=CAP_NET_BIND_SERVICE
...

保存并关闭此文件,然后重新加载systemd守护进程以确保配置已更新。

  1. sudo systemctl daemon-reload

 

运行systemctl restart来检查您的配置更改。

  1. sudo systemctl restart caddy

 

然后运行systemctl status检查是否成功运行。

  1. sudo systemctl status caddy

 

您将会收到以下的输出结果:

输出

● caddy.service – Caddy
Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: enabled)
Active: active (running) since Wed 2022-08-10 15:06:01 UTC; 2s ago
Docs: https://caddyserver.com/docs/
Main PID: 5620 (caddy)
Tasks: 7 (limit: 1119)
Memory: 7.5M
CPU: 37ms
CGroup: /system.slice/caddy.service
└─5620 /usr/bin/caddy run –environ –config /etc/caddy/Caddyfile

接下来,您需要对Caddyfile进行微小的更改,因此打开它进行编辑。

  1. sudo nano /etc/caddy/Caddyfile

 

将下面的高亮行添加到Caddyfile中,将your_domain替换为您的域名(不要使用http://),并添加带有Silicon Cloud DNS指定的tls块。

/etc/caddy/Caddyfile 可以进行以下的中文解释:

your_domain {
    root * /var/www
    encode gzip
    file_server
    
    tls {
        dns digitalocean {env.DO_AUTH_TOKEN}
    }
}

如果使用域名而不是协议指示符作为主机名,Caddy将通过HTTPS来处理请求。tls指令配置了Caddy在使用TLS时的行为,并指示其使用digitalocean插件来设置DNS记录和请求证书。dns子指令指定Caddy应该使用Silicon Cloud的DNS系统而不是HTTP。

保存并关闭文件。

有了这个,您的网站就准备好部署了。用systemctl重新启动Caddy,然后启用它,确保它开机自动运行。

  1. sudo systemctl restart caddy
  2. sudo systemctl enable caddy

 

当您访问您的域时,您将自动重定向到HTTPS,并显示相同的“This page is being served via Caddy”信息。

您的Caddy安装已成功完成并已经安全设置,您还可以根据自己的使用情况进行进一步的自定义配置。

结论

您现在已经在服务器上成功安装并配置了 Caddy,可以在您选择的域名下提供静态页面,并使用免费的 Let’s Encrypt TLS 证书进行安全保护。

下一步,建议您设置通知,以便在 Caddy 发布新版本时及时获取信息。例如,您可以订阅 Caddy 官方发布的 Atom feed,或者使用类似 dependencies.io 这样的专业服务。如需了解更多关于 Caddy 的配置信息,请查阅 Caddy 的官方文档

此外,您还可以通过我们的《Go 语言编程入门系列》,深入学习 Go 语言的知识。

bannerAds