前几天用 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 和装备文件
- 在后台运转
- 零停机时刻装备重载
先决条件
- 已安装
caddy
及curl
(安装 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 常用功用
- 静态文件拜访
- 反向署理
- 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的外部拜访
- 已安装
caddy
和curl
在本教程中,将 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 吸引我的当地:
- 自动请求续约证书
- 简略指令的 Caddyfile
- 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 编写.