【Caddy2】最新Caddy2配置文件解析
原创声明
作者:Billyme (詩)
博客园:https://www.cnblogs.com/billyme/
CSDN :https://blog.csdn.net/horizon08
Gitee:https://billyme.gitee.io/blog/
本文为 Billyme 原创作品,仅发表于以上平台,不允许转载
Caddy 介绍
Caddy官网:CaddyServer
THE ULTIMATE SERVER
Caddy 2 is a powerful, enterprise-ready, open source web server with automatic HTTPS written in Go
Caddy2的升级指南
升级指南🔗
Caddy 2 是一个全新的代码库,从头开始编写,以改进 Caddy 1。Caddy 2 不向后兼容 Caddy 1。但不用担心,对于大多数基本设置,并没有太大的不同。本指南将帮助您尽可能轻松地过渡。
本指南不会深入研究可用的新功能——它们真的很酷,顺便说一下,你应该学习它们——这里的目标是让你快速启动并运行 Caddy 2。
菜单🔗
高位🔗
- “Caddy 2”仍然只是被称为
caddy
。我们可能会使用“Caddy 2”来阐明哪个版本可以使过渡不那么混乱。 - 大多数用户只需要替换他们的
caddy
二进制文件和更新的Caddyfile
配置(在测试它是否有效之后)。 - 最好不要从 Caddy 1 继承任何假设进入 Caddy 2。
- 您可能无法在 v2 中完美复制您的利基 v1 配置。通常,这是有充分理由的。
- 命令行不再用于服务器配置。
- 配置不再需要环境变量。
- 为 Caddy 2 提供配置的主要方法是通过其API,但也可以使用
caddy
命令。 - 您应该知道 Caddy 2 的原生配置语言是JSON,而 Caddyfile 只是另一个为您转换为 JSON 的配置适配器。极端自定义/高级用例可能需要 JSON,因为并非所有可能的配置都可以由 Caddyfile 表示。
- Caddyfile 基本相同,但功能更强大;指令已更改。
脚步🔗
- 通过我们的入门教程熟悉 Caddy 2 。
- 如果您还没有,请执行第 1 步。说真的——我们不能强调至少知道如何使用 Caddy 2 的重要性。(它更有趣!)
- 使用以下指南转换您的
caddy
命令。 - 使用以下指南转换您的 Caddyfile。
- 在本地或暂存中测试您的新配置。
- 测试,测试,再测试
- 部署并玩得开心!
HTTPS 和端口🔗
Caddy 的默认端口不再是:2015
. Caddy 2 的默认端口是:443
,或者,如果不知道主机名/IP,则为 port :80
。您始终可以在配置中自定义端口。
如果主机名或 IP 已知, Caddy 2 的默认协议始终是 HTTPS 。这与 Caddy 1 不同,在 Caddy 1 中,默认情况下只有公开域名使用 HTTPS。现在,每个站点都使用 HTTPS(除非您通过明确指定端口:80
或禁用它http://
)。
IP 地址和 localhost 域将从本地受信任的嵌入式 CA颁发证书。所有其他域将使用 ZeroSSL 或 Let’s Encrypt。(这都是可配置的。)
证书和 ACME 资源的存储结构发生了变化。Caddy 2 可能会为您的站点获得新证书;但是如果您有很多证书,如果它不适合您,您可以手动迁移它们。有关详细信息,请参阅问题#2955和#3124。
命令行🔗
caddy
命令现在是caddy run
.
所有命令行标志都是不同的。删除它们;所有服务器配置现在都存在于实际配置文档中(通常是 Caddyfile 或 JSON)。您可能会在JSON 结构或Caddyfile 全局选项中找到您需要的内容,以替换 v1.1 中的大多数命令行标志。
像这样的命令caddy -conf ../Caddyfile
会变成caddy run --config ../Caddyfile
.
和以前一样,如果您的 Caddyfile 在当前文件夹中,Caddy 会自动找到并使用它;在这种情况下,您不需要使用该--config
标志。
信号基本相同,只是不再支持 USR1 和 USR2。请改用caddy reload
命令或API来加载新配置。
在没有任何配置的情况下运行caddy
用于运行简单的文件服务器。Caddy 2 中的等价物是caddy file-server
.
环境变量不再相关,除了HOME
(并且,可选地,XDG_*
您设置的任何变量)。CADDYPATH
被操作系统约定所取代。
球童档案🔗
v2 Caddyfile与您已经熟悉的非常相似。您需要做的主要事情是更改指令。
⚠️请务必阅读新指令!特别是如果您的配置更高级,则需要考虑许多细微差别。这些技巧可以让你快速切换,但请阅读每个指令的完整文档,以便了解升级的含义。当然,在将它们投入生产之前,请务必彻底测试您的配置。
主要变化🔗
- 如果你提供静态文件,你需要添加一个
file_server
指令,因为 Caddy 2 默认不假设这个。出于安全原因,默认情况下 Caddy 2 也不嗅探 MIME。如果缺少 Content-Type,您可能需要使用header指令自己设置标头。 - 在 v1 中,您只能按请求路径过滤(或“匹配”)指令。在 v2 中,请求匹配功能更加强大。任何向 HTTP 处理程序链添加中间件或以任何方式操纵 HTTP 请求/响应的 v2 指令都利用了这个新的匹配功能。阅读有关 v2 请求匹配器的更多信息。您需要了解它们才能理解 v2 Caddyfile。
- 尽管许多占位符是相同的,但许多已更改,现在有许多新占位符,包括Caddyfile 的简写。
- Caddy 2 的日志都是结构化的,默认格式是 JSON。所有日志级别都可以简单地转到要处理的同一日志(但如果需要,您可以自定义)。
- 在 Caddy 1 中通过路径前缀匹配请求的情况下,现在默认情况下 Caddy 2 中的路径匹配是精确的。如果要匹配类似 的前缀
/foo/
,则需要/foo/*
在 Caddy 2 中匹配。
我们将在这里列出一些最常见的 v1 指令,并描述如何转换它们以在 v2 Caddyfile 中使用。
⚠️仅仅因为此页面缺少 v1 指令并不意味着 v2 不能做到!一些 v1 指令不需要,翻译不好,或者在 v2 中以其他方式实现。对于一些高级定制,您可能需要下拉到 JSON 以获得您想要的。浏览我们的文档以找到您需要的内容!
基本认证🔗
HTTP 基本身份验证仍使用该basicauth
指令进行配置。但是,Caddy 2 配置不接受明文密码。您必须对它们进行哈希处理,这caddy hash-password
可以提供帮助。
- v1:
1 |
|
- v2:
1 |
|
浏览🔗
现在通过file_server
指令启用文件浏览。
- v1:
1 |
|
- v2:
1 |
|
错误🔗
自定义错误页面可以使用handle_errors
.
- v1: :
1 |
|
- v2: :
1 |
|
分机🔗
隐含的文件扩展名可以用try_files
.
- v1:
ext .html
- v2:
try_files {path}.html {path}
快速cgi🔗
假设您正在使用 PHP,则 v2 等效项是php_fastcgi
.
- v1:
1 |
|
- v2:
1 |
|
请注意,fastcgi
v1 中的指令在后台做了很多工作,包括尝试磁盘上的文件、重写请求,甚至重定向。v2php_fastcgi
指令也为您做这些事情,但文档提供了扩展形式,如果您的要求不同,您可以对其进行修改。
php
v2中不需要预设,因为该php_fastcgi
指令默认采用 PHP。诸如此类的行php_fastcgi 127.0.0.1:9000 php
会导致反向代理认为有第二个后端称为php
,从而导致连接错误。
v2 中的子指令不同——您可能不需要任何 PHP 指令。
压缩包🔗
现在,一个指令encode
用于所有响应编码,包括多种压缩格式。
- v1:
1 |
|
- v2:
1 |
|
有趣的事实:Caddy 2 也支持zstd
(但还没有浏览器支持)。
标题🔗
大部分没有改变,但现在更强大,因为它可以在 v2 中进行子字符串替换。
- v1:
1 |
|
- v2:
1 |
|
日志🔗
启用访问记录;该log
指令仍然可以在 v2 中使用,但默认情况下,所有日志都是结构化的,编码为 JSON。
启用访问日志的推荐方法很简单:
1 |
|
它将结构化日志发送到标准错误。(您也可以发送到文件或网络套接字;请参阅log
指令文档。)
默认情况下,日志将采用结构化JSON 格式。如果由于遗留原因您仍然需要通用日志格式 (CLF) 的日志,您可以使用该transform-encoder
插件。
代理🔗
v2 等效项是reverse_proxy
.
显着的子指令变化分别为header_upstream
和;和负载平衡相关的子指令以 . 为前缀。header_downstream``header_up``header_down``lb_
另一个显着的区别是 v2 代理默认通过所有传入的标头(包括Host
标头)并设置X-Forwarded-For
标头。换句话说,v1 的“透明”模式基本上是 v2 中的默认模式(但如果您需要 X-Real-IP 等其他标头,则必须自己设置)。您仍然可以Host
使用header_up
子指令覆盖/自定义标头。
Websocket 代理在 v2 中“正常工作”;无需像 v1 那样“启用”websocket。
由于改进的匹配器支持,v2 中不再需要重写黑客,因此without
子指令已被删除。
- v1:
1 |
|
- v2:
1 |
|
重新目录🔗
不变,除了一些关于可选状态码参数的细节。大多数配置不需要进行任何更改。
- v1:
redir https://example.com{uri}
- v2:
redir https://example.com{uri}
改写🔗
请求重写(“内部重定向”)的语义略有改变。如果您在 v1 中使用所谓的“rewrite hack”作为匹配请求而不是简单路径前缀的方式,那么在 v2 中这是完全没有必要的。
新指令非常简单但非常强大,因为它的rewrite
大部分复杂性都由v2 中的匹配器处理:
- v1:
1 |
|
- v2:
1 |
|
请注意我们如何简单地使用 Caddy 2 的常用匹配器令牌;它不再是该指令的特例。
首先删除所有重写黑客;将它们变成命名匹配器。评估每个 v1rewrite
以查看 v2 中是否真的需要它。提示:rewrite
用于添加路径前缀然后删除相同前缀proxy
的v1 Caddyfilewithout
是一种重写技巧,可以被消除。
您可能会发现新的route
和handle
指令对于更好地控制高级路由逻辑很有用。
根🔗
未更改,但如果您的根路径以 开头/
,则需要添加*
匹配器标记以将其与路径匹配器区分开来。
- v1:
root /var/www
- v2:
root * /var/www
因为它接受 v2 中的匹配器,这意味着您还可以根据请求更改站点根目录。
如果提供静态文件,请记住添加file_server
指令,因为默认情况下 Caddy 2 不假设这一点,而在 v1 中始终启用它。
状态🔗
v2 等效的是respond
,它也可以写一个响应体。
- v1:
1 |
|
- v2:
1 |
|
模板🔗
指令的整体语法templates
没有改变,但实际的模板动作/功能是不同的并且有很大的改进。例如,模板能够包含文件、渲染 markdown、制作内部子请求、解析前端内容等等!
- v1:
templates
- v2:
templates
tls🔗
该tls
指令的基本原理没有改变,例如指定您自己的证书和密钥:
- v1:
tls cert.pem key.pem
- v2:
tls cert.pem key.pem
但是 Caddy 的自动 HTTPS 逻辑 已经改变,所以要注意这一点!
密码套件名称也发生了变化。
Caddy 2 中的一个常见配置是使用tls internal
它为非开发主机名localhost
或 IP 地址提供本地受信任的证书。
大多数网站根本不需要这个指令。
服务文件🔗
我们建议使用我们的官方 systemd 服务文件之一进行 Caddy 部署。
如果您需要自定义服务文件,请以我们的为基础。出于充分的理由,他们已经仔细调整过!如果需要,请务必自定义您的。
插件🔗
为 v1 编写的插件不会自动与 v2 兼容。v2 甚至不需要许多 v1 插件。另一方面,v2 比 v1 更容易扩展和灵活!
如果您想为 Caddy 2 编写插件,请学习如何编写 Caddy 模块。
使用插件构建 Caddy 2🔗
Caddy 2 可以在交互式下载页面通过插件下载。或者,您可以使用自己构建 Caddyxcaddy
并选择要包含的插件。xcaddy
自动执行 Caddy 的main.go文件中的指令。
获得帮助🔗
如果您难以让 Caddy 正常工作,请先浏览我们的网站以获取文档。花时间尝试新事物并了解正在发生的事情 - v2 在很多方面与 v1 非常不同(但也非常熟悉)!
如果您仍然需要帮助,请加入我们的社区!您可能会发现帮助他人也是帮助自己的最佳方式。
最佳实践
- 部署静态网页
1 |
|
注意,如果配置根目录下有index.html文件,则会自动部署为静态网页,如果没有则为由Caddy提供的文件共享的浏览网页如下。
- 部署File_server
1 |
|
- 反向代理
1 |
|
部署
1
2
3
4
5caddy adapt ## 加载配置文件
caddy fmt ## 格式化配置
caddy start ## 启动服务注意,如果为重新部署,请将最后一句start换为
caddy reload
参考资源
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!