如何为 caddy 添写自定义插件

Caddy的WAF扩展 - Coraza 在caddy中使用coraza扩展配置防火墙规则 阅读详情

如何为 caddy 添写自定义插件

项目地址:https://github.com/yhyddr/quicksilver/tree/master/gosample/caddy-plugin


前言

Caddy附带一个HTTP服务器,但是你可以实现其他服务器类型并将它们插入Caddy中。其他类型的服务器可以是SSH、SFTP、TCP、内部使用的其他东西等等。


对于Caddy来说,服务器的概念是任何可以Listen()和Serve()的东西。这意味着什么、如何运作都取决于你。你可以自由地发挥你的创造力去使用它。


那么怎样去扩展 Caddy 呢?
不同的服务器类型,可以根据自己的需要定制不同的插件。我们在这里,通过添加最简单的不做任何事的插件,来熟悉如何扩展 Caddy 服务器。

Plugin for HTTP

我们会一步一步构建出一个 HTTP Plugin 的框架,到时候你只需要填充自己处理逻辑即可!那还等什么,让我们开始吧。


构建一个 HTTP Plugin ,代码部分仅需要两步,注意事项也有两个。

创建一个 Go Package

首先为 caddy 创建一个 插件的 Go Package ,你可以新建一个文件夹达到这个效果。比如

├── caddy-plugin
│   ├── gizmo.go
│   └── setup.go

这里分为了两个 Go 文件,接下来详细讲每一个 Go 文件的作用。

代码?:注册 caddy plugin

首先我们看到 setup.go

setup.go

创建 setup.go 文件并写入以下信息

import "github.com/mholt/caddy"

func init() {
    caddy.RegisterPlugin("gizmo", caddy.Plugin{
        ServerType: "http",
        Action:     setup,
    })
}

这里是 建立了一个新插件,caddy 包来做到插件的注册。

  1. 注意到 “gizmo” 这是 插件的名字,同时也是指令的名字,请为你的插件取一个独一无二的名字吧。(注意:名字需要是单词小写哦。)
  2. 因为是针对 HTTP 服务器的插件,所以 ServerType 字段值是 “http”
  3. 另一个设置的字段是 setup ,实际上,我们接下来会填充这个函数的逻辑。它的作用就是将我们插件的处理逻辑安装到 Caddy 中。

setup

现在我们来实现 setup 函数 


假如我们希望在Caddyfile中有一行这样的行:

gizmo foobar


我们可以得到刚才所说的 c.Next() 第一个参数(“foobar”)的值,如下所示:

for c.Next() {              // skip the directive name
    if !c.NextArg() {       // expect at least one value
        return c.ArgErr()   // otherwise it's an error
    }
    value := c.Val()        // use the value
}

我们首先注意到, c.Next() 是真正我们读取 caddyfile 逻辑的地方,caddyfile 就是配置服务器的配置文件的名字。我们注意到,这里的操作实际上是使用 caddy.Controller 来实现的。它的存在 让编写插件的开发者只需要关注如何使用它来执行你的命令,这是一项优秀的设计,有兴趣可以看我的源码阅读部分关于 Plugin 的具体实现。

在 Caddy 解析了Caddyfile之后,它将迭代每个指令名(按照服务器类型规定的顺序),并在每次遇到指令名时调用指令的setup函数。setup函数的职责是解析指令的标识并配置自己。


您可以通过遍历c.Next()来解析为指令提供的标识,只要有更多的标识需要解析,那么c.Next()就会返回true。由于一个指令可能出现多次,你必须遍历c.Next()以获得所有出现的指令并使用第一个标识(即指令名)。
有关caddyfile包,请参阅godoc以了解如何更充分地使用分发器,并查看任何其他现有插件。

代码 ?:Handler 实现

gizmo.go:

查看httpserver包的godoc。最重要的两种类型是httpserver.Handler和httpserver.Middleware。

  1. Handler是一个处理HTTP请求的函数。
  2. Middleware是一种连接Handler的方式。

Caddy将负责为你设置HTTP服务器的所有簿记(bookkeeping)工作,但是你需要实现这两种类型。

Struct

httpserver.Handler是一个几乎和http.Handler完全一样的接口,除了ServeHTTP方法返回(int, error)。
这个方法签名遵循Go语言博客中关于与中间件相关的错误处理的建议。
int是HTTP状态码,error应该被处理和/或记录。有关这些返回值的详细信息,请参阅godoc。


Handler通常是一个结构体,至少包含一个Next字段,用来链接下一个Handler:

type gizmoHandler struct {
	next httpserver.Handler
}


除了这些之外,可以添加一些自己使用的参数,考虑 grpc 的 plugin 实现,解释放在代码块中的注释中

type server struct {
	backendAddr       string // 监听地址
	next              httpserver.Handler // 作为中间件必须有的字段
    backendIsInsecure bool // 是否启用 Insecure() 选项,是 grpc 的一项配置
	backendTLS        *tls.Config // 关于 TLS 的使用的证书文件
	wrappedGrpc       *grpcweb.WrappedGrpcServer // 通过 grpcweb 的 协议实现 HTTP 请求等
}

这就是参考的一个 字段的使用。可以根据自己的需要,调整在 caddyfile 中读取的指令应该如何配置。

httpserver.Handler

为了实现httpserver.Handler接口,我们需要编写一个名为ServeHTTP的方法。这个方法是实际的处理程序函数,除非它自己处理完毕请求,否则它应该调用链中的下一个Handler:即使用 g.next.ServeHTTP(w, r)

func (g gizmoHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) {
	return g.next.ServeHTTP(w, r)
}

这里只是框架,具体逻辑可以自行填充,可以参照已有的 Plugin 实现。

第二步,注册 Middleware

然后我们可以进行第二步,将这个 handler 注册到整个 caddy 的 http 调用链上。

我们需要回到 刚才的 setup.go 文件中,
回到设置函数。你刚刚解析了标识并使用所有适当的配置设置了中间件处理程序:

func setup(c *caddy.Controller) error {
	g := gizmoHandler{} // 用来实现 HTTPHandler 的 next 的结构,用来构建 中间件。也可以加入一些自己的字段

    for c.Next() {
        // 获取配置文件,并处理
    }
    // 现在开始注册中间件
	httpserver.GetConfig(c).AddMiddleware(func(next httpserver.Handler) httpserver.Handler {
		g.next = next
		return g
	})
	
	return nil
}

这样,代码部分就全部完成了。

下面我们查看需要注意的事项。实际上是关乎于怎样将写好的插件集成在 caddy 中。

排序

要做的事情是告诉服务器类型在进程的什么地方执行你的指令。这一点很重要,因为其他指令可能会设置你所依赖的更原始的配置,因此执行指令的顺序不能是随意的。


每个服务器类型都有一个字符串列表,其中每个项都是一个指令的名称。例如,查看HTTP服务器支持的指令列表。将指令添加到适当的位置。

插入你的插件

最后,不要忘记导入你的插件包!Caddy必须导入插件来注册并执行它。这通常是在run.go的import部分的尾部完成的:

_ "your/plugin/package/here"

请注意:包名前的_是必需的。

总结

就是这样!可以用你的插件来构建caddy,然后用你的新指令写一个Caddyfile来查看它的运行情况。
虽然还没完善的她只是一个框架,还不能做任何事情,但是她很简单,很美不是吗?她能帮你做任何事情。因为记住 caddy 的服务器是设置的非常抽象的。她就想 net 包中 conn 一样完美的 接口设计,能够兼容和扩展任何 需要 listen()  和 serve() 的东西,只要你的创造力足够。


现在,发挥你的想象力,填充这个框架吧,可以参考我的简单项目地址。
项目地址:https://github.com/yhyddr/quicksilver/tree/master/gosample/caddy-plugin


同时记得多多寻找别人的插件实现方式,你会找到让你耳目一新的实现。https://www.yuque.com/fengyfei/idznuk/sumapn

参考

image.png
我刚编辑过哦
https://github.com/caddyserver/caddy/wiki/Writing-a-Plugin:-Directives
https://github.com/caddyserver/caddy/wiki/Writing-a-Plugin:-Server-Type
https://github.com/caddyserver/caddy/wiki/Writing-a-Plugin:-HTTP-Middleware

使用caddy给网站自动配置https,支持非80端口以及CDN代理 点击“头像”->“My Profile”->“API Tokens”->“Create Token”->“Edit zone DNS(Use template)”使用caddy给网站自动配置https,支持非80端口以及CDN代理,并自动更新证书。创建一个Cloudflare Api key,用于caddy自动配置TLS。Ctrl + c 终止 caddy, 然后在后台运行 caddy。下载包含 cloudflare dns 插件的caddy。将你的域名DNS服务商迁移到 Cloudflare。 阅读详情

相关推荐

Caddy实践 | Docker环境下使用Caddy快速部署web服务器

Caddy实践 | Docker环境下使用Caddy快速部署web服务器

jks212454的博客 3304

动手撸个Caddy(十四)| 插件开发之自定义全局配置

点击上方蓝色“飞雪无情”关注我,设个星标,第一时间看文章在开发Caddy插件的时候,很多现成的配置可以为我们所用,这样我们插件中的某些配置就可以遵循整个Caddyfile的全局统一配置,用...

flysnow_org的博客 1433

Caddy 源码阅读

Caddy Caddy 是一个go编写的web server。 类似于nginx。 官网上是这么介绍的:Caddy is the HTTP/2 web server with automatic HTTPS. (说实话官网v1版本的介绍并不怎么清楚,反而是v2版本的介绍更明确) Caddy的作用 Caddy simplifies your infrastructure. It takes car...

风格色的博客 2143

foobar插件_如何为 caddy 添写自定义插件

如何为 caddy 添写自定义插件项目地址:https://github.com/yhyddr/quicksilver/tree/master/gosample/caddy-plugin前言Caddy附带一个HTTP服务器,但是你可以实现其他服务器类型并将它们插入Caddy中。其他类型的服务器可以是SSH、SFTP、TCP、内部使用的其他东西等等。对于Caddy来说,服务器的概念是任何可以List...

weixin_33636371的博客 243

Caddy 入门指南:简介及安装编程学习

Caddy是一个基于Go语言开发的轻量级Web服务器,它的设计理念是尽可能地简化配置和部署过程,同时提供丰富的功能和插件支持。Caddy的配置文件采用Caddyfile格式,非常容易理解和编辑。Caddy是一个现代化的开源Web服务器,它的设计目标是简单易用且功能强大。本文将为你提供Caddy的简介,并帮助你了解如何安装和使用Caddy进行编程学习。这将从GitHub上下载最新的Caddy版本并将其安装到你的Go语言环境中。Caddy将会读取配置文件并启动一个Web服务器,你可以在浏览器中访问。

CqppDeveloper的博客 1061

xcaddy:用插件构建Caddy

xcaddy定制xcaddy器 这个命令行工具和相关的Go软件包使创建自定义版本变得容易。 Caddy插件开发人员以及希望制作自定义caddy二进制文件(带有或不带有插件)的任何人都大量使用它。 :warning: 仍在开发中。 仅支持Caddy 2。 保持更新,注意更改,请提交反馈! 谢谢! 要求 安装 您可以从“发行”选项卡已经为您的平台编译的。 您也可以从源代码构建xcaddy : $ go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest 对于Debian,Ubuntu和Raspbian,可以从我们的获得xcaddy软件包: sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl -1sLf ' https:/

日期插件如何默认为今天_如何为 caddy 添写自定义插件

如何为 caddy 添写自定义插件项目地址:https://github.com/yhyddr/quicksilver/tree/master/gosample/caddy-plugin前言Caddy附带一个HTTP服务器,但是你可以实现其他服务器类型并将它们插入Caddy中。其他类型的服务器可以是SSH、SFTP、TCP、内部使用的其他东西等等。对于Caddy来说,服务器的概念是任何可以List...

weixin_39713833的博客 170

抖音直播参数逆向实战:手把手教你用Python获取ttwid和x-bogus(附完整代码)

本文深入解析抖音直播接口的反爬机制,重点剖析核心防护参数ttwid和x-bogus的生成原理与作用。通过Python实战,手把手教你逆向获取ttwid、webid等关键参数,并构建稳定的数据采集方案,为开发者提供企业级数据获取能力。

weixin_29196891的博客 1045

Caddy Rate Limit 插件使用教程

Caddy Rate Limit 插件使用教程 项目介绍 Caddy Rate Limit 是一个为 Caddy 服务器设计的插件,用于限制客户端对服务器的请求速率。通过这个插件,可以有效地防止恶意攻击和过度的流量消耗,确保服务器的稳定运行。该插件基于 Caddy 的插件架构开发,易于集成和配置。 项目快速启动 安装 Caddy 和 Rate Limit 插件 首先,确保你已经安装了 Caddy ...

gitblog_00818的博客 745

Abaqus中Cohesive单元建模:从本构到失效的完整指南

本文提供了Abaqus中Cohesive单元建模的完整指南,涵盖从本构模型到失效分析的全过程。详细解析了Cohesive单元作为模拟界面粘结与失效的关键工具,其核心在于弹性本构、损伤起始准则和损伤演化定律的设置。文章通过双悬臂梁(DCB)实例,手把手指导前处理、材料定义、求解设置及后处理分析,并分享了刚度、强度、断裂能等关键参数的影响与收敛性调优的实用避坑技巧,帮助用户准确模拟复合材料及胶接结构的界面失效行为。

cuda7parallel的博客 701

Electron多窗口开发避坑指南:Pinia状态同步的3种解决方案对比

本文深入探讨了在Electron多窗口应用中实现Pinia状态同步的三种核心方案。针对Electron多窗口架构下状态隔离的挑战,文章对比了基础事件通信、共享存储以及智能Pinia插件等方案的优劣与适用场景,并提供了生产级的实现指南与选型建议,帮助开发者构建健壮高效的桌面应用。

spice的博客 479

Caddy实战(十二)| 插件开发之HelloWorld

点击上方蓝色“飞雪无情”关注我,设个星标,第一时间看文章连载了十一篇,终于讲到了大家最关心的Caddy的插件开发。插件开发是一种提供给我们开发者定制化Caddy的能力,让我们可以根据自己的...

flysnow_org的博客 1126

Android Display Graphics #1 整体框架介绍一

手机屏上显示的内容,2D或3D ,如果是 3D 的,不管是 App 还是游戏,或者简单的图片界面,底层都是通过 GPU、 通过 OpenGL(ES)绘制出来的。是Java层的一个类,提供了一系列API,使用这些API可以实现各种的产品经理要求的效果。显示的不同阶段对这块内存的叫法不同,在上层可以是Window、ANnativeWindow、Surface、SurfaceView、layer、buffer,这些本质上没啥区别,可以广泛意义上理解为用于显示内容的那块内存,只不过各个阶段的操作接口不同。

oDwyane03的博客 1387

Caddy-Git插件使用指南

Caddy-Git插件使用指南 项目介绍 Caddy-Git是一个为Caddyweb服务器设计的插件,它允许自动部署网站内容基于Git仓库的变动。通过监听指定的Git仓库更新,此插件可以自动化地拉取最新代码并重新加载Caddy以反映更改,非常适合于静态站点或轻量级动态内容管理。遗憾的是,具体该项目的链接您提供的是一个示例,实际在提供的引用中并未找到名为https://github.com/abio...

gitblog_00638的博客 898

html2canvas 返回的toDataURL()数据为 data:,的解决方法

html2canvas 返回的toDataURL()数据为 data:,的解决方法 我在使用html2canvas的使用, 发现toDataURL() 返回的数据为data:, 而且将数据设置为img的src属性,图片也不能正常显示,我尝试了很多方法,也没有解决出来,经过我不断的百度+自己尝试,终于解决了这个问题。 代码: 这段代码是没有任何问题的,标准html2canvas的demod代码,但就是无法正常将图片previewImg 渲染出来,dataURL 我打印的结果为 data:, 错误的原因是,

java123_PB的博客 5025

SAP-ABAP: BP主数据完全指南:从基础到高阶应用

SAP-ABAP: BP主数据完全指南:从基础到高阶应用

baidu_35680696的博客 1647

Caddy Forward Proxy 插件使用教程

Caddy Forward Proxy 插件的 GitHub 仓库目录结构如下: ``` /caddyserver/forwardproxy ├── LICENSE ├── README.md ├── caddyfile.go ├── forwardproxy.go ├── forwardproxy_test.go ├── go.mod ├── go.sum ├── http.go ├── ht

gitblog_00015的博客 1190

openmediavault(OMV) (1)安装部署

EXT3(Third Extended File System): EXT3 是 Linux 中广泛使用的日志文件系统,是 EXT2 文件系统的升级版本。这里可以根据自己的需求进行设置,目前只设置了自动登出为1天,为方便后续配置使用,其他设置可根据自己的具体需求进行设置。通过cd 命令进入到我们的raid存储中,通过ls发现里面没有任何的数据,因为我们的raid存储中还未创建任何数据。我的系统要安装在100G的磁盘上,故选择100G的磁盘,实际可以根据具体情况选择。

Monster✺◟(∗❛ัᴗ❛ั∗)◞✺的博客 2168

xcaddy终极指南:快速构建自定义Caddy插件

xcaddy作为Caddy服务器插件构建的终极工具,让自定义Caddy插件集成变得前所未有的简单。这款强大的命令行工具专为跨平台编译设计,无论是新手开发者还是资深系统管理员,都能轻松上手,快速打造专属的Web服务器解决方案。 ## 🚀 一键安装指南 ### Go环境安装方式 如果你的系统已经配置了Go开发环境,只需一条命令即可完成xcaddy安装: ```bash go install

gitblog_00140的博客 351

从零开始用 C# 打造工业级上位机系统:完整项目实战

本文介绍了一个基于C#开发的工业级上位机系统项目。该系统采用分层架构设计,包含通信、数据采集、UI展示、告警日志等模块,支持Modbus协议和串口通信。文章详细阐述了系统架构设计、关键模块实现(如Modbus通信封装、实时数据采集、告警系统等)以及性能优化策略。该项目已在实际工控场景中稳定运行超过1年,具备良好的可扩展性和稳定性,适合有一定C#基础的开发者参考学习工业软件开发实践。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1368

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Caddy-JWT:基于Caddy的JWT身份验证插件

Caddy-JWT:基于Caddy的JWT身份验证插件 项目介绍 Caddy-JWT 是一个专为Caddy设计的插件,它提供了强大的JSON Web Tokens (JWT)身份验证功能。通过集成此插件,开发者可以轻松地在Caddy服务器上实现安全的认证机制,确保Web应用和服务的安全访问。该插件支持多种令牌签发和验证策略,简化了API的授权流程。 项目快速启动 要快速启动并运行Caddy-J...

gitblog_00155的博客 595

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Caddy-authz:细粒度访问控制的Caddy插件

Caddy-authz:细粒度访问控制的Caddy插件 项目介绍 Caddy-authz 是一个专为Caddy Web服务器设计的权威访问控制插件。它利用Casbin强大的访问控制模型来实现细粒度的身份验证与授权功能。通过此插件,开发者可以轻松地在Caddy配置中集成复杂的权限管理机制,确保Web服务的安全性和资源的访问控制。项目基于开放源码理念,活跃于GitHub社区,提供了一种灵活而高效的方式...

gitblog_00573的博客 653

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

提升网站性能的利器:Caddy Cache插件

提升网站性能的利器:Caddy Cache插件 项目介绍 Caddy Cache是一个为Caddy服务器设计的简单缓存插件。尽管该项目目前处于不受支持和未维护状态,并且仅适用于Caddy 1版本,但它仍然是一个值得关注的工具,尤其是在需要提升网站性能的场景中。Caddy Cache通过缓存响应来减少对后端服务器的请求次数,从而显著提高网站的响应速度和吞吐量。 项目技术分析 Caddy Cache插...

gitblog_01143的博客 1172

如何自定义Caddy-docker插件:构建个性化Web服务器的完整教程

Caddy-docker是一款强大的Docker容器化Web服务器解决方案,通过自定义插件,你可以轻松扩展其功能,打造专属的Web服务环境。本文将带你一步步完成插件定制的全过程,从基础概念到实际操作,让你快速掌握构建个性化Caddy服务器的核心技巧。 ## 为什么需要自定义Caddy插件? Caddy作为现代Web服务器的代表,以自动HTTPS、简洁配置和丰富生态著称。而通过Docker容器化

gitblog_00870的博客 477
上一篇: IPFS 普及知识
下一篇: caddy & grpc(3) 为 caddy 添加一个 反向代理插件
杨鼎睿
博客等级 码龄9年 7粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值