马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
How we built Pingora, the proxy that connects Cloudflare to the Internet
基于 Rust 构建 Pingora,作为 Nginx 的替换方案;
Nginx 作为常用署理服务,广泛应用于 CDN、WAF、Stream、Tunnel 等场景,是底子网络办法
然而,Nginx 在作为客户端-服务端署理时,存在以下不敷:
- master-worker 历程架构导致的毗连池不复用
Nginx 是多历程架构,master历程作为管理历程处理处罚reload等下令;其管理的多个worker历程举行现实的网络处理处罚,完成署理使命。处理处罚客户端毗连时,由master历程担当后分发给每个woker,客户端毗连是共享的。但是,多个worker之间不能共享与后端的TCP毗连,每个worker历程有本身的毗连池。
当多个客户访问同一个后端服务,哀求到每个worker历程后分别与后端创建毗连,这导致Nginx有较多的资源和内存浪费。
如果可以或许让多个worker历程复用毗连池,将能很好地节流资源。
Nginx 可以或许很好地做到 web 服务器,负载平衡,署理服务等工作,但是现实应用时通常须要实现更多的逻辑和功能。比如,作为署理服务时,如果想实现一个功能:当后端相应失败时,哀求别的备用服务后端,再举行返回。就会比力难,这并不在 Nginx 架构的界说之内,实现很复杂。
因此,对 Nginx 的架构做出调解,有利于此类底子办法的更广泛的应用。
Nginx 是基于 C 语言实现的,而 C 语言是内存不安全的,增长模块或改进时都很容易出现内存溢出标题,这是一个网络底子办法步伐不应该存在的标题。
只管有 Openresty 的实现,可以或许通过 lua 代码对 nginx 举行扩展。lua 只管是内存安全的脚本,但是其是动态语言,当利用 lua 实现复杂的功能、界说复杂的数据对象时,代码维护难度很大。
因此,办理 C 语言内存安全的标题,而且能会用范例安全、静态的语言实现扩展模块,将会加强此类底子办法的本领。
因此,基于 Rust 语言实现的 Pingora 成为相识决方案。Pingora 具有以下特性:
Pingora 采取多线程架构实现,使得毗连池可以被共享,镌汰了与后端服务的毗连。
更换了Nginx的master-worker多历程架构,节流了网络资源。
为了方便对Pingora举行扩展,将底子组件和扩展功能举行了分离,而且实现了生命周期分别和扩展实现。这使得原先的Nginx开发者可以或许安稳过渡到Pingora,且能实现更多功能的扩展。
基于Rust实现,办理了 C 语言的内存标题。
基于HTTP/2 upstream,增长了支持到Pingora中,可以实现grpc的署理。
利用 R2 storage 作为缓存署理,实现高效的内容缓存服务。
Open sourcing Pingora: our Rust framework for building programmable network services
基于Pingora的功能,可以资助有以下需求的应用开发:
- 内存安全需求,办法运行稳固性要求高
- 性能敏感需求,须要低运行斲丧,镌汰内存资源斲丧
- 客户定制化需求,在署理服务器之上,须要实现定制化的功能
Pingora的特性:
- 多种协议的署理:As a proxy, it supports HTTP/1 and HTTP/2 end-to-end, gRPC, and websocket proxying. (HTTP/3 support is on the roadmap.)
- 满足定制化开发需求:Pingora provides filters and callbacks to allow its users to fully customize how the service should process, transform and forward the requests
- 运维管理方便:Pingora provides zero downtime graceful restarts to upgrade itself without dropping a single incoming request
- 运维监控
方便:Syslog, Prometheus, Sentry, OpenTelemetry and other must-have observability tools are also easily integrated with Pingora as well
总结
Pingora 实现了很多网络底子库,实现了原先 Nginx 的功能。但是,其现在重要是提供了代码库实现,还没有做到 Nginx 可以用 conf 设置文件实现复杂功能的本领。即当前只是支持利用 Pingora 库,本身再写代码实现所需的功能,还无法像用 Nginx 那样直接设置conf就可以实现很多需求。
总的来说,Nginx 已经是一个成熟的软件(其可扩展)。但是 Pingora 是一组底子代码库的聚集,基于这些底子库可以实现原先Nginx 可以实现的功能,而不是“设置出”原先Nginx可以实现的功能。
|