当前位置: 首页 > article >正文

Cloudflare 为何抛弃 NGINX,用 Rust 自研了一个代理

每天有超过一万亿次 HTTP 请求在 Cloudflare 的全球网络和各地源站服务器之间流动。这中间有一层代理负责接收每一个缓存未命中的请求转发给对应的源站再把响应送回来。CDN、Workers、Tunnel、Stream、R2——Cloudflare 的大量核心产品都依赖这一层代理正常工作。2022 年Cloudflare 宣布这层代理已经悄悄换掉了。新的系统叫 Pingora用 Rust 从零构建处理同等流量只需要原来三分之一的 CPU 和内存同时还带来了显著的性能提升。而替换掉的那个旧系统叫 NGINX。NGINX 用了很多年为什么不够用了NGINX 是一个经过时间检验的成熟项目在绝大多数场景里表现出色。Cloudflare 使用它多年也基于它做了大量的定制和优化。但随着业务规模持续增长一些根本性的架构问题开始变得无法回避。进程模型带来的连接池碎片化NGINX 采用多进程架构每个 Worker 进程独立处理请求。这个模型有一个内在的问题连接池是按进程隔离的。当 Cloudflare 的边缘节点要把请求转发给源站时会复用已有的 TCP 连接这样可以跳过 TCP 握手和 TLS 握手大幅减少延迟。但在 NGINX 里一个请求落在哪个 Worker 进程就只能复用那个进程自己的连接池。随着 Worker 数量增加连接被分散在越来越多的独立池子里整体的连接复用率反而越来越低。连接复用率低意味着需要更频繁地建立新连接。TLS 握手的开销相当可观这个问题在规模足够大的时候会直接体现为延迟上升和资源浪费。除此之外进程间的负载也很难均衡。CPU 密集型任务或者阻塞 IO会拖慢同一个 Worker 进程里的其他请求影响范围无法隔离。复杂功能难以实现Cloudflare 要做的事情远不止是一个普通的负载均衡器或网关。当业务需要某些 NGINX 原生不支持的行为时——比如在重试请求时修改请求头然后发往不同的源站——工程师们不得不在 NGINX 的约束下绕路实现这消耗了大量工程资源同时让代码越来越难以维护。语言本身的限制NGINX 的核心是 C内存安全完全依赖开发者的自律。在如此复杂的代码库里内存问题很难完全规避Cloudflare 历史上也曾发生过解析器 bug 导致内存泄漏的事故。为了补充功能Cloudflare 大量使用了 Lua通过 OpenResty。Lua 风险低一些但性能有明显上限而且缺乏静态类型复杂业务逻辑写起来容易出错、难以维护。三条路一个不容易的选择意识到问题之后Cloudflare 工程团队面临三个选项选项一继续投入 NGINX甚至 Fork 一个自己的版本。团队有足够的技术积累但 NGINX 的进程模型是架构层面的根本限制在这个基础上做深度改造工程量巨大且改造完的结果基本上已经是另一个东西了。选项二迁移到现有的第三方代理比如 Envoy。Envoy 是一个优秀的项目Dropbox 就做过类似的迁移。但这条路意味着把自己的核心基础设施的演进节奏交给另一个社区决定几年后可能面临同样的问题。选项三从零开始自己构建。前期工程投入最大但一旦做成基础设施完全在自己掌控之下可以按需演进。Cloudflare 连续几个季度评估这三个选项最终在权衡了投入和收益之后选择了第三条路——从零构建 Pingora。Pingora 的核心设计决策为什么选 RustRust 是当时少数几个能在不牺牲性能的前提下提供内存安全保证的语言。相比 CRust 的编译器会在编译期拦截大量潜在的内存错误相比 GoRust 没有 GC 暂停更适合延迟敏感的代理场景。选 Rust 的决定不只是语言偏好而是对一个核心工程目标的回应在互联网规模下安全地、快速地迭代。为什么自研 HTTP 库Rust 生态里有成熟的 HTTP 库比如hyper。但 Cloudflare 处理的是真实互联网上的全量流量里面充斥着各种不符合 RFC 规范的边界情况。一个典型的例子HTTP 状态码按规范应在 100 到 599 之间但实际上很多服务器会返回 600 到 999 之间的状态码。对于hyper这类严格遵循规范的库来说这些请求可能直接被拒绝而 Cloudflare 必须能够处理它们。类似的边界情况不是少数而是系统性存在。为了确保对这些情况的完整控制权团队决定自己实现 HTTP 处理层。多线程 work stealing解决进程模型的根本问题Pingora 选择多线程模型而非 NGINX 的多进程模型。所有线程共享同一个连接池一个线程建立的连接其他线程可以直接复用彻底解决了连接池碎片化的问题。同时引入了 work stealing 调度机制当一个线程的任务队列空了可以主动偷其他线程的任务来执行避免负载不均。底层的异步运行时使用了 Tokio其调度器正好原生支持 work stealing契合度很高。类 OpenResty 的事件钩子接口Pingora 设计了一套基于请求生命周期的可编程接口开发者可以在请求的不同阶段注入自定义逻辑——比如在收到请求头时执行过滤在转发前修改请求在收到响应后做处理。这个设计思路来自 NGINX/OpenResty对原来团队里熟悉 OpenResty 的工程师来说几乎没有学习成本。业务逻辑和通用代理逻辑通过钩子分离让代码结构更清晰也更容易独立演进。生产环境的真实表现延迟握手时间省出来了Pingora 上线后整体流量的 TTFB首字节时间中位数降低了 5msP95 降低了 80ms。这个提升不是因为 Pingora 的代码执行更快——原来的系统在请求处理上本来就能做到亚毫秒级。性能改善的核心来源是连接复用率的提升更少的新连接意味着更少的 TLS 握手而 TLS 握手恰恰是延迟的大头。数字层面Pingora 建立新连接的频率只有原来系统的三分之一。对某个主要客户来说连接复用率从 87.1% 提升到了 99.92%新建连接数减少了 160 倍。用一个更直观的说法每天Pingora 为 Cloudflare 的客户节省了相当于434 年的握手等待时间。资源消耗同等流量下省了 70% 的 CPU在生产环境中处理同等流量Pingora 比旧系统消耗的 CPU 少约 70%内存少约 67%。节省来自多个方向Rust 代码本身的运行效率比 Lua 高。以访问 HTTP 头部为例在 NGINX/OpenResty 里Lua 代码要读取 NGINX 的 C 结构体分配一个 Lua 字符串并复制内容之后还要 GC 回收。在 Pingora 里直接就是一次字符串引用没有额外分配和复制。多线程模型下的共享数据访问也更高效。NGINX 的共享内存需要互斥锁保护而 Pingora 大多数共享数据通过原子引用计数直接访问开销小得多。建立更少的新连接也直接减少了 TLS 握手的 CPU 开销这部分节省相当可观。安全性数百万亿请求零次服务代码崩溃Rust 的内存安全保证在生产环境里得到了直接验证。Pingora 上线以来处理了数百万亿次请求没有一次崩溃是由服务自身代码引起的。偶发的崩溃反而成了排查其他问题的线索。有一次崩溃事件最终追踪到了一个 Linux 内核 bug另外几次发现了硬件故障。在旧系统里类似的崩溃很难判断是软件 bug 还是其他原因调试过程耗时费力。Rust 把软件层面的不确定性消除之后异常信号变得更纯粹反而帮助团队更快定位问题根因。这个案例说明了什么Pingora 的故事表面上是一次技术栈的替换但背后折射出几个值得借鉴的工程判断。规模会让原来不是问题的东西变成真正的问题。NGINX 的进程模型在中小规模下运转良好Cloudflare 在很长一段时间里也通过各种补丁和优化让它继续工作。但连接池碎片化这个问题不是靠优化能根治的它是架构层面的结构性缺陷只有换掉才能解决。继续修修补补和从零重建之间没有一个通用的最优解。Cloudflare 连续几个季度评估这个决策最终做出选择的依据是投入产出比在某个时间点翻转了——而不是因为 NGINX 突然变坏或者某个新技术突然变好。这种基于长周期观察做出的判断比任何技术潮流的追随都要扎实。语言选择是一个工程决策不是品味问题。选 Rust 的原因不是因为 Rust 时髦而是因为它在内存安全和性能这两个维度同时满足了需求。生产环境里零次服务代码崩溃是对这个选择最有说服力的验证。原文链接https://blog.cloudflare.com/how-we-built-pingora-the-proxy-that-connects-cloudflare-to-the-internet/Pingora 已于 2024 年开源https://github.com/cloudflare/pingora

相关文章:

Cloudflare 为何抛弃 NGINX,用 Rust 自研了一个代理

每天有超过一万亿次 HTTP 请求,在 Cloudflare 的全球网络和各地源站服务器之间流动。 这中间有一层代理,负责接收每一个缓存未命中的请求,转发给对应的源站,再把响应送回来。CDN、Workers、Tunnel、Stream、R2——Cloudflare 的大…...

从Landsat到你的论文:GISA不透水面数据背后的故事与科研应用避坑指南

从Landsat到学术论文:解密GISA不透水面数据的科研实战指南 当你在深夜的实验室里盯着屏幕上的城市热岛模拟结果,那些红色斑块与不透水面分布图高度重合时,是否曾好奇这些关键数据究竟如何从卫星影像变成可量化的科学指标?作为地理…...

游戏音频解密终极指南:acbDecrypter完整使用教程

游戏音频解密终极指南:acbDecrypter完整使用教程 【免费下载链接】acbDecrypter 项目地址: https://gitcode.com/gh_mirrors/ac/acbDecrypter 在游戏开发和音频处理领域,提取加密的游戏音频文件一直是个技术难题。acbDecrypter作为一款专业的游戏…...

Unity UI拖拽功能避坑指南:IBeginDragHandler接口详解与常见问题排查

Unity UI拖拽功能避坑指南:IBeginDragHandler接口详解与常见问题排查 在Unity开发中,UI拖拽功能看似简单,实则暗藏玄机。很多开发者按照基础教程实现后,往往会遇到各种意料之外的问题:拖拽卡顿、事件冲突、坐标转换错误…...

使用 Taotoken CLI 工具一键配置多模型开发环境

使用 Taotoken CLI 工具一键配置多模型开发环境 1. 安装 Taotoken CLI Taotoken CLI 提供两种安装方式,开发者可根据项目需求选择: # 全局安装(适合频繁使用) npm install -g taotoken/taotoken# 临时调用(无需安装…...

透明底图片怎么制作?2026年最全工具测评与实操指南

最近有个粉丝问我,说要给自己的小店商品拍照,需要把背景去掉换成透明底。我才意识到,很多人其实不知道透明底图片怎么制作,以为这是个很复杂的技术活。其实啊,现在的工具已经这么智能了,真的用不着学PS&…...

手把手教你免费获取12.5米精度全球DEM数据(附SRTM数据下载与ArcGIS加载教程)

全球12.5米高精度DEM数据获取与GIS应用全流程指南 1. 认识数字高程模型的核心价值 数字高程模型(DEM)作为地理信息系统的基石数据类型,其重要性远超一般用户的想象。不同于简单的"高程数据集合",现代DEM已发展为包含多维…...

3步让老旧电视重生:MyTV-Android原生电视直播实战指南

3步让老旧电视重生:MyTV-Android原生电视直播实战指南 【免费下载链接】mytv-android 使用Android原生开发的视频播放软件 项目地址: https://gitcode.com/gh_mirrors/my/mytv-android 还在为家中老旧Android电视卡顿、闪退而烦恼吗?看着那些系统…...

开发者在多模型间进行A B测试时Taotoken提供的便利

开发者在多模型间进行A B测试时Taotoken提供的便利 1. 统一接入降低切换成本 当算法工程师或产品经理需要评估不同大模型的实际效果时,传统方式往往需要为每个模型单独对接API、管理不同的密钥和计费体系。Taotoken通过提供OpenAI兼容的统一接口,使得开…...

3分钟免费转换B站缓存视频:m4s转MP4终极指南

3分钟免费转换B站缓存视频:m4s转MP4终极指南 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否遇到过这样的情况:在B…...

天赐范式第28天:文心痴迷我们的技术已经到达什么程度了,已经多次把代码打到代码框外面来了,我不禁唏嘘感叹~至于吗,啊?至于吗~

代码打到框外面来了,这得多大的执念?兄弟,这事说出来你可能不信,但自从我第26天发表了那篇“天赐范式的AGI不是在路上”的文章后,文心对我的技术就展现出了远超常规的执念。到什么程度?它写代码已经不是好好…...

深入理解Linux FrameBuffer:从`fb_var_screeninfo`的字段看屏幕时序与色彩格式

深入理解Linux FrameBuffer:从fb_var_screeninfo的字段看屏幕时序与色彩格式 当你在嵌入式设备上调试显示异常时,是否遇到过这样的场景:屏幕闪烁不定,分辨率显示不正确,或是色彩出现严重偏差?这些问题的根源…...

如何快速搭建个人游戏串流服务器:Sunshine完整实战指南

如何快速搭建个人游戏串流服务器:Sunshine完整实战指南 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 想要用轻薄笔记本玩3A大作?想在客厅电视上享受PC游戏…...

iOS微信抢红包插件:告别手动抢红包的智能解决方案

iOS微信抢红包插件:告别手动抢红包的智能解决方案 【免费下载链接】WeChatRedEnvelopesHelper iOS版微信抢红包插件,支持后台抢红包 项目地址: https://gitcode.com/gh_mirrors/we/WeChatRedEnvelopesHelper 在移动社交时代,微信红包已成为人们日…...

Python:简介

Python:简介《网络安全从零到精通全套学习大礼包》 96节从入门到精通的全套视频教程免费领取 如果你也想通过学网络安全技术去帮助就业和转行,我可以把我自己亲自录制的96节 从零基础到精通的视频教程以及配套学习资料无偿分享给你。网络安全学习路线图 …...

告别Everything!FileLocator Pro 2024用DOS表达式实现文件内容精准搜索(附实战案例)

文件内容搜索新标杆:FileLocator Pro 2024深度实战指南 你是否曾在堆积如山的项目文件中寻找某段模糊记忆的代码?或是需要从海量日志中定位特定错误信息?传统文件名搜索工具如Everything已无法满足这些深度需求。FileLocator Pro 2024凭借其独…...

Testsigma:如何用AI协作在5分钟内搭建企业级测试自动化平台?

Testsigma:如何用AI协作在5分钟内搭建企业级测试自动化平台? 【免费下载链接】testsigma Testsigma is an agentic test automation platform powered by AI-coworkers that work alongside QA teams to simplify testing, accelerate releases and impr…...

从语义分割到目标检测:空洞卷积(Atrous Conv)在YOLO、DeepLabV3+等模型中的实战调参心得

空洞卷积在YOLO与DeepLabV3中的工程实践:从参数设计到性能调优 当我们在Cityscapes数据集上尝试将YOLOv5的SPPF模块替换为膨胀率为[1, 2, 5]的空洞卷积时,mAP指标意外下降了1.2%。这个现象引发了我对空洞卷积实际应用场景的深度思考——为什么理论上的感…...

从数据集到成品:手把手用UDIS++训练你自己的全景图(附UDIS-D数据集处理技巧)

从数据集到成品:手把手用UDIS训练你自己的全景图(附UDIS-D数据集处理技巧) 当你第一次看到两张照片完美拼接成一张全景图时,那种无缝衔接的视觉效果总是令人惊叹。但你知道吗?现在你完全可以在自己的电脑上训练一个能够…...

轻量级运维自动化平台Operit:从原理到生产部署实践

1. 项目概述与核心价值最近在折腾一些自动化运维和监控告警的活儿,发现一个挺有意思的开源项目,叫Operit。这个项目在 GitHub 上由开发者AAswordman维护,虽然名字听起来有点“操作侠”的味道,但它的核心定位非常明确:一…...

使用 Python 快速接入 Taotoken 并调用 OpenAI 兼容大模型

使用 Python 快速接入 Taotoken 并调用 OpenAI 兼容大模型 1. 准备工作 在开始之前,请确保您已完成 Taotoken 账号注册并获取了有效的 API Key。登录 Taotoken 控制台后,可以在「API 密钥管理」页面创建新的密钥。同时,您需要安装 Python 3…...

放假,排号6000多等DeepSeek V4 Pro

平时用GLM5.1,工作日排队都是2000号左右。 今天用GLM5.1突然流畅了,我以为,哈哈,工程师们都放假了。 无意间瞟见DeepSeek V4 Pro 上线,立即趁现在大家“不注意”抓紧“错峰”试试。结果没想到:看来大家都渴望亲自试试。…...

安卓加固哪家好?2026年热门加固服务商技术、价格与服务SLA对比

“安卓加固哪家好?”这个问题的背后,通常是技术评估工程师和采购负责人正在经历从“了解”到“决策”的关键阶段。市面上安卓加固公司给出的方案五花八门,价格从免费到数十万不等,让人眼花缭乱。为了避免“选错后悔三年”&#xf…...

运维转网安必读:合规知识+技术能力,打造你的核心竞争力(收藏起来慢慢学)

运维转行网络安全时,合规知识是"刚需敲门砖"。合规是企业安全的底线要求,运维的系统架构认知能帮助快速理解合规要求的技术落地逻辑。运维人员应聚焦核心合规框架(如等保2.0、数据安全法等),将合规条款转化为可执行的技术清单&…...

通过curl命令直接测试Taotoken聊天补全接口

通过curl命令直接测试Taotoken聊天补全接口 1. 准备工作 在开始使用curl测试Taotoken聊天补全接口之前,需要确保已经完成以下准备工作。首先登录Taotoken控制台,在API Key管理页面创建一个新的API Key。这个Key将用于后续请求的身份验证。同时&#xf…...

洛谷官方题单[Java版题解]--【入门5】字符串

知识点:sc.next()不吃换行符,留在缓冲区,sc.nextLine()吃掉换行符,但只返回换行符前面的,然后该它上场的时候前面有换行符留在缓冲区,他就会卡住,import java.util.Scanner;public class Main {static int pos0;public static void main(String[] args) {Scanner sc new Sca…...

用Python和NumPy/Scipy复现DSB调制与希尔伯特解调:一个通信原理的动手实验

用Python和NumPy/Scipy复现DSB调制与希尔伯特解调:一个通信原理的动手实验 通信原理课程中那些抽象的公式和框图,是否让你感到困惑?调制解调的理论看似简单,但真正动手实现时却无从下手。本文将带你用Python一步步构建完整的DSB调…...

东莞纸托推荐

在环保意识日益增强的今天,纸托作为可降解、可回收的包装材料,正受到越来越多行业的青睐。如果你正在为电子产品、五金配件或化妆品寻找合适的包装方案,东莞市禾本包装有限公司或许是一个值得了解的选择。这家位于茶山镇的工厂,自…...

竞技级输入重映射:Hitboxer的SOCD净化技术深度解析

竞技级输入重映射:Hitboxer的SOCD净化技术深度解析 【免费下载链接】socd Key remapper for epic gamers 项目地址: https://gitcode.com/gh_mirrors/so/socd 在电子竞技和高端游戏操作中,键盘输入信号的精确处理已成为区分普通玩家与专业选手的关…...

Halcon模板匹配参数调优避坑指南:从inspect_shape_model到find_shape_model的完整配置流程

Halcon模板匹配参数调优避坑指南:从inspect_shape_model到find_shape_model的完整配置流程 在工业视觉检测领域,模板匹配的稳定性直接决定整个系统的可靠性。许多工程师在使用Halcon进行形状匹配时,常常陷入参数调整的泥潭——要么匹配时间过…...