如何在CentOS 7上托管与Caddy的网站

[Caddy](https://caddyserver.com/)是一种新的网络服务器,可以用于代替Apache或Nginx来提供网站。它已经被轻松创建,并且已成为那些想要快速运行网站,而无需处理困难的配置文件的开发人员的常见选择。在本教程中,您将安装和配置Caddy。遵循本教程后,您将使用HTTP / 2和安全的TLS连接提供一个简单的工作网站。

介绍

Caddy是一种新的Web服务器,易于使用,创建于此。 它很简单,可以用作快速开发服务器,足够强大,可以在生产环境中使用。

它具有直观的配置文件,HTTP / 2支持和自动TLS加密功能。 HTTP / 2是HTTP协议的新版本,通过使用单个连接来传输多个文件和头压缩等其他功能,使网站更快速。 TLS用于为通过安全连接加密的网站提供服务,而在互联网上被广泛采用时,通常手动获取和安装证书是一件麻烦。

凯迪与Let's Encrypt密切合作,认证机构提供免费的TLS / SSL证书,并在需要时自动获得和更新证书。 换句话说,Caddy提供的每个网站都可以通过安全连接自动提供服务,无需额外的配置或操作。

在本教程中,您将安装和配置Caddy。 遵循本教程后,您将使用HTTP / 2和安全的TLS连接提供一个简单的工作网站。

先决条件

要遵循本教程,您将需要:

  • 一个CentOS 7服务器设置了这个初始服务器设置教程 ,包括一个sudo非root用户。
  • 配置为指向服务器的域名。 这对于Caddy获取网站的SSL证书是必要的; 不使用适当的域名,该网站将不会安全地使用TLS加密。 您可以通过遵循如何使用DigitalOcean设置主机名来学习如何将域指向DigitalOcean Droplet。
  • 可选地, sudo yum install nanosudo yum install nanonano文本编辑器sudo yum install nano 默认情况下,CentOS配有vi文本编辑器,但nano可以更加用户友好。

第1步 - 安装球童二进制文件

Caddy项目提供了一个安装脚本,可以检索和安装Caddy服务器的二进制文件。 要执行它,请键入:

curl -s https://getcaddy.com | bash

您可以在浏览器中访问https://getcaddy.com或者在执行之前使用wgetcurl下载文件来查看脚本。

在安装过程中,脚本将使用sudo获取管理权限,以便将Caddy文件放在系统范围的目录中,因此可能会提示您输入密码。

命令输出将如下所示:

Downloading 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

脚本完成后,系统会将二进制文件安装在服务器上并准备使用。 您可以通过使用which来检查其位置which以验证球童二进制文件的位置。

which caddy

命令输出将说明可以在/usr/local/bin/caddy找到Caddy二进制文件。

Caddy在安装过程中不会创建任何系统范围的配置,并且不会将其本身作为服务进行安装,这意味着它不会在启动过程中自动启动。 在接下来的几个步骤中,我们将创建与Caddy一起使用的用户帐户,Caddy需要功能和安装其服务文件。

第2步 - 为球童创建用户和组

虽然Apache和Nginx是两个最受欢迎的HTTP服务器,但是在系统包安装过程中创建了自己的非特权用户,但是Caddy并没有这样做。 出于安全考虑,不应该使用超级root帐户启动。 在这个步骤中,我们将创建一个专用的用户名,它将仅用于运行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需要这个来存储从我们加密中自动获得的SSL私钥和证书。

sudo mkdir /etc/ssl/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

该目录应该完全由球童所有

sudo chown caddy:caddy /var/www

你现在已经准备好了为Caddy运行所必需的环境。 在下一步中,我们将配置Caddy作为系统服务,以确保系统启动,并可以使用systemctl进行管理。

第4步 - 安装凯迪作为系统服务

当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

保存并关闭文件退出。 服务文件现在可以在我们的安装中使用了。 使系统感知新的服务文件。

sudo systemctl daemon-reload

然后,启用Caddy在启动时运行。

sudo systemctl enable caddy.service

您可以通过检查其状态来验证服务是否已正确加载并启用。

sudo systemctl status caddy.service

输出应如下所示:

● 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配置为系统服务,将在启动时自动启动,而无需手动运行。 接下来,我们将允许通过防火墙的Web流量。

第5步 - 允许HTTP和HTTPS连接(可选)

如果您已经遵循新的CentOS 7服务器的其他推荐步骤教程,并且正在使用防火墙,我们必须手动添加防火墙规则以将互联网流量传递给Caddy。

Caddy使用HTTP和HTTPS协议提供网站,因此我们需要允许访问相应的端口,以便使网路可以从网路获取。

sudo firewall-cmd --permanent --zone=public --add-service=http 
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload

所有三个命令在运行时将输出以下成功消息:

success

这样可以让凯蒂自由地向观众提供网站。 在下一步中,我们将创建一个示例网页,并更新Caddyfile ,以便测试Caddy的安装。

第6步 - 创建一个测试网页和一个球童文件

让我们开始创建一个非常简单的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的形式protocol :// host : port 如果您将某些字段留空,Caddy将自行承担一些默认值。 例如,如果您指定协议而不是端口,则后者将自动导出(即假设HTTP为80端口,HTTPS为443端口)。 管理地址格式的规则在官方的Caddyfile文档有详细描述

使用vi或您最喜欢的文本编辑器打开您在第2步中创建的Caddyfile

sudo vi /etc/caddy/Caddyfile

粘贴以下内容:

的/ etc /盒/ Caddyfile
http:// {
    root /var/www
    gzip
}

然后保存文件并退出。 我们来解释一下这个具体的Caddyfile

在这里,我们使用http ://作为地址定义。 这告诉Caddy它应该绑定到端口80 ,并使用纯HTTP协议(无TLS加密)提供所有请求,而不管用于连接到服务器的域名。 这将允许您使用服务器的IP地址访问Caddy正在托管的网站。

在我们服务器块的大括号内,有两个指令:

  • 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必须能够将其绑定到端口443用于HTTPS,并且必须可以从互联网访问相同的端口。
  • 协议不能设置为HTTP,端口不能设置为80 ,并且不能使用其他设置显式关闭或覆盖TLS(例如服务器端口中的tls指令)。
  • 主机名必须是有效的域名; 它不能不空或设置为localhost或IP地址。 这是必要的,因为我们加密只能颁发证书到有效的域名。
  • 凯迪必须知道可以用于密钥恢复的电子邮件地址,让我们加密。

如果您一直在关注本教程,则第一个要求已经满足。 但是,当前服务器块地址被简单地配置为http :// ,定义了没有加密的纯HTTP方案,也没有定义域名。 我们还没有为Caddy提供一个电子邮件地址,让我们加密需要在申请证书时。 如果配置中没有提供地址,则Caddy在启动过程中会要求它。 但是,由于Caddy作为系统服务安装,所以在启动过程中不能提出问题,结果根本就不能正常启动。

要解决此问题,请再次打开Caddyfile进行编辑。

sudo vi /etc/caddy/Caddyfile

首先,用您的域替换http://的地址定义。 这将消除HTTP强制的不安全连接,并提供TLS证书的域名。 其次,使用服务器块内的tls指令为Caddy提供一个电子邮件地址。

修改后的Caddyfile应如下所示,您的域名和电子邮件地址替换为:

的/ etc /盒/ Caddyfile
example.com {
    root /var/www
    gzip
    tls sammy@example.com
}

保存文件并退出编辑器。 要应用更改,请重新启动Caddy。

sudo systemctl restart caddy

现在将您的浏览器指向https:// example.com以验证更改是否正确应用。 如果是这样,你应该再次看到Hello World! 页。 这次您可以通过查看网址或网址栏中的锁定符号来检查网站是否通过HTTPS提供服务。

结论

您现在已经配置了Caddy,通过安全的TLS连接正确地为您的网站提供服务。 它将自动获取和续订“加密”证书,并通过使用较新的HTTP / 2协议的安全连接为您的站点提供服务,并通过使用gzip压缩来减少加载时间。

这是一个简单的例子来开始使用凯迪。 您可以在Caddy的官方 Caddyfile中了解Caddy的独特功能和配置指令