caddy & grpc(3) 为 caddy 添加一个 反向代理插件

Ollama多模型服务网格:从本地运行到企业级LLM微服务 大型语言模型(LLM)本地化部署正从单模型运行迈向多模型协同服务范式。Ollama作为轻量级模型运行时(Model Runtime),其核心价值在于提供模型生命周期管理、服务实例调度与上下文隔离能力,支撑构建可组合、可调度、可观测的本地LLM服务网格。相比传统API调用或容器封装,Ollama通过OCI规范模型包、gRPC网关路由和cgroup资源隔离,实现真正的模型即服务(MaaS)。该架构天然适配RAG流水线、嵌入-生成分离、微服务集成等工程场景,并为国产化替代OpenAI API提供确定性、低延迟、高 阅读详情

caddy-grpc 为 caddy 添加一个 反向代理插件

项目地址:https://github.com/yhyddr/caddy-grpc


前言

上一次我们学习了如何在 Caddy 中扩展自己想要的插件。博客中只提供了大致框架。这一次,我们来根据具体插件 caddy-grpc 学习。

选取它的原因是,它本身是一个独立的应用,这里把它做成了一个 Caddy 的插件。或许你有进一步理解到 Caddy 的良好设计。

插件作用

该插件的目的与Improbable-eng/grpc-web/go/grpcwebproxy目的相同,但作为 Caddy 中间件插件而不是独立的Go应用程序。

而这个项目的作用又是什么呢?

这是一个小型反向代理,可以使用gRPC-Web协议支持现有的gRPC服务器并公开其功能,允许从浏览器中使用gRPC服务。
特征:

  • 结构化记录(就是 log 啦)代理请求到stdout(标准输出)
  • 可调试的 HTTP 端口(默认端口8080)
  • Prometheus监视代理请求(/metrics在调试端点上)
  • Request(/debug/requests)和连接跟踪端点(/debug/events)
  • TLS 1.2服务(默认端口8443):
    • 具有启用客户端证书验证的选项
  • 安全(纯文本)和TLS gRPC后端连接:
    • 使用可自定义的CA证书进行连接

其实意思就是,把这一个反向代理做到了 caddy 服务器的中间件中。

使用

在你需要的时候,可以通过

example.com 
grpc localhost:9090

第一行example.com是要服务的站点的主机名/地址。 第二行是一个名为grpc的指令,其中可以指定后端gRPC服务端点地址(即示例中的localhost:9090)。 (注意:以上配置默认为TLS 1.2到后端gRPC服务)

Caddyfile 语法

grpc backend_addr {
    backend_is_insecure 
    backend_tls_noverify
    backend_tls_ca_files path_to_ca_file1 path_to_ca_file2 
}

backend_is_insecure

默认情况下,代理将使用TLS连接到后端,但是如果后端以明文形式提供服务,则需要添加此选项

backend_tls_noverify

默认情况下,要验证后端的TLS。如果不要验证,则需要添加此选项

backend_tls_ca_files

用于验证后端证书的PEM证书链路径(以逗号分隔)。 如果为空,将使用 host 主机CA链。

源码

目录结构

caddy-grpc
├── LICENSE
├── README.md
├── proxy // 代理 grpc proxy 的功能实现
│   ├── DOC.md
│   ├── LICENSE.txt
│   ├── README.md
│   ├── codec.go
│   ├── director.go
│   ├── doc.go
│   └── handler.go
├── server.go // Handle 逻辑文件
└── setup.go // 安装文件

Setup.go

按照我们上次进行的 插件编写的顺序来看,如果不记得,请看:如何为 caddy 添加插件扩展

首先看 安装的 setup.go 文件

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

可以知道,该插件 注册的 是 http 服务器,名字叫 grpc

setup func

然后我们看到最重要的 setup 函数,刚才提到的使用方法中,负责分析 caddyfile 中的选项的正是它。它也会将分析到的 directive 交由 Caddy 的 controller 来配置自己这个插件

// setup configures a new server middleware instance.
func setup(c *caddy.Controller) error {
	for c.Next() {
		var s server

		if !c.Args(&s.backendAddr) { //loads next argument into backendAddr and fail if none specified
			return c.ArgErr()
		}

		tlsConfig := &tls.Config{}
		tlsConfig.MinVersion = tls.VersionTLS12

		s.backendTLS = tlsConfig
		s.backendIsInsecure = false

		//check for more settings in Caddyfile
		for c.NextBlock() {
			switch c.Val() {
			case "backend_is_insecure":
				s.backendIsInsecure = true
			case "backend_tls_noverify":
				s.backendTLS = buildBackendTLSNoVerify()
			case "backend_tls_ca_files":
				t, err := buildBackendTLSFromCAFiles(c.RemainingArgs())
				if err != nil {
					return err
				}
				s.backendTLS = t
			default:
				return c.Errf("unknown property '%s'", c.Val())
			}
		}

		httpserver.GetConfig(c).AddMiddleware(func(next httpserver.Handler) httpserver.Handler {
			s.next = next
			return s
		})

	}

	return nil
}
  1. 我们注意到 依旧是 c.Next() 起手,用来读取配置文件,实际上这里,它读取了 grpc 这个 token 并进行下一步

  2. 然后我们看到,紧跟着 grpc 读取的是 监听地址。

if !c.Args(&s.backendAddr) { //loads next argument into backendAddr and fail if none specified
			return c.ArgErr()
		}

这里正好对应 在 caddyfile 中的配置 grpc localhost:9090

  1. 注意 c.Next(), c.Args(), c.NextBlock(),  都是读取 caddyfile 中的配置的函数,在caddy 中我们称为 token

  2. 另外是注意到 tls 的配置,前面有提到,该服务是开启 tls 1.2 的服务的

		tlsConfig := &tls.Config{}
		tlsConfig.MinVersion = tls.VersionTLS12

		s.backendTLS = tlsConfig
		s.backendIsInsecure = false
  1. 然后是上面所说的 caddyfile 语法中的配置读取
//check for more settings in Caddyfile
		for c.NextBlock() {
			switch c.Val() {
			case "backend_is_insecure":
				s.backendIsInsecure = true
			case "backend_tls_noverify":
				s.backendTLS = buildBackendTLSNoVerify()
			case "backend_tls_ca_files":
				t, err := buildBackendTLSFromCAFiles(c.RemainingArgs())
				if err != nil {
					return err
				}
				s.backendTLS = t
			default:
				return c.Errf("unknown property '%s'", c.Val())
			}
		}

可以看到是通过 c.NextBlock() 来进行每一个新 token 的分析,使用 c.Val() 读取之后进行不同的配置。

  1. 最后,别忘了我们要把它加入 整个 caddy 的中间件中去
httpserver.GetConfig(c).AddMiddleware(func(next httpserver.Handler) httpserver.Handler {
			s.next = next
			return s
		})

server.go

下面进行第二步。

struct

首先查看这一个插件最核心的结构。即存储了哪些数据

type server struct {
	backendAddr       string
	next              httpserver.Handler
	backendIsInsecure bool
	backendTLS        *tls.Config
	wrappedGrpc       *grpcweb.WrappedGrpcServer
}
  • backendAddr 是 grpc 服务的监听地址
  • next 是下一个插件的 Handler 的处理
  • backendIsInsecure 和 backendTLS 都是后台服务是否启用了不同的安全策略。
  • wrappedGrpc 是这个插件的关键,它实现的是 grpcweb protocol,来让 grpc 服务能够被浏览器访问。

serveHTTP

我们上次的文章中,这是第二重要的部分, serveHTTP 的实现代表着具体的功能。上一次我们的内容只有用来传递给下一个 Handle 的逻辑

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

现在我们来看 这个 grpc 中添加了什么逻辑吧。

// ServeHTTP satisfies the httpserver.Handler interface.
func (s server) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) {
	//dial Backend
	opt := []grpc.DialOption{}
	opt = append(opt, grpc.WithCodec(proxy.Codec()))
	if s.backendIsInsecure {
		opt = append(opt, grpc.WithInsecure())
	} else {
		opt = append(opt, grpc.WithTransportCredentials(credentials.NewTLS(s.backendTLS)))
	}

	backendConn, err := grpc.Dial(s.backendAddr, opt...)
	if err != nil {
		return s.next.ServeHTTP(w, r)
	}

	director := func(ctx context.Context, fullMethodName string) (context.Context, *grpc.ClientConn, error) {
		md, _ := metadata.FromIncomingContext(ctx)
		return metadata.NewOutgoingContext(ctx, md.Copy()), backendConn, nil
	}
	grpcServer := grpc.NewServer(
		grpc.CustomCodec(proxy.Codec()), // needed for proxy to function.
		grpc.UnknownServiceHandler(proxy.TransparentHandler(director)),
		/*grpc_middleware.WithUnaryServerChain(
			grpc_logrus.UnaryServerInterceptor(logger),
			grpc_prometheus.UnaryServerInterceptor,
		),
		grpc_middleware.WithStreamServerChain(
			grpc_logrus.StreamServerInterceptor(logger),
			grpc_prometheus.StreamServerInterceptor,
		),*/ //middleware should be a config setting or 3rd party middleware plugins like for caddyhttp
	)

	// gRPC-Web compatibility layer with CORS configured to accept on every
	wrappedGrpc := grpcweb.WrapServer(grpcServer, grpcweb.WithCorsForRegisteredEndpointsOnly(false))
	wrappedGrpc.ServeHTTP(w, r)

	return 0, nil
}

  • 首先是 grpc 的配置部分,如果你了解 grpc ,你就会知道这是用来配置 grpc 客户端的选项。这里为我们的客户端增添了 Codec 编解码和不同的安全策略选项。
	//dial Backend
	opt := []grpc.DialOption{}
	opt = append(opt, grpc.WithCodec(proxy.Codec()))
	if s.backendIsInsecure {
		opt = append(opt, grpc.WithInsecure())
	} else {
		opt = append(opt, grpc.WithTransportCredentials(credentials.NewTLS(s.backendTLS)))
	}
	backendConn, err := grpc.Dial(s.backendAddr, opt...)
	if err != nil {
		return s.next.ServeHTTP(w, r)
	}
  • 然后是设置了 grpc 服务器的选项
director := func(ctx context.Context, fullMethodName string) (context.Context, *grpc.ClientConn, error) {
		md, _ := metadata.FromIncomingContext(ctx)
		return metadata.NewOutgoingContext(ctx, md.Copy()), backendConn, nil
	}
	grpcServer := grpc.NewServer(
		grpc.CustomCodec(proxy.Codec()), // needed for proxy to function.
		grpc.UnknownServiceHandler(proxy.TransparentHandler(director)),
		/*grpc_middleware.WithUnaryServerChain(
			grpc_logrus.UnaryServerInterceptor(logger),
			grpc_prometheus.UnaryServerInterceptor,
		),
		grpc_middleware.WithStreamServerChain(
			grpc_logrus.StreamServerInterceptor(logger),
			grpc_prometheus.StreamServerInterceptor,
		),*/ //middleware should be a config setting or 3rd party middleware plugins like for caddyhttp
	)
  • 最后是使用 grpcweb.WrapServer 来实现 web 服务的调用
// gRPC-Web compatibility layer with CORS configured to accept on every
	wrappedGrpc := grpcweb.WrapServer(grpcServer, grpcweb.WithCorsForRegisteredEndpointsOnly(false))
	wrappedGrpc.ServeHTTP(w, r)

Proxy

注意到,在上文中使用了 proxy.TransparentHandler 这是在 proxy 的 handler.go 中定义的函数。用来实现 gRPC 服务的代理。这里涉及到 关于 gRPC 的交互的实现,重点是 Client 和 Server 的 stream 传输,与本文关系不大,有兴趣可以下来了解。

结语

思考一下把这个作为 Caddy 的插件带来了什么?

是不是一瞬间获得了很多可以扩展的配置?
而不是将 Caddy 中想要的一些插件的功能做到 最开始说的那个独立应用的项目中。

如果你也在做 HTTP 服务,还在眼馋 Caddy 中的一些功能和它的生态,就像这样接入吧。

它还涉及到了 grpc-web ,如果有兴趣,可以扩展学习一下

grpc-web client implementations/examples:

Vue.js
GopherJS

参考

caddy:https://github.com/caddyserver/caddy
如何写中间件:https://github.com/caddyserver/caddy/wiki/Writing-a-Plugin:-HTTP-Middleware
caddy-grpc插件:https://github.com/pieterlouw/caddy-grpc

caddy_web服务器(添加filemanager版本) 不知道为什么 caddy web 服务器官网把 filemanager 插件干掉了,这是我之前下载的Linux 64位环境下只带 filemanager 插件的版本,自己一直在用这个,感觉很方便,希望对大家有帮助; 版本号:caddy_v0.11.1_linux_amd64_custom_personal; 对应博客地址:https://blog.youkuaiyun.com/TMT123421/article/details/82740660; 立即下载

相关推荐

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如何安装插件,或者说中间件 尝试了很多方法,包括GitHub找一些caddy manager等,都不是很好用 最后发现最易使用的是下载caddy的时候就把需要的插件加进去,这样下载的二进制caddy中已经含有了各种所需插件,可以直接使用 下载地址: https://caddyserver.com/v1/download 选择好platform和plugins就可以了,plugi...

jigetage的专栏 3673

告别手动复制粘贴!用Python脚本+pywinauto实现PC微信消息自动发送(附完整源码)

本文详细介绍了如何利用Python和pywinauto实现PC微信消息的自动化发送,告别繁琐的手动操作。从环境搭建、UI控件定位到构建健壮的发送流程,再到高级功能扩展和项目打包部署,全面解析了自动化办公的实现方案,显著提升工作效率。

weixin_30315723的博客 585

从简单到强大:再次探索Caddy服务器的魅力

请点击上方蓝字TonyBai订阅公众号!Go语言诞生十多年来,社区涌现出众多优秀的Web服务器和反向代理解决方案。其中,最引人注目的无疑是Caddy[2]和Traefik[3]。这两者都为开发者和系统管理员提供了更简单、更安全的现代化Web服务器和反向代理部署选项。尽管它们的目标略有不同,Caddy最初旨在满足开发者快速搭建反向代理的需求,特别关注配置的简易性,并在后期增加了自动HTTPS和全面的...

TonyBai 2140

【亲测有效】OpenClaw Gateway 出现 “(no output)“ 卡死问题完整解决指南:从手动重启到 systemd Watchdog 自动恢复

最近在使用 OpenClaw(自托管 AI 助手框架,前身 Clawdbot/Moltbot)时,遇到了一个非常常见的顽疾:TUI(终端界面)或 Telegram 等通道经常显示 "(no output)",消息发出去后机器人完全没反应,看起来像是卡死了。

hampeter的博客 8610

手机拍照对焦快准狠的秘密:一文看懂PDAF、Dual Pixel和Super PD的区别

本文深入解析手机拍照中的三种主流相位检测自动对焦(PDAF)技术:Shield Pixel、Super PD和Dual Pixel。通过对比它们的原理、优缺点及实际表现,帮助读者理解不同技术的对焦速度、暗光表现和画质影响,从而做出更明智的购机选择。

weixin_26985923的博客 490

5分钟上手Caddy gRPC代理:微服务通信加速实战指南

你还在为gRPC服务配置繁琐的TLS证书和负载均衡而头疼吗?作为微服务架构中高效通信的核心协议,gRPC的部署往往受制于复杂的网络配置。本文将带你通过Caddy服务器(GitHub_Trending/ca/caddy)实现零代码配置的高性能gRPC代理,5分钟内完成从安装到上线的全流程,让跨服务通信延迟降低40%。 ## 为什么选择Caddy作为gRPC代理 Caddy凭借其自动HTTPS、动...

gitblog_00123的博客 789

告别卡顿!用U盘给你的MacBook Pro 2015+来一次macOS Monterey的‘大扫除’式安装

每次系统升级后,老款MacBook Pro用户最常抱怨的就是"怎么比之前更卡了?"——这不是错觉。系统迭代过程中积累的缓存文件、残留配置和隐形服务,就像房间角落堆积的灰尘,拖慢了整台机器的响应速度。而通过U盘进行的macOS Monterey全新安装,本质上是一次彻底的"数字大扫除":它不仅替换系统文件,还会重建所有索引、清理磁盘碎片,甚至能解决某些玄学般的卡顿问题。对于2015款及之后的MacBook Pro用户,这种安装方式能让老设备重获新生。

weixin_28731223的博客 312

【caddy】Ubuntu 中使用 Caddy Web 服务器 和 filemanager 插件 搭建 文件服务器

利用Caddy搭建友好的文件服务器 不管在公司还是自己家中,搭建一套内网文件系统还是可以带来很大便利的。之前使用httpd、nginx等web服务器都可以轻松做到,不过现在,Caddy + filemanager插件可以做得更好。 一、Caddy简介 Caddy是一个go语言开发的web服务器,以开箱即用、自动支持HTTPS著称。 官网有句话是:“Other web ...

问题不大 1万+

从零开始:使用Verilog在FPGA上实现8051微控制器的完整指南

8051微控制器是一种8位微控制器,由Intel在1980年代初推出。它包括一个CPU、一些RAM和ROM、I/O端口、定时器和串行通信接口。由于其简单的架构和强大的功能,8051已经成为了嵌入式系统设计的首选。FPGA是一种集成电路,设计师可以按照自己的需求进行编程。与传统的ASIC(应用特定集成电路)相比,FPGA提供了更高的灵活性,允许在硬件级别进行快速原型设计和迭代。这里,我们定义了一些基本的输入/输出端口,如时钟clk、复位reset、数据输入/输出和地址输入/输出。

qq_38334677的博客 1332

微信H5网页支付JSAPI部分用户报错:system:access_denied 的解决方案

JSAPI 支付仅支持微信内置浏览器调用。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1687

为什么越来越多的人放弃 Nginx,选择 Caddy?

Caddy 是一款现代化的 Web 服务器,专为简化开发者和运维人员的工作流程而设计。它最大的特点是自动化和易用性,尤其是内置的自动 HTTPS 功能,使得部署安全的 Web 服务变得前所未有的简单。相比于传统的 Web 服务器(如 Nginx、Apache),Caddy 的目标是通过更简洁的配置、更智能的功能来减少人为出错的可能性,并提升部署效率。支持 API 和配置文件两种方式:您可以在同一台服务器上同时使用 API 和配置文件,但我们不建议这样做:最好有一个真相来源。要点{ }

jast 1435

华为OD机试真题 新系统 2026-04-19 Java&Go 实现【分辨率排序】

华为OD机试真题 新系统 2026-04-19 Python&JS 实现【分辨率排序】

MISAYAONE的博客 309

caddy介绍及安装

Caddy 是一款现代化的 Web 服务器,专为简化开发者和运维人员的工作流程而设计。它最大的特点是自动化和易用性,尤其是内置的自动 HTTPS 功能,使得部署安全的 Web 服务变得前所未有的简单。相比于传统的 Web 服务器(如 Nginx、Apache),Caddy 的目标是通过更简洁的配置、更智能的功能来减少人为出错的可能性,并提升部署效率。自动 HTTPS:Caddy 是第一款默认支持自动 HTTPS 的 Web 服务器。

huaweichenai的博客 2167

【Bug已解决】NCCL timeout for validation 解决方案

训练用多卡 DDP / FSDP 正常,但一到或者进程直接 hang 在 eval 的某个集合通信上。最迷惑的是:训练阶段(有集合通信)完全正常,偏偏 eval 阶段(看起来更轻量)超时。因为 eval 阶段某些 rank 没参与 collective,导致参与的那部分 rank 永远等不到同伴。

一键难忘的博客 142

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

web和nginx编年史

2016年至2020年期间,Nginx及其相关技术在性能优化、功能扩展、协议支持、安全性提升和云原生集成等方面经历了显著的变革。这一时期不仅巩固了Nginx在Web服务器和反向代理领域的主导地位,还通过OpenResty、Stream模块和Caddy等工具,拓展了其应用范围,满足了现代Web应用和微服务架构的多样化需求。同时,随着自动化、DevOps和云计算的兴起,Nginx的生态系统也在不断适应和创新,提供了更加灵活、高效和安全的解决方案。

远方雪的专栏 1049

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

LiveKit + Caddy 实现 WebRTC HTTPS 自动化部署

WebRTC 是现代实时音视频通信的核心技术,其信令与媒体传输严格依赖安全上下文——所有关键 API(如 getUserMedia、RTCPeerConnection)必须运行在 HTTPS 环境下。这使得 TLS 配置成为 WebRTC 落地的第一道门槛,而非可选优化。Caddy 凭借原生 ACME 支持、零配置 WebSocket 代理、HTTP/2 连接复用及自动证书续期能力,显著优于传统 Nginx 方案;而 LiveKit 作为轻量高可用的 Go 语言 WebRTC 服务器,提供开箱即用的 SFU

weixin_34332905的博客 308

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

自托管服务的 HTTPS,别再手搓 nginx + certbot 了:Caddy 自动证书 + DNS-01 泛域名实操

凡是玩过自托管(homelab、内网服务、小团队自建工具)的人,大概都经历过这套折磨:服务跑起来了,想挂个域名上 HTTPS。仓库:https://github.com/huangchengsir/pipewright不过就算你不用它,这篇的核心还是那句话:**自托管的 HTTPS 别再手搓 nginx + certbot 了。## 四、后来我把这套也打包了道理都懂,但每加一台机器、每挂一个新服务,都要重构建带插件的 Caddy、写 Caddyfile、配 DNS token、记哪个子域名指向哪个后端……

qq_43635619的博客 266

LiveKit本地部署实战:Caddy+HTTPS合规架构详解

LiveKit 是基于 WebRTC 的实时音视频信令与 SFU 服务,其本地化部署核心在于满足数据主权、传输可控与合规审计要求。原理上需分离信令(HTTP/WebSocket)与媒体(UDP/RTP)流量,通过反向代理实现 TLS 终止与安全加固。技术价值体现在端到端加密保障、自动证书管理及最小权限运行,支撑 HIPAA、GDPR 等强监管场景。典型应用场景包括医疗远程会诊、金融双录、政务视频会议等对网络边界与数据流向有硬性约束的系统。本文聚焦 Caddy 替代 Nginx 的工程实践,深入解析 HTTP

weixin_34297704的博客 806

反向代理、负载均衡器与API网关选型决策

关注核心需求安全隔离 → 反向代理水平扩展 → 负载均衡API治理 → API网关分层协同fill:#333;fill:black;fill:#333;演进式设计初创项目:Nginx(反向代理+负载均衡)微服务转型:增加API网关(如Kong)全球规模:引入全局负载+边缘网关真实案例V1.0:Nginx反向代理(单体应用)V2.0:HAProxy + Nginx(服务分离)V3.0:Kong网关 + AWS NLB(微服务化)结果:API故障率下降76%,部署效率提升3倍。

chenglin016的博客 1423

编年史和演讲稿(演讲稿)

在2016年至2020年期间,Nginx及其相关技术在性能优化、功能扩展、协议支持、安全性提升和云原生集成等方面经历了显著的变革。这一时期不仅巩固了Nginx在Web服务器和反向代理领域的主导地位,还通过OpenResty、Stream模块和Caddy等工具,拓展了其应用范围,满足了现代Web应用和微服务架构的多样化需求。同时,随着自动化、DevOps和云计算的兴起,Nginx的生态系统也在不断适应和创新,提供了更加灵活、高效和安全的解决方案。

远方雪的专栏 919

从零到一:构建你的私有知识库系统Memos实战指南

在信息爆炸的时代,如何高效记录和整理碎片化知识成为每个技术从业者的必修课。Memos作为一款开源、自托管的笔记工具,以其轻量级、Markdown原生和完全数据自主的特性,正在改变技术人员的笔记习惯。本文将带你从基础部署到高级配置,全面掌握这个现代化笔记系统的核心能力,助你构建专属的私有知识库。 ## 快速入门:三分钟搭建私有笔记系统 Memos的设计哲学是"简单即美",其部署过程也体现了这一理

gitblog_00573的博客 504

Seko替代方案实测:Traefik、Envoy、Caddy与Nginx Plus选型指南

反向代理是现代网络架构的核心组件,承担流量分发、SSL终止、安全策略等关键职能。其技术原理涵盖L7路由匹配、连接池管理、TLS握手优化及配置热加载机制。在混合云与零信任演进背景下,传统中间件如Seko面临兼容性弱、运维成本高、合规支持不足等瓶颈,催生对更稳定、易扩展、强审计能力的替代工具需求。Traefik凭借Kubernetes原生集成实现快速部署,Envoy以精细化流量控制支撑高SLA场景,Caddy主打极简HTTPS开箱即用,Nginx Plus则在企业级日志审计与SIEM对接方面具备不可替代优势。本

weixin_34353714的博客 361

如何用Memos重新定义你的知识管理体验?这款开源笔记工具为何如此特别

你是否曾因笔记软件过于复杂而放弃记录灵感?是否担心云端笔记服务的数据隐私?是否渴望一个真正轻量级、可自托管、且专注于快速捕捉思想的工具?今天,让我们深入了解Memos——一个正在重新定义个人知识管理的开源笔记工具。 ## 数据主权时代:为什么你需要一个完全自主的笔记系统? 在数据泄露频发的今天,越来越多的技术爱好者开始寻求真正属于自己的数字空间。Memos正是为这一需求而生:它是一款开源自托管

gitblog_00906的博客 1062
上一篇: 如何为 caddy 添写自定义插件
下一篇: 假装前端工程师(一)Icework + GitHub pages 快速构建与部署可自定义迭代开发的 react 网站
杨鼎睿
博客等级 码龄9年 7粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值