如何在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证书进行保护。

先决条件

  • An Ubuntu 22.04 server with root privileges, with at least 2 GB RAM and a secondary, non-root account. You can set this up by following our Initial Server Setup Guide for Ubuntu 22.04. For this tutorial, the non-root user is sammy.
  • The Go language toolchain installed on your server. Follow Steps 1 and 2 in How To Install Go on Ubuntu 20.04 to set up the latest Go version (Caddy needs Go version 17 or higher).
  • A fully registered domain name. This tutorial will use your_domain throughout. You can purchase a domain name on Namecheap, get one for free on Freenom, or use the domain registrar of your choice.
  • An A DNS record with your_domain pointing to your server’s public IP address and a CNAME DNS record with www.your_domain pointing to @. You can follow this introduction to Silicon Cloud DNS for details on how to add them.
  • A personal access token (API key) with read and write permissions for your Silicon Cloud account. Visit How to Create a Personal Access Token to create one.

步骤一——建立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

 

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

Output

2022/08/10 15:55:18 [INFO] Temporary folder: /tmp/buildenv_2022-08-10-1555.834895411 2022/08/10 15:55:18 [INFO] Writing main module: /tmp/buildenv_2022-08-10-1555.834895411/main.go package main import ( caddycmd “github.com/caddyserver/caddy/v2/cmd” // plug in Caddy modules here _ “github.com/caddyserver/caddy/v2/modules/standard” ) func main() { caddycmd.Main() } 2022/08/10 15:55:18 [INFO] Initializing Go module 2022/08/10 15:55:18 [INFO] exec (timeout=10s): /usr/local/go/bin/go mod init caddy go: creating new go.mod: module caddy go: to add module requirements and sums: go mod tidy 2022/08/10 15:55:18 [INFO] Pinning versions 2022/08/10 15:55:18 [INFO] exec (timeout=0s): /usr/local/go/bin/go get -d -v github.com/caddyserver/caddy/v2 go: downloading github.com/caddyserver/caddy v1.0.5 … 2022/08/10 15:55:49 [INFO] Build environment ready 2022/08/10 15:55:49 [INFO] Building Caddy 2022/08/10 15:55:49 [INFO] exec (timeout=0s): /usr/local/go/bin/go mod tidy … 2022/08/10 15:55:57 [INFO] exec (timeout=0s): /usr/local/go/bin/go build -o /home/sammy/caddy/caddy -ldflags -w -s -trimpath 2022/08/10 15:58:48 [INFO] Build complete: ./caddy 2022/08/10 15:58:48 [INFO] Cleaning up temporary folder: /tmp/buildenv_2022-08-10-1555.834895411

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

  1. sudo mv caddy /usr/bin

 

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

  1. caddy version

 

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

Output

v2.6.1 h1:EDqo59TyYWhXQnfde93Mmv4FJfYe00dO60zMiEt+pzo=

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

第二步——安装Caddy

既然您已经确认能够构建和运行Caddy,您可以配置一个systemd服务,以便在系统启动时自动启动Caddy。要了解更多关于systemd的内容,请访问我们的Systemd Essentials教程。

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

  1. sudo groupadd –system caddy

 

然后,创建一个属于caddy组的名为caddy的新用户。

  1. sudo 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 用户将有自己的主目录被创建。由于其 shell 设置为 nologin,因此无法以 caddy 的身份登录。

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

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

 

这个改变将防止其他账户修改可执行文件。然而,尽管root用户将拥有Caddy,建议您使用系统中其他非root账户来执行它,就像systemd服务一样。从非root账户运行命令可以确保在Caddy(或其他程序)被攻击者入侵时,攻击者无法修改二进制文件或以root身份执行命令。

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

  1. sudo chmod 755 /usr/bin/caddy

 

你现在已经完成了Caddy二进制设置,并且可以开始Caddy配置。

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

  1. sudo mkdir /etc/caddy

 

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

  1. sudo chown -R root:caddy /etc/caddy

 

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

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

  1. sudo mkdir /etc/ssl/caddy
  2. sudo chown -R root:caddy /etc/ssl/caddy

 

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

  1. sudo chmod 0770 /etc/ssl/caddy

 

接下来创建一个目录来存储Caddy将托管的文件。

  1. sudo mkdir /var/www

 

接下来,将目录的所有者和组设置为 caddy:

  1. sudo chown caddy:caddy /var/www

 

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

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

 

你会收到这样的回复。

Output

% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 1030 100 1030 0 0 4698 0 –:–:– –:–:– –:–:– 4703 ​“` Modify the service file’s permissions so it can only be modified by its owner, `root`: ​“`command sudo chmod 644 /etc/systemd/system/caddy.service

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

  1. sudo systemctl daemon-reload

 

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

  1. sudo systemctl status caddy

 

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

Output

● 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

 

输出将是:

Output

Rule added Rule added (v6)

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

  1. sudo ufw status

 

您将收到以下输出:

Output

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文件」。
<!DOCTYPE html>
<html>
<head>
<title>Hello from Caddy!</title>
</head>
<body>
<h1 style="font-family: sans-serif">This page is being served via Caddy</h1>
</body>
</html>

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

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

  1. sudo nano /etc/caddy/Caddyfile

 

请添加以下行:

/etc/caddy/Caddyfile的中文同义表达方式:
  1. http:// {
  2. root * /var/www
  3. encode gzip
  4. file_server
  5. }

 

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

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

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

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

  1. sudo systemctl start caddy

 

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

  1. sudo systemctl status caddy

 

你将会收到以下物品:

Output

● 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的功能。

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

插件可以改变和扩展Caddy的行为。通常情况下,插件根据您的用例提供了更多的配置指令。在这一步中,您将启用自动的Let’s Encrypt证书提供和更新功能,使用TXT DNS记录进行验证。为了使用TXT DNS记录进行验证,您将安装官方插件与Silicon Cloud DNS API进行接口连接。

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

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

 

输出将与此类似。

Output

… 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目录中:

  1. sudo mv caddy /usr/bin

 

然后,设置适当的权限。

  1. sudo chown root:root /usr/bin/caddy
  2. sudo chmod 755 /usr/bin/caddy

 

接下来,您将配置Caddy与Silicon Cloud的API一起使用,以设置DNS记录。Caddy需要将您的API令牌作为环境变量读取,以配置Silicon Cloud的DNS,因此您需要编辑其systemd unit文件。打开该文件以进行编辑。

  1. 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

 

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

Output

● 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语言的知识。

发表回复 0

Your email address will not be published. Required fields are marked *


广告
将在 10 秒后关闭
bannerAds