前几天用 Netmaker 的时分发现它用 Caddy 替换掉了 Nginx,用了后发现的确简略好用,就安利一下。

Caddy 是一个强壮的、可扩展的渠道,用 Go 编写,能够为你的站点、服务和应用程序供给服务。假如你是 Caddy 的新手,你服务网络的办法将会改动。

导言

大多数人运用 Caddy 作为网络服务器或署理,但在其核心,Caddy 是一个服务器的服务器(a server of servers)。通过必要的模块,它能够承当任何长时刻运转的进程的角色!

装备是动态的和可通过 Caddy 的 API 导出 。尽管不需求装备文件,可是您仍然能够运用它们; 大多数人最喜欢的装备 Caddy 的办法是运用 Caddyfile。装备文档的格局通过装备适配器选用多种形式,但 Caddy 的本地装备语言是 JSON

Caddy 为一切干流渠道编译,并且没有运转时依靠项。

新手指南

咱们建议每个人不论经验怎么都要看一下咱们的入门指南。它将为你供给一个全面的视角来看待你的新网络服务器,这对你持续学习是无价的。本教程将探索运用 Caddy 的基础常识,并帮助您在更高的层次上了解它。

意图:

  • 运转看护进程
  • 试试 API
  • 给 Caddy 一个装备
  • 测验装备
  • 制造一个 Caddyfile
  • 运用装备适配器(config adapter)
  • 从一个初始装备开端
  • 比较 JSON 和 Caddyfile
  • 比较 API 和装备文件
  • 在后台运转
  • 零停机时刻装备重载

先决条件

  • 已安装 caddycurl(安装 Caddy 能够参阅这儿)

要发动 Caddy 作为一个看护程序,运用 run 子指令:

caddy run

默许情况下,Caddy 的装备(“ config”)为空。咱们能够运用另一个终端拜访办理 API 来验证这一点:

curl localhost:2019/config/

{% note info %}
ℹ️ 信息

上面地址不是你的网站,localhost:2019 是用来操控 Caddy 的办理端点,并被默许限制为本机拜访。
{% endnote %}

咱们能够通过给它一个装备来使 Caddy 变得有用。这能够通过多种办法完结,可是咱们将在下一节运用 curl/load 端点宣布 POST 恳求。

你的榜首个装备

为了预备咱们的恳求,咱们需求做一个装备。

将其保存到 JSON 文件中(例如 caddy.JSON) :

{
	"apps": {
		"http": {
			"servers": {
				"example": {
					"listen": [":2015"],
					"routes": [
						{
							"handle": [{
								"handler": "static_response",
								"body": "Hello, world!"
							}]
						}
					]
				}
			}
		}
	}
}

然后上传:

curl localhost:2019/load \
	-X POST \
	-H "Content-Type: application/json" \
	-d @caddy.json

咱们能够通过如下指令验证 Caddy 将咱们的新装备应用到另一个 GET 恳求:

curl localhost:2019/config/

然后测验新的装备:

$curl localhost:2015
Hello, world!

假如你看到 Hello, world! 那祝贺了,成功了!确保装备按预期的办法作业总是一个好主意,尤其是在部署到生产环境之前。

你的榜首个 Caddyfile

另一种装备 Caddy 的办法是 Caddyfile。上面咱们在 JSON 编写的装备能够简略地表达为:

:2015
respond "Hello, world!"

将其保存到作业目录文件中名为 Caddyfile (无扩展名)的文件中。

假如 Caddy 已经在运转, (Ctrl + c)中止它,然后运转:

caddy adapt

或许你把 Caddyfile 存储在别的当地,或许给它取了别的名字:

caddy adapt --config /path/to/Caddyfile

您将看到 JSON 输出! 这儿发生了什么?

咱们仅仅运用装备适配器将 Caddyfile 转换为 Caddy 的原生 JSON 结构。

尽管咱们能够取得这个输出并宣布另一个 API 恳求,可是咱们能够跳过一切这些过程,由于 caddy 指令能够为咱们完结这些操作。假如作业目录中有一个叫 Caddyfile 的文件,并且没有指定其他装备,Caddy 会加载 Caddyfile,为咱们改编,然后马上运转。

现在当时文件夹中有一个 Caddyfile,让咱们再次运转 caddy:

caddy run

或许假如你的 Caddyfile 在其他当地:

caddy run --config /path/to/Caddyfile

(假如调用的是不以“ Caddyfile”最初的其他名称,则需求指定 --adapter caddyfile)

正如你所看到的,有几种办法能够让你运用初始装备发动 Caddy:

  • 在作业目录一个名为 Caddyfile 的文件
  • --config flag (可选项,带有--adapter flag)
  • -resume flag (假如先前加载了装备)

JSON vs. Caddyfile

现在您知道了,Caddyfile 刚刚为您转换为 JSON。

Caddyfile 看起来比 JSON 简略,可是你应该一直运用它吗?每种办法都有利有弊。答案取决于您的需求和用例。

JSON Caddyfile
完整的 Caddy 功用 最常见的 Caddy 功用部件
易于生成 易于手艺制造
易于编程 难以自动化
十分有表现力 适度的表达
答应装备遍历 不能在 Caddyfile 间转换
部分装备更改 只能修正整个装备
能够导出 无法导出
与一切 API 端点兼容 与某些 API 端点兼容
自动生成的文档 文档是手写的
无处不在 小众
更有效率 更多的计算
有点无聊 挺有意思的
了解更多:JSON 结构 了解更多:Caddyfile 文档

您将需求决议哪一个最适合您的用例。

需求注意的是,JSON 和 Caddyfile (以及任何其他支撑的装备适配器)都能够与 Caddy 的 API 一起运用。可是,假如您运用 JSON,您将取得 Caddy 的全部功用和 API 特性。假如运用装备适配器,运用 API 加载或更改装备的仅有办法是 /load 端点。

API vs. 装备文件

{% note info %}
ℹ️ 信息

实践上,即使是装备文件也要通过 Caddy 的 API 端点,指令仅仅为您包装了这些 API 调用。
{% endnote %}

您还需求决议您的作业流是根据 API 的还是根据 CLI 的。(您能够在同一台服务器上同时运用 API 和装备文件,但咱们不引荐这样做: 最好有一个实在的来历。)

API 装备文件
运用 HTTP 恳求修正装备 运用 shell 指令修正装备
易于扩展规模 难以规模化
手艺操作难度大 易于手艺操作
真的很风趣 也很风趣
了解更多:API 教程 了解更多:Caddyfile 教程

{% note info %}
ℹ️ 信息

运用 API 手动办理服务器装备完全能够通过恰当的工具实现,例如: 任何 REST 客户端应用程序
{% endnote %}

或装备文件作业流的选择与装备适配器的运用是正交的: 你能够运用 JSON,但存储在一个文件中,并运用指令行界面; 相反,你也能够运用 Caddyfile 与 API。

可是大多数人会运用 json + api 或 Caddyfile + CLI 组合。

如您所见,Caddy 十分适合于各式各样的用例和部署!

Start,stop,run

由于 Caddy 是一个服务器,所以它能够无限期地运转。这意味着在履行 caddy run 之后,终端不会免除堵塞,直到进程中止(一般运用 Ctrl + c)。

尽管 caddy run 是最常见的,一般是引荐的(特别是在进行体系服务时!),你也能够选择运用 caddy start 发动 Caddy,并让它在后台运转:

caddy start

这将答应您再次运用您的终端,这在一些交互式无头环境中十分便利。

然后你必须自己中止这个过程,由于 Ctrl + c 不会为你中止:

caddy stop

或许运用 API 的/stop 端点。

重新加载装备

您的服务器能够履行零停机时刻装备重载/更改。

加载或更改装备的一切 API 端点都是完美的,并且没有停机时刻。

可是,在运用指令行时,或许很简略运用 Ctrl + c 来中止服务器,然后再重新发动服务器以获取新的装备。不要这样做: 中止和发动服务器与装备更改是正交的,并将导致停机。

相反,运用 caddy reload 指令来高雅地修正装备:

caddy reload

这实践上仅仅在引擎盖下运用了 API。它将加载并在必要时将装备文件调整为 JSON,然后在不停机的情况下高雅地替换活动装备。

假如加载新装备时呈现任何过错,Caddy 将回滚到前次作业的装备。

{% note info %}
ℹ️ 信息

从技术上讲,新装备是在中止旧装备之前发动的,因而在很短的时刻内,两个装备都在运转!假如新装备失利,它将中止一个过错,而旧装备则根本不会中止
{% endnote %}

Caddy 常用功用

  1. 静态文件拜访
  2. 反向署理
  3. HTTPS

静态文件拜访

指令行办法

在终端中,切换到站点的根目录并运转:

caddy file-server

假如你得到一个权限过错,这或许意味着你的操作体系不答应你绑定到低端口—- 所以改用高端口:

caddy file-server --listen :2015

然后在浏览器中打开 (或 localhost:2015)查看您的网站!

假如你没有索引文件,可是你想要显示一个文件列表,能够运用 --browse 选项:

caddy file-server --browse

您能够运用另一个文件夹作为站点根目录:

caddy file-server --root ~/mysite

Caddyfile 办法

在站点的根目录中,创立一个名为 Caddyfile 的文件,其间包含以下内容:

localhost
file_server

或:

localhost
file_server browse

localhost
root * /home/me/mysite
file_server

别离对应以上的几个指令。

反向署理

本教程假定您有一个运转在 127.0.0.1:9000 上的后端 HTTP 服务。

指令行办法

很直白,直接能看理解:

caddy reverse-proxy --to 127.0.0.1:9000

假如你没有权限绑定到低端口,你能够从高端口署理:

caddy reverse-proxy --from :2016 --to 127.0.0.1:9000

Caddyfile 办法

直接上装备:

localhost
reverse_proxy 127.0.0.1:9000

caddy run 运转即可

更改署理的地址很简略:

:2016
reverse_proxy 127.0.0.1:9000

更改 Caddyfile 时,请确保重新加载 Caddy (或中止并重新发动它)。

运用反向署理指令以做很多事情。

HTTPS

本指南将向您展示怎么当即运用完全自办理的 HTTPS 发动和运转。

{% note info %}
ℹ️ 信息

在默许情况下,Caddy 对一切站点运用 HTTPS,只要在装备中供给了主机名。本教程假定您期望通过 HTTPS 取得一个公共受信赖的站点(即不是“ localhost”) ,因而咱们将运用一个公共域名和外部端口
{% endnote %}

先决条件:

  • 对 DNS 的基本了解
  • 注册的公共域名
  • 对端口80和443的外部拜访
  • 已安装 caddycurl

在本教程中,将 example.com 替换为您的实践域名。

设置域名的 A/AAAA 记载指向服务器。您能够通过登录到您的 DNS 供给商和办理您的域名来做到这一点。

在持续之前,用权威 lookup 验证正确的记载。用你的域名替换 example.com,假如你运用的是 IPv6,把 type=A 替换为 type=AAAA:

curl "https://cloudflare-dns.com/dns-query?name=example.com&type=A" \
  -H "accept: application/dns-json"

{% note info %}
ℹ️ 提示

一切的前提是你是在 cloudflare 上买的这个域名。
假如不是的话,过程会复杂一些。
参见这篇 域名在 DNSPod 上的证书请求办法
{% endnote %}

还要确保您的服务器在端口80和443上是能够从公共接口拜访的。

{% note info %}
ℹ️ 提示

假如您在您的家庭或其他受限制的网络,您或许需求转发端口或调整防火墙设置
{% endnote %}

一切咱们需求做的是开端用您的域名装备 Caddy。有几种办法能够做到这一点。

Caddyfile

这是获取 HTTPS 的最常用办法。

创立一个名为 Caddyfile (无扩展名)的文件,其间榜首行是您的域名,例如:

example.com
respond "Hello, privacy!"

然后从同一个目录中运转:

caddy run

您将看到 Caddy 供给一个 TLS 证书,并通过 HTTPS 服务您的站点。这是或许的,由于你的网站在 Caddyfile 中的地址包含一个域名。

file-server 指令

caddy file-server --domain example.com

能够了。

reverse-proxy 指令

caddy reverse-proxy --from example.com --to localhost:9000

总结

Caddy 吸引我的当地:

  1. 自动请求续约证书
  2. 简略指令的 Caddyfile
  3. Go 编写,Caddy 为一切干流渠道编译,并且没有运转时依靠项。

参阅资料

  • Install — Caddy Documentation (caddyserver.com)
  • Build from source — Caddy Documentation (caddyserver.com)
  • Getting Started — Caddy Documentation (caddyserver.com)
  • Quick-starts — Caddy Documentation (caddyserver.com)
  • How to use DNS provider modules in Caddy 2 – Wiki – Caddy Community

三人行, 必有我师; 常识同享, 天下为公. 本文由春风微鸣技术博客 EWhisper.cn 编写.