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

此教程的早期版本由 Mateusz Papiernik编写。

作者选择了 维基媒体基金会作为 写给捐赠计划的一部分获得200美元的捐赠。

介绍

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

以前,安装Caddy的推荐方法是从Caddy项目网站下载预建二进制文件,但是,Caddy的许可工作方式最近发生了变化,这意味着您不再允许使用这些预建二进制文件用于商业目的,除非您支付许可费,即使您只是在企业内部使用Caddy。

在本教程中,您将从源头构建Caddy,并使用它来托管使用HTTPS保护的网站,然后您将使用Caddyfile配置Caddy,安装Caddy插件,并学习如何在发布新版本时升级您的安装。

前提条件

在您开始本指南之前,您需要具备以下内容:

您应该能够通过 SSH 连接到服务器,登录为具有 sudo 特权的非根用户,并使用 UFW.

步骤 1 - 建造卡迪

在此步骤中,您将获取Caddy的源代码,并确保您能够编译它。Caddy是写在Go中,所以使用Go get命令行工具从GitHub获取Caddy的源代码,并将其保存到$GOPATH/src/github.com/mholt/caddy:

1go get github.com/mholt/caddy/caddy

「Go Get」使用Git來克隆來自GitHub的代碼。Git是一個版本控制系統,這意味著它記錄一個項目的狀態,當你做出變更,並允許你回到該項目的歷史中的任何以前的狀態。 默認情況下,「Go Get」命令下載來源代碼的最新版本,但最好使用Caddy的最新穩定版本,而不是最新的儲存庫添加,這很可能是在發行之間的中間。

要查看所有以前的版本,请先导航到您保存了 Caddy 的源目录的目录:

1cd $GOPATH/src/github.com/mholt/caddy

接下来,使用git tag命令查看 Caddy 之前的所有版本:

1git tag

您将看到类似于以下的输出:

 1[secondary_label Output]
 2v0.10.0
 3v0.10.1
 4v0.10.10
 5v0.10.11
 6v0.10.12
 7v0.10.2
 8v0.10.3
 9v0.10.4
10v0.10.5
11. . .

当Caddy的稳定版本发布时,作者会在Git中通过添加标签来表示这一点,您可以使用Git将代码返回到最后一个稳定版本时的状态,在输出中找到最高的版本号码;在写字时,这是v0.10.12

由于您将在以后修改源代码,以便安装一些插件,请创建一个新的 branch 来存储您的更改。在 Git 中,分支是同时在不同的代码版本上工作的方式。它们允许您在代码的版本与您的个人更改之间切换,并在代码的官方版本之间切换。要创建一个新的分支,请使用git checkout命令,该命令会切换分支。b选项将指示 Git 创建一个名为adding_plugins的新分支,从v0.10.12版本开始。用任何你想要命名分支的adding_plugins来代替v0.10.12和你之前所识别的最新稳定版本:

1git checkout -b "adding_plugins" "v0.10.12"

这将将你的 Caddy 源代码的版本返回到最后一个稳定版本,你将处于一个新的分支机构,在那里你可以保留对代码的更改。

在这一点上,你可以使用去安装工具来构建Caddy,将源代码编译成二进制,虽然命令语法似乎会从网站(github.com)安装Caddy,但这实际上指的是我们刚刚与Git存储库( $GOPATH/src/github.com/mholt/caddy)合作的服务器上的本地路径:

1go install github.com/mholt/caddy/caddy

编译源代码后,运行caddy命令启动服务器. 请注意,为了使此操作正确,您的 Go 路径应设置为$GOPATH/bin,如前提所述:

1caddy

此命令将产生以下输出:

1[secondary_label Output]
2Activating privacy features... done.
3http://:2015
4WARNING: File descriptor limit 1024 is too low for production servers. At least 8192 is recommended. Fix with "ulimit -n 8192".

此警告可以暂时被忽略,因为当我们设置 Caddy 所需的各种配置文件时,我们将解决它。

要证明 Caddy 是从您的源头构建的,请在 Caddy 运行时添加一行 Caddy 源代码以打印一些文本. 使用 nano' 或您偏好的编辑器打开 $GOPATH/src/github.com/mholt/caddy/caddy/caddymain/run.go`:

1nano $GOPATH/src/github.com/mholt/caddy/caddy/caddymain/run.go

此文件处理了 Caddy 命令中传递的任何选项,并且是当您运行 Caddy 时执行的第一件事之一。

查找 Run() 函数,并将突出的文本添加为弯曲的支架中的第一个行,在服务器运行前将打印出文本Hello from Caddy!:

 1[label $GOPATH/src/github.com/mholt/caddy/caddy/caddymain/run.go]
 2. . .
 3// Run is Caddy's main() function.
 4func Run() {
 5        fmt.Println("Hello from Caddy!")
 6
 7        flag.Parse()
 8
 9        caddy.AppName = appName
10        . . .
11}

CTRL + X,Y,然后按ENTER来保存和关闭文件. 如果您再次运行Go installcaddy命令,则将在输出的顶部看到您添加到Run()函数的消息:

1go install github.com/mholt/caddy/caddy
2caddy
1[secondary_label Output]
2Hello from Caddy!
3Activating privacy features... done.
4http://:2015
5WARNING: File descriptor limit 1024 is too low for production servers. At least 8192 is recommended. Fix with "ulimit -n 8192".

有了它,你可以成功地从源头构建了Caddy,如果你愿意,你可以从$GOPATH/src/github.com/mholt/caddy/caddy/caddymain/run.go中删除添加的行,但如果你这样做,你需要重新编译代码。在下一步,你将安装Caddy作为一个服务,以便它在启动时自动启动,然后调整其所有权和权限设置以确保服务器的安全。

步骤 2 – 安装 Caddy

现在你已经验证了你能够构建Caddy,现在是时候 配置一个 _systemd_服务以便Caddy可以在系统启动时自动启动。Systemd是管理Linux上的流程的综合解决方案。Caddy配备了caddy.service文件,系统d可以使用它来管理Caddy服务。

首先,将 Caddy 二进制复制到 /usr/local/bin,这是 Ubuntu 包管理器不管理的二进制的标准位置,并且不是系统操作的关键:

1sudo cp $GOPATH/bin/caddy /usr/local/bin/

接下来,将 Caddy 二进制的所有权转移到 root 用户身上,请注意,虽然 root 将拥有 Caddy,但建议您不要使用 root 帐户运行 Caddy,因为如果 Caddy 存在漏洞,这可能是一个重大安全问题。

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

接下来,将二进制文件的权限设置为755,这会为该文件提供完整的阅读/写入/执行权限,而其他用户只能读取和执行:

1sudo chmod 755 /usr/local/bin/caddy

由于Caddy过程不会作为 root运行,所以Linux会阻止它连接到端口 :8043(分别是 HTTP 和 HTTPS 的标准端口),因为这些是特权操作。

使用setcap命令可以允许Caddy过程连接到低端口而不运行为 rootsetcap有助于允许一个过程执行特定的特权操作而不给它完整的超级用户权限。

1sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/caddy

在为 Caddy 二进制设置权限后,创建一个目录,在那里您将存储 Caddy 的配置文件. 这些应该保存在 /etc/ 的子目录中,这是 File System Hierarchy Standard 推荐的配置文件位置:

1sudo mkdir /etc/caddy

将该目录的所有者设置为 root,并将其组分为 www-datawww-data是运行网页服务器的标准用户帐户,并且是将运行Caddy的帐户。以这种方式设置所有权将确保您已经阅读和写入了二进制(通过 root帐户),而Caddy过程也可以阅读和写入它(因为它将运行为 www-data),但其他用户将无法访问它。

1sudo chown -R root:www-data /etc/caddy

在稍后的一步中,本教程将介绍如何使用 Let's Encrypt 启用自动 TLS. 为此准备,创建一个目录,以存储 Caddy 将获得的任何 TLS 证书,并给它与 /etc/caddy 目录相同的所有权规则:

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

Caddy 必须能够将证书写入该目录并从其中读取,以便加密请求. 因此,修改 /etc/ssl/caddy 目录的权限,以便它只能通过 rootwww-data 访问:

1sudo chmod 0770 /etc/ssl/caddy

接下来,创建一个目录来存储Caddy将托管的文件. /var/www/是事实上存储通过HTTP服务的文件的标准位置:

1sudo mkdir /var/www

然后将目录的所有者和组设置为 www-data,这是 Ubuntu 上 Web 服务器操作的默认用户:

1sudo chown www-data:www-data /var/www

Caddy 是通过一个名为Caddyfile的文件进行配置的;在 Apache 或 Nginx 的可用网站配置目录中,将此文件视为类似于httpd.conf的文件可能有用,Caddy 的 systemd 服务将希望此文件存储在/etc/caddy中,因此使用touch创建Caddyfile:

1sudo touch /etc/caddy/Caddyfile

要安装 Caddy 服务,请将 systemd 单元文件从 Caddy 源代码复制到 /etc/systemd/system,即系统d 服务的位置。

1sudo cp $GOPATH/src/github.com/mholt/caddy/dist/init/linux-systemd/caddy.service /etc/systemd/system/

更改服务文件的权限,以便它只能由其所有者修改, root:

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

接下来,使用systemctl命令行工具重新加载 systemd. 这会导致 systemd 检测 Caddy 服务,尽管我们还不会运行它:

1sudo systemctl daemon-reload

检查 systemd 是否通过运行systemctl 状态来检测到 Caddy 服务:

1sudo systemctl status caddy
1[secondary_label Output]
2 caddy.service - Caddy HTTP/2 web server
3   Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: enabled)
4   Active: inactive (dead)
5     Docs: https://caddyserver.com/docs

如果您看到相同的输出,那么Caddy 被 systemd 正确检测到。

在您编写 Caddy 配置之前,安装过程的最后一步是调整防火墙。您应该已经使用 UFW 运行防火墙,如初始服务器设置指南所规定的。防火墙是保护服务器安全的重要工具,因为它允许您配置哪些端口可供任何外部人连接,以及哪些端口受到保护。如果您的服务器上有其他流程暴露一个端口,防火墙会防止这些端口被访问,从而减少攻击者破坏脆弱软件的可能性。

使用ufw命令行工具禁用对端口:80:443的防火墙,这将允许Caddy分别通过HTTP和HTTPS进行通信:

1sudo ufw allow 80
2sudo ufw allow 443

使用ufw状态来检查您的更改是否奏效:

1sudo ufw status
 1[secondary_label Output]
 2Status: active
 3
 4To Action From
 5--                         ------      ----
 6OpenSSH ALLOW Anywhere
 780 ALLOW Anywhere
 8443 ALLOW Anywhere
 9OpenSSH (v6)               ALLOW Anywhere (v6)
1080 (v6)                    ALLOW Anywhere (v6)
11443 (v6)                   ALLOW Anywhere (v6)

您的 Caddy 安装完成了,但此时尚未设置为做任何事情,接下来,我们将看看如何使用此清洁的 Caddy 安装,并将其配置为服务网站。

步骤 3 – 配置 Caddy

为了让您的 Caddy 安装可以作为一个功能性的 Web 服务器使用,有几个设置需要更改,当我们进行这些更改时,我们将考虑Caddyfile配置的语法,探索几个配置场景,并通过 HTTP 服务一个站点。

要开始配置 Caddy,请创建一个基本的 HTML 文件,以便它提供服务。HTML 是描述网页内容的语言,并且这个文件将作为一个位置保留者来展示 Caddy 托管网站。如果您决定使用 Caddy 托管自己的网站,则将此文件替换为您想要托管的任何内容。将此文件放在您之前设置的 /var/www/ 目录中。名称 index.html 具有重要意义,因为这指大多数网页服务器的默认页面,而导航到您的域的用户将首先提供此文件:

1sudo touch /var/www/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>

这会显示一个标题,上面写着**此页面是通过Caddy提供的**

保存并关闭文件,然后打开您之前创建的Caddyfile配置文件:

1sudo nano /etc/caddy/Caddyfile

编辑文件以包含以下内容:

1[label /etc/caddy/Caddyfile]
2:80 {
3    root /var/www
4}

在第一行, :80 设置了服务器的主机名称 - 在 Caddy 中,这被称为 label。 主机名称是 Caddy 会响应请求的域名。 在这种情况下,将其设置为 :80,意思是服务器的端口 :80

默认情况下,Caddy 试图从 Let's Encrypt 获取 SSL 证书,通过通过 HTTP 提供资源,例如托管文件. 但是,如果您希望使用 Caddy 运行内部服务,您可能不希望将服务器暴露在公共互联网上。 使用插件允许您使用 Let's Encrypt DNS 挑战。 这涉及 Caddy 创建 DNS "TXT" 记录以证明控制服务器,并允许您获取证书,而无需接受外部 HTTP 请求。

在「:80」之后,是一个配置块,包含在弯曲的轴承中,该站点的配置将进行。在下一行,我们看到「 root」 directive。指令是Caddy的实际配置选项,并添加它们改变Caddy在服务网站时的行为。指令可以有 arguments,这些指令是指令应该如何生效的选项。在这种情况下,root指令有一个论点: /var/www. 该指令设置了 Caddy 应该服务的文件所在的目录。然而,指令不需要有论点。例如,您可以添加gzip指令,而无需任何论点来压缩网页,然后发送给客户端,从而加载速度更快。

1[label /etc/caddy/Caddyfile]
2:80 {
3    root /var/www
4    gzip
5}

指令可以用提供额外功能的子指令配置,这些指令被放置在其自身的配置块中,再次使用弯曲的轴承,例如,虽然gzip指令本身工作,但我们可以使用ext子指令仅压缩某些文件类型,或者水平子指令来控制压缩的水平(一是最低,九是最高)。

1[label /etc/caddy/Caddyfile]
2:80 {
3    root /var/www
4    gzip {
5        ext .html .htm .php
6        level 6
7    }
8}

例如, fastcgi指令可用于启用 PHP. markdown指令可用于自动将Markdown文件转换为HTML,在服务之前,这可能对创建一个简单的博客有用。

保存并关闭Caddyfile,并测试一切正常工作。使用systemctl启动Caddy服务:

1sudo systemctl start caddy

接下来,运行systemctl status以查找有关Caddy服务的状态的信息:

1sudo systemctl status caddy

你会看到以下:

 1[secondary_label Output]
 2 caddy.service - Caddy HTTP/2 web server
 3   Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: enabled)
 4   Active: active (running) since Sat 2018-01-27 11:37:06 UTC; 7min ago
 5     Docs: https://caddyserver.com/docs
 6 Main PID: 2973 (caddy)
 7    Tasks: 6
 8   Memory: 3.2M
 9      CPU: 24ms
10   CGroup: /system.slice/caddy.service
11           └─2973 /usr/local/bin/caddy -log stdout -agree=true -conf=/etc/caddy/Caddyfile -root=/var/tmp
12
13Jan 27 11:37:06 caddy-tutorial-testing-0 systemd[1]: Started Caddy HTTP/2 web server.
14Jan 27 11:37:06 caddy-tutorial-testing-0 caddy[2973]: Activating privacy features... done.
15Jan 27 11:37:06 caddy-tutorial-testing-0 caddy[2973]: http://
16Jan 27 11:37:06 caddy-tutorial-testing-0 caddy[2973]: 2018/01/27 11:37:06 http://

如果你浏览你的域,你现在应该看到Caddy正在运行,你的样本网页应该显示. 确认此后,使用‘systemctl’来停止Caddy服务,因为还有一些更改要做:

1sudo systemctl stop caddy

虽然Caddy默认情况下包含许多指令,但它不能满足每个可能的使用情况,您可能想为服务器添加更多的功能。

步骤4:使用插件

插件是改变Caddy的行为的一种方式. 它们通常是我们可以插入Caddy的代码的小片,以便为特定用例添加更多指示。 理解插件的最简单的方法是直接跳进并尝试一个,所以我们会安装minify插件。 这个插件从一些文件中删除过剩的白空间和多余的代码,减少每个文件的大小,再一次,有助于加速加载时间。

首先,回到Go保存了Caddy的源代码的地方,因为您需要修改此功能来安装插件:

1cd $GOPATH/src/github.com/mholt/caddy

正如我们之前所说的,这是Caddy运行的第一个部分之一,这是插件安装的位置。

1nano caddy/caddymain/run.go

在此文件中,您将看到一个进口声明,它看起来像这样:

 1[label $GOPATH/src/github.com/mholt/caddy/caddy/caddymain/run.go]
 2. . .
 3import (
 4    "errors"
 5    "flag"
 6    "fmt"
 7    "io/ioutil"
 8    "log"
 9    "os"
10    "runtime"
11    "strconv"
12    "strings"
13
14    "gopkg.in/natefinch/lumberjack.v2"
15
16    "github.com/xenolf/lego/acmev2"
17
18    "github.com/mholt/caddy"
19    // plug in the HTTP server type
20    _ "github.com/mholt/caddy/caddyhttp"
21
22    "github.com/mholt/caddy/caddytls"
23    // This is where other plugins get plugged in (imported)
24)
25. . .

要安装一个插件,请在这个导入指令中添加_github.com/path/to/plugin`。某些插件可能需要一些微小的配置调整,所以请确保阅读您安装的任何插件的文档。

minify插件的GitHub存储库是 hacdias/caddy-minify,所以在进口声明的底部添加以下内容:

1[label $GOPATH/github.com/mholt/caddy/caddy/caddymain/run.go]
2. . .
3import (
4    . . .
5    "github.com/mholt/caddy/caddytls"
6    // This is where other plugins get plugged in (imported)
7
8    _ "github.com/hacdias/caddy-minify"
9)

当你对它进行更改时,你需要执行代码,以便在任何新更新中合并时,这些更改不会丢失. 如果你以前没有在这个服务器上执行代码,你需要设置一个名称和电子邮件,以便Git可以在日志中识别你。

1git config --global user.email "[email protected]"
2git config --global user.name "Sammy"

现在你已经设置了用户名和电子邮件,可以通过执行以下操作将你所更改的任何文件添加到 Git 的 stage(用于存储代码状态的缓存):

1git add -A .

现在运行git commit来保存您的更改到当前分支。-m选项允许您设置一个 commit 消息,以便您可以记录您所做的更改。

1git commit -m "Added minify plugin"

您现在在代码中有通往插件的路径,但您仍然需要本地下载插件,以便Go实际上可以访问它. 此命令将自动从$GOPATH/src/github.com/mholt/caddy目录中运行时检索 Caddy 的所有依赖:

1go get ./...

每次你添加一个新的插件,你必须重建Caddy,这是因为Go是一个编程语言,这意味着源代码在执行之前被转换为机器代码。

使用去安装命令来编译 Caddy:

1go install github.com/mholt/caddy/caddy

如果Caddy建成成功,此命令将无输出,将生成的二进制复制到/usr/local/bin,并像以前一样为二进制设置权限 - 您必须每次重建Caddy时执行这些步骤,以确保其功能和安全性。

1sudo cp $GOPATH/bin/caddy /usr/local/bin/
2sudo chown root:root /usr/local/bin/caddy
3sudo chmod 755 /usr/local/bin/caddy
4sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/caddy

要证明插件已成功安装,请打开您的Caddyfile

1sudo nano /etc/caddy/Caddyfile

通过在配置块中添加以下行来激活插件:

1[label /etc/caddy/Caddyfile]
2:80 {
3    root /var/www
4    gzip
5    minify
6}

现在启动您的服务器使用systemctl:

1sudo systemctl start caddy

现在Caddy正在运行,它将缩小它所服务的任何文件,包括您之前创建的‘index.html’文件。您可以使用cURL,一个命令行工具来观察工作中的‘minification’。运行‘curl’没有选项或旗帜,将收集网页的内容,并在终端中显示它。运行以下命令,请求Caddy的‘index.html’文件,以您的域代替‘example.com’。

1curl http://example.com

请注意,所有不必要的空间已经被删除,这表明minify插件已经起作用。

1[secondary_label Output]
2<!doctype html><title>Hello from Caddy!</title><h1 style=font-family:sans-serif>This page is being served via Caddy</h1>

同樣的安裝方法也會適用於其他 Caddy 插件,您將通過安裝 tls.dns.digitalocean 插件來自動啟用安全的 HTTPS 流量來增加插件。

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

Caddy 默认情况下使用 Let's Encrypt 启用 HTTPS,这是有用的,因为它很容易获得 HTTPS 的详细信息错误。Caddy 对 HTTPS 的方法是安全的,并且不会迫使您深入配置来加密您的流量。然而,Caddy 默认情况下使用HTTP-01方法来验证使用 Let's Encrypt 您是否实际上拥有您的域。 这种方法涉及将一个特殊文件(包含一个由 Let's Encrypt 发送的挑战的响应)发送到网站上的特定位置。 虽然这种方法有效,但它需要您的网站公开访问。 这是某些防火墙配置的问题,或者如果您正在为您的业务运行 Caddy 作为内部服务。

作为替代方案,您可以安装tls.dns.digitalocean Caddy 插件,该插件将使用DNS-01验证方法。 该插件通过为您的域名添加一个新的TXT DNS 记录来验证,这不会影响您的网站的功能。 它使用 DigitalOcean 的 API 来控制 DNS,这使您能够灵活地获取证书,即使您的服务器无法公开访问。 有关不同类型的 DNS 记录的更多信息,请阅读我们的 DigitalOcean DNS 介绍

安装tls.dns.digitalocean Caddy 插件的方法几乎与您安装minify插件的方式相同。 首先,打开$GOPATH/src/github.com/mholt/caddy/caddy/caddymain/run.go:

1nano $GOPATH/src/github.com/mholt/caddy/caddy/caddymain/run.go

添加插件的位置:

 1[label $GOPATH/github.com/mholt/caddy/caddy/caddymain/run.go]
 2. . .
 3import (
 4    . . .
 5    "github.com/mholt/caddy/caddytls"
 6    // This is where other plugins get plugged in (imported)
 7
 8    _ "github.com/hacdias/caddy-minify"
 9    _ "github.com/caddyserver/dnsproviders/digitalocean"
10)

要更新 Caddy,请导航 Caddy 的源存储库,并对 Git 进行更改:

1cd $GOPATH/src/github.com/mholt/caddy
2git add -A .
3git commit -m "Add DigitalOcean DNS provider"

接下来,安装所有依赖并构建Caddy,就像您之前所做的那样:

1go get ./...
2go install github.com/mholt/caddy/caddy

确保Caddy通过systemctl停止,然后通过复制新建的Caddy二进制来完成插件的安装,并再次设置其所有权和权限:

1sudo systemctl stop caddy
2sudo cp $GOPATH/bin/caddy /usr/local/bin/
3sudo chown root:root /usr/local/bin/caddy
4sudo chmod 755 /usr/local/bin/caddy
5sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/caddy

接下来,配置 Caddy 以使用 DigitalOcean 的 API 来设置 DNS 记录。 导航到您的 DigitalOcean 帐户中的 API 卡(https://cloud.digitalocean.com/settings/api),然后选择 Generate New Token:

The DigitalOcean Applications & API page

给你的代币一个描述性名称(例如‘caddy-dns’),并确保选中 Write (optional)

Creating a Personal Access Token

点击生成的代币来复制它,并在某个地方保存它,你不会失去它。Caddy需要访问这个代币作为环境变量来配置DigitalOcean的DNS。 systemd的服务文件允许你定义环境变量,以包括在过程的环境中。编辑Caddy服务文件在`/etc/systemd/system/``目录中,而不是Caddy Git存储库中的版本。添加你的API密钥到Git存储库以外的文件版本,以避免意外地将私人代币发送到公共Caddy存储库:

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

[服务]部分中找到以环境=开头的行,该行定义了应该传递到Caddy过程的环境变量,在该行末尾添加一个空间,然后添加一个DO_AUTH_TOKEN变量,然后添加你刚刚生成的代币:

 1[label /etc/systemd/system/caddy.service]
 2[Service]
 3Restart=on-abnormal
 4
 5; User and group the process will run as.
 6User=www-data
 7Group=www-data
 8
 9; Letsencrypt-issued certificates will be written to this directory.
10Environment=CADDYPATH=/etc/ssl/caddy DO_AUTH_TOKEN=your_token_here

保存并关闭此文件,然后像之前一样重新加载 systemd daemon,以确保配置更新:

1sudo systemctl daemon-reload

运行systemctl状态,检查您的配置更改是否正常:

1sudo systemctl status caddy

这将产生类似于以下的输出。 仔细关注开始于加载的行。 加载状态表明您对服务配置的更改取得了成功。 如果在配置 systemd 服务时出现错误,则此行会显示错误状态,并解释为什么 systemd 无法解释服务文件。 接下来的行,开始于活跃:表示服务是否正在运行。 因为您在此步骤中早些时候停止了 Caddy,因此显示了不活跃。 当 Caddy 运行时,此行将显示启用运行

1[secondary_label Output]
2 caddy.service - Caddy HTTP/2 web server
3   Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: enabled)
4   Active: inactive (dead)
5     Docs: https://caddyserver.com/docs

您需要对您的Caddyfile做一些轻微的更改,所以打开它来编辑:

1sudo nano /etc/caddy/Caddyfile

将突出的行添加到Caddyfile,确保将example.com替换为您的域名。 使用域名而不是仅仅是主机名称的端口将导致Caddy通过HTTPS服务请求。 tls指令配置Caddy在使用TLS时的行为,而dns子指令规定Caddy应该使用DNS-01系统而不是HTTP-01:

1[label /etc/caddy/Caddyfile]
2example.com {
3    root /var/www
4    gzip
5    minify
6    tls {
7        dns digitalocean
8    }
9}

您的网站已准备好部署,首先,请用systemctl启动服务器,然后启用服务器。

1sudo systemctl start caddy
2sudo systemctl enable caddy

如果你浏览到你的域,你应该被自动重定向到HTTPS。

您的 Caddy 安装是完整的和安全的。接下来,我们将看看如何在发布新版本时更新 Caddy. 当您使用包管理器安装软件时,更新通常就像运行单个命令一样简单,而且操作系统通常可以自动安装安全更新。

步骤 6 – 更新您的 Caddy 安装

保持软件的更新是重要的安全实践,因为过时的软件往往有漏洞。运行最新版本的Caddy将保护您免受服务器的安全受到威胁,通过任何可能存在于较旧版本的漏洞。

我们将使用Git来更新源代码的状态,首先,更改到caddy源目录:

1cd $GOPATH/src/github.com/mholt/caddy

确保您在您在步骤 1 中创建的分支中使用git checkout:

1git checkout adding_plugins

接下来,使用git fetch将更改从远程存储库中拉出来。当 Git 克隆 Caddy 存储库时,它将保持链接到 _upstream 存储库 - 变化起源的中心位置。

1git fetch origin

对存储库的更改现在在您的系统上存在,存储在不同的分支下。 使用git tag来查看最新的版本,因为您仍然应该使用Caddy的发布版本,而不是在发布之间使用代码:

1git tag

就像以前一样,浏览列表,直到你找到最新的版本。Git 包含一个工具来合并两个不同的代码分支――git merge。 输入以下内容,将最新版本的更改合并到你的工作分支中。

1git merge adding_plugins v0.10.13

一个编辑器会出现,你可以保存并接近完成合并,但是,可能会出现合并冲突,Git无法弄清楚两个不同的代码版本应该如何匹配在一起。

假设没有合并冲突,请通过您在本教程中遵循的相同过程重新安装Caddy。

1go install github.com/mholt/caddy/caddy

接下来,停止Caddy服务并复制新的二进制:

1sudo systemctl stop caddy
2sudo cp $GOPATH/bin/caddy /usr/local/bin/

设置二进制的权限:

1sudo chown root:root /usr/local/bin/caddy
2sudo chmod 755 /usr/local/bin/caddy
3sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/caddy

最后,使用systemctl重新启动Caddy服务:

1sudo systemctl start caddy

Caddy 将继续在未来启动,因为它尚未被禁用,因此,Caddy 已成功更新到最新版本,并且应该继续不间断地工作,至少直到下一个版本。

结论

通过遵循本教程,您已经成功部署了使用Caddy的网站。一个很好的下一步就是在发布Caddy的新版本时找到一种通知的方式。例如,您可以使用 Atom feed for Caddy releases,或像 Sibbell这样的专用服务。创建一个脚本来自动更新服务器的过程也是一个好主意 — 您甚至可以将两者结合起来,并创建一个自动重建Caddy的新版本时的构建工具。

Published At
Categories with 技术
comments powered by Disqus