介绍
Caddy 是一个新的 Web 服务器,其创建时考虑到了易用性。 它足够简单,可以用作快速开发服务器,并且足够强大,可以在生产环境中使用。
它具有直观的配置文件、HTTP/2 支持和自动 TLS 加密。 HTTP/2 是 HTTP 协议的新版本,它通过使用单连接传输多个文件和标头压缩等功能使网站更快。 TLS 用于通过安全连接为网站提供加密服务,虽然它已在 Internet 上广泛采用,但手动获取和安装证书通常很麻烦。
Caddy 与 Let's Encrypt 紧密集成,后者是一个提供免费 TLS/SSL 证书并在需要时自动获取和更新证书的证书颁发机构。 换句话说,Caddy 服务的每个网站都可以通过安全连接自动提供服务,无需额外的配置或操作。
在本教程中,您将安装和配置 Caddy。 完成本教程后,您将拥有一个使用 HTTP/2 和安全 TLS 连接提供服务的简单工作网站。
先决条件
要遵循本教程,您将需要:
- 使用 this initial server setup tutorial 设置的一台 CentOS 7 服务器,包括 sudo 非 root 用户。
- 配置为指向您的服务器的域名。 这是 Caddy 为网站获取 SSL 证书所必需的; 如果不使用正确的域名,将无法通过 TLS 加密安全地为网站提供服务。 您可以按照 如何使用 DigitalOcean 教程设置主机名来学习如何将域指向 DigitalOcean Droplets。
- 可选地,与
sudo yum install nano
一起安装的nano
文本编辑器。 CentOS 默认自带vi
文本编辑器,但nano
可以更人性化。
第 1 步 — 安装 Caddy 二进制文件
Caddy 项目提供了一个安装脚本,它将检索和安装 Caddy 服务器的二进制文件。 要执行它,请键入:
curl -s https://getcaddy.com | bash
您可以在浏览器中访问https://getcaddy.com
查看脚本,或者在执行之前使用wget
或curl
下载文件。
在安装过程中,脚本将使用 sudo
获得管理权限,以便将 Caddy 文件放在系统范围的目录中,因此它可能会提示您输入密码。
命令输出将如下所示:
Caddy installation script outputDownloading Caddy for linux/amd64... https://caddyserver.com/download/linux/amd64?plugins= Extracting... Putting caddy in /usr/local/bin (may require password) [sudo] password for sammy: Caddy 0.10.2 Successfully installed
脚本完成后,Caddy 二进制文件将安装在服务器上并可供使用。 您可以通过使用 which
检查其位置来验证 Caddy 二进制文件是否已放置到位。
which caddy
命令输出将显示 Caddy 二进制文件可以在 /usr/local/bin/caddy
中找到。
Caddy 在安装过程中不会创建任何系统范围的配置,也不会将自身安装为服务,这意味着它不会在引导过程中自动启动。 在接下来的几个步骤中,我们将创建用于 Caddy 的用户帐户,这些文件是 Caddy 运行和安装其服务文件所需的文件。
第 2 步 — 为 Caddy 创建用户和组
虽然 Apache 和 Nginx 这两个最流行的 HTTP 服务器在从系统包安装期间创建自己的非特权用户,但 Caddy 不会这样做。 出于安全原因,也不应该使用超级用户 root
帐户启动它。 在这一步中,我们将创建一个名为 caddy
的专用用户,该用户将仅用于运行 Caddy 并访问其文件。
要创建名为 caddy
的用户,请输入:
sudo adduser -r -d /var/www -s /sbin/nologin caddy
-r
开关使新创建的帐户成为所谓的系统帐户,-d
开关表示此用户的主目录,在我们的例子中它将是 /var/www
我们将稍后创建。 非特权用户应该无法登录和访问系统 shell,我们通过 -s
开关将所需的 shell 设置为 /sbin/nologin
来确保这一点,这是一个不允许系统登录的系统命令。 最后一个参数是用户名本身——在我们的例子中是 caddy
。
现在,当我们有 Caddy Web 服务器的用户可用时,我们可以在下一步配置必要的目录来存储 Caddy 配置文件。
第 3 步 — 设置必要的目录
Caddy 的自动 TLS 支持和单元文件(我们将在下一步安装)期望特定目录和文件以特定权限存在。 我们将在这一步中创建它们。
首先,创建一个目录来存放主要的 Caddyfile
,这是一个配置文件,它告诉 Caddy 它应该服务哪些网站以及如何服务。
sudo mkdir /etc/caddy
将此目录的所有者更改为 root 用户并将其组更改为 www-data 以便 Caddy 可以读取它。
sudo chown -R root:caddy /etc/caddy
在此目录中,创建一个空的 Caddyfile
,稍后我们将对其进行编辑。
sudo touch /etc/caddy/Caddyfile
在 /etc/ssl
中创建另一个目录。 Caddy 需要它来存储它自动从 Let's Encrypt 获得的 SSL 私钥和证书。
sudo mkdir /etc/ssl/caddy
Caddy 在获取证书时需要能够写入该目录,因此将所有者设为 caddy 用户。 您可以将组保留为 root,与默认值保持不变:
sudo chown -R caddy:root /etc/ssl/caddy
然后通过删除其他人的所有访问权限来确保没有其他人可以读取这些文件。
sudo chmod 0770 /etc/ssl/caddy
我们需要创建的最后一个目录是网站本身将被发布的目录。 我们将使用 /var/www
,这是习惯的,也是使用其他 Web 服务器(如 Apache 或 Nginx)时的默认路径。
sudo mkdir /var/www
此目录应完全归 caddy 所有。
sudo chown caddy:caddy /var/www
您现在已经为 Caddy 运行准备了必要的环境。 在下一步中,我们会将 Caddy 配置为系统服务,以确保它在系统启动时启动,并且可以使用 systemctl
进行管理。
第 4 步 — 将 Caddy 安装为系统服务
虽然 Caddy 不会将自身安装为服务,但该项目提供了官方的 systemd 单元文件 。 该文件确实采用了我们在上一步中设置的目录结构,因此请确保您的配置匹配。
从官方 Caddy 存储库下载文件。 curl
命令的附加 -o
参数会将文件保存在 /etc/systemd/system/
目录中,并使其对 systemd
可见。
sudo curl -s https://raw.githubusercontent.com/mholt/caddy/master/dist/init/linux-systemd/caddy.service -o /etc/systemd/system/caddy.service
在我们继续之前,我们必须稍微修改文件以使其使用我们的非特权 caddy
用户来运行服务器。
让我们用 vi
或您喜欢的文本编辑器打开文件(这里是 vi 的简短介绍)
sudo vi /etc/systemd/system/caddy.service
并找到负责指定用户帐户和组的片段。
/etc/systemd/system/caddy.service
; User and group the process will run as. User=www-data Group=www-data
将这两个值更改为 caddy
,如下所示:
/etc/systemd/system/caddy.service
; User and group the process will run as. User=caddy Group=caddy
保存并关闭文件以退出。 服务文件现在已准备好与我们的安装一起使用。 使 systemd
知道新的服务文件。
sudo systemctl daemon-reload
然后,使 Caddy 在启动时运行。
sudo systemctl enable caddy.service
您可以通过检查其状态来验证该服务是否已正确加载并启用以在启动时启动。
sudo systemctl status caddy.service
输出应如下所示:
Caddy service status output● caddy.service - Caddy HTTP/2 web server Loaded: loaded (/etc/systemd/system/caddy.service; enabled; vendor preset: disabled) Active: inactive (dead) Docs: https://caddyserver.com/docs
具体来说,它表示该服务已 已加载 和 已启用 ,但尚未运行。 我们还不会启动服务器,因为配置仍然不完整。
您现在已将 Caddy 配置为系统服务,该服务将在启动时自动启动,无需手动运行。 接下来,我们将允许网络流量通过防火墙。
第 5 步 — 允许 HTTP 和 HTTPS 连接(可选)
如果您也遵循 新 CentOS 7 服务器的附加推荐步骤 教程并且正在使用防火墙,我们必须手动添加防火墙规则以将互联网流量传递到 Caddy。
Caddy 使用 HTTP 和 HTTPS 协议为网站提供服务,因此我们需要允许访问适当的端口,以使 Caddy 可以从 Internet 访问。
sudo firewall-cmd --permanent --zone=public --add-service=http sudo firewall-cmd --permanent --zone=public --add-service=https sudo firewall-cmd --reload
所有三个命令在运行时都会输出以下成功消息:
firewall-cmd outputsuccess
这将允许 Caddy 自由地为访问者提供网站服务。 在下一步中,我们将创建一个示例网页并更新 Caddyfile
以提供服务,以测试 Caddy 安装。
第 6 步 - 创建测试网页和 Caddyfile
让我们从创建一个非常简单的 HTML 页面开始,它将显示一个普通的 Hello World! 消息。 此命令将在我们之前创建的网站目录中创建一个 index.html
文件,其中只有一行文本 <h1>Hello World!</h1>
。
echo '<h1>Hello World!</h1>' | sudo tee /var/www/index.html
接下来,我们将填写Caddyfile
。 Caddyfile
,以其最简单的形式,由一个或多个 服务器块 组成,每个块定义单个网站的配置。 服务器块以地址定义开头,后跟花括号。 在花括号内,您可以包含配置指令以应用于该网站。
地址定义 以 protocol://host:port
的形式指定。 如果您将某些字段留空,Caddy 将自行假定一些默认值。 例如,如果您指定协议而不指定端口,则会自动派生后者(即 端口 80
假定用于 HTTP,端口 443
假定用于 HTTPS)。 管理地址格式的规则在官方Caddyfile文档中有深入描述。
使用 vi
或您喜欢的文本编辑器打开您在第 2 步中创建的 Caddyfile
。
sudo vi /etc/caddy/Caddyfile
粘贴以下内容:
/etc/caddy/Caddy 文件
http:// { root /var/www gzip }
然后保存文件并退出。 让我们解释一下这个特定的 Caddyfile
做了什么。
在这里,我们使用 http://
来定义地址。 这告诉 Caddy 它应该绑定到端口 80
并使用纯 HTTP 协议(没有 TLS 加密)服务所有请求,而不管用于连接到服务器的域名如何。 这将允许您使用您的服务器的 IP 地址访问 Caddy 托管的网站。
在我们的 server 块的花括号内,有两个指令:
root
指令告诉 Caddy 网站文件的位置。 在我们的示例中,它是/var/www
,我们在其中创建了测试页面。gzip
指令告诉 Caddy 使用 Gzip 压缩来使网站更快。 它不需要额外的配置。
配置文件准备好后,启动 Caddy 服务。
sudo systemctl start caddy
我们现在可以测试网站是否正常工作。 为此,您使用服务器的公共 IP 地址。 如果您不知道您的服务器的 IP 地址,您可以使用 curl -4 icanhazip.com
获取它。 拥有它后,在您喜欢的浏览器中访问 http://your_server_ip
以查看 Hello World! 网站。
这意味着您的 Caddy 安装工作正常。 在下一步中,您将使用 Caddy 的自动 TLS 支持启用与您网站的安全连接。
第 7 步 — 配置自动 TLS
Caddy 与其他 Web 服务器的主要区别之一是它能够自动从免费证书颁发机构 (CA) Let's Encrypt 请求和更新 TLS 证书。 此外,将 Caddy 设置为通过安全连接自动为网站提供服务只需要在 Caddyfile
中更改一行。
假设服务器块配置满足某些要求,Caddy 负责为所有已配置的服务器块启用安全 HTTPS 连接并自动获取必要的证书。
为了使 TLS 工作,必须满足以下要求:
- Caddy 必须能够为 HTTPS 将自身绑定到端口
443
,并且必须可以从 Internet 访问相同的端口。 - 协议不得设置为 HTTP,端口不得设置为
80
,且 TLS 不得显式关闭或被其他设置覆盖(例如 使用服务器块中的tls
指令)。 - 主机名必须是有效的域名; 它不能为空或设置为
localhost
或 IP 地址。 这是必要的,因为 Let's Encrypt 只能向有效域名颁发证书。 - Caddy 必须知道可用于使用 Let's Encrypt 恢复密钥的电子邮件地址。
如果您一直在学习本教程,那么第一个要求已经满足。 但是,当前服务器块地址被简单地配置为 http://
,定义了一个没有加密和域名的普通 HTTP 方案。 我们也没有向 Caddy 提供 Let's Encrypt 在请求证书时需要的电子邮件地址。 如果配置中没有提供地址,Caddy 会在启动时要求提供。 但是,由于 Caddy 是作为系统服务安装的,它在启动过程中无法提问,结果根本无法正常启动。
要解决此问题,请再次打开 Caddyfile
进行编辑。
sudo vi /etc/caddy/Caddyfile
首先,将 http://
的地址定义替换为您的域。 这消除了 HTTP 强制的不安全连接,并为 TLS 证书提供了一个域名。 其次,使用服务器块内的 tls
指令为 Caddy 提供一个电子邮件地址。
修改后的 Caddyfile
应如下所示,并将您的域和电子邮件地址替换为:
/etc/caddy/Caddy 文件
example.com { root /var/www gzip tls sammy@example.com }
保存文件并退出编辑器。 要应用更改,请重新启动 Caddy。
sudo systemctl restart caddy
现在将浏览器指向 https://example.com
以验证更改是否正确应用。 如果是这样,您应该再次看到 Hello World! 页面。 这一次,您可以通过查看 URL 或 URL 栏中的锁定符号来检查网站是否使用 HTTPS。
结论
您现在已将 Caddy 配置为通过安全的 TLS 连接正确地为您的网站提供服务。 它将自动从 Let's Encrypt 获取和更新证书,使用较新的 HTTP/2 协议通过安全连接为您的站点提供服务,并通过使用 gzip 压缩减少加载时间。
这是一个开始使用 Caddy 的简单示例。 您可以在 官方 Caddy 文档 中阅读更多关于 Caddyfile
的 Caddy 独特功能和配置指令。