展开菜单
首页 精品内容 本月促销 装机必备 Windows PDF教程 macOS软件 IOS软件 Android AI 专题
全部分类

当前位置:

首页 > 软件教程 > Pingora:超受欢迎的Web服务器,超越了Nginx

Pingora:超受欢迎的Web服务器,超越了Nginx

很高兴介绍Pingora,这是我们基于Rust构建的新HTTP代理。每天处理超过1万亿个请求,提升了性能,为Cloudflare客户带来新功能,且仅需原代理基础架构三分之一的CPU和内存资源。随着Cloudflare的规模不断扩大,我们已经发现NGINX的处理能力已经无法满足我们的需求。尽管多年来它一直表现良好,但随着时间的推移,我们意识到它在应对我们规模上的挑战时存在局限性。因此,我们认为有必要构建一些新的解决方案来满足我们对性能和功能的需求。Cloudflare客户和用户使用Cloudflare全球网

本文目录

    很高兴介绍 Pingora,这是我们基于 Rust 构建的新 HTTP 代理。每天处理超过 1 万亿个请求,提升了性能,为 Cloudflare 客户带来新功能,且仅需原代理基础架构三分之一的 CPU 和内存资源。

    随着 Cloudflare 的规模不断扩大,我们已经发现 NGINX 的处理能力已经无法满足我们的需求。尽管多年来它一直表现良好,但随着时间的推移,我们意识到它在应对我们规模上的挑战时存在局限性。因此,我们认为有必要构建一些新的解决方案来满足我们对性能和功能的需求。

    Cloudflare客户和用户使用Cloudflare全球网络作为HTTP客户端和服务器之间的代理。我们已进行多次讨论,开发了许多技术并实施了新协议,如QUIC和HTTP/2优化,以提高浏览器和其他用户代理连接到我们网络的效率。

    今天,我们将聚焦于另一个与此等式相关的方面:代理服务,它负责管理我们网络和互联网服务器之间的流量。这个代理服务为我们的CDN、Workers fetch、Tunnel、Stream、R2等多项功能和产品提供支持和动力。

    让我们深入研究为何我们决定升级我们的旧版服务,并探讨Pingora系统的开发过程。这一系统是专门为Cloudflare的客户用例和规模而设计的。

    为什么要再建一个代理

    近年来,我们在使用NGINX时遇到了一些限制。针对一些限制,我们做了优化或采取了绕过的方式。然而,还有一些限制更具挑战性。

    架构的限制损害了性能

    NGINX worker(进程)架构 [4] 对于我们的用例而言存在操作缺陷,这会损害我们的性能和效率。

    首先,在 NGINX 中,每个请求只能由单个 worker 处理。这会导致所有 CPU 内核之间的负载不平衡 [5],从而 导致速度变慢 [6]。

    由于这种请求进程锁定效应,执行 CPU 密集型或阻止IO任务的请求可能会减缓其他请求的速度。正如这些博客文章所指出的,我们已经投入了大量时间来解决这些问题。

    我们的用例最关键的问题是连接重用,当我们的机器与原始服务器建立 TCP 连接时,代理了 HTTP 请求。通过重用连接池中的连接,可以跳过新连接所需的 TCP 和 TLS 握手,从而加快请求的 TTFB(首字节时间)。

    但是,NGINX 连接池 [9] 与单个 worker 相对应。当请求到达某个 worker 时,它只能重用该 worker 内的连接。当我们添加更多 NGINX worker 以进行扩展时,我们的连接重用率会变得更差,因为连接分散在所有进程的更多孤立的池中。这导致更慢的 TTFB 以及需要维护更多连接,进而消耗我们和客户的资源(和金钱)。Pingora有多牛逼!超受欢迎 Web 服务器超越Nginx

    正如在过去的博客文章中所提到的,我们为其中一些问题提供了解决方法。但如果我们能够解决根本问题:worker / 进程模型,我们将自然而然地解决所有这些问题。

    有些类型的功能难以添加

    NGINX 是一个非常好的 Web 服务器、负载均衡器或简单的网关。但 Cloudflare 的作用远不止于此。我们过去常常围绕 NGINX 构建我们需要的所有功能,但要尽量避免与 NGINX 上游代码库有太多分歧,这并不容易。

    例如,当重试请求 / 请求失败 [10] 时,有时我们希望将请求发送到具有不同请求标头集的不同源服务器。但 NGINX 并不允许执行此操作。在这种情况下,我们需要花费时间和精力来解决 NGINX 的限制。

    同时,我们被迫使用的编程语言并没有帮助缓解这些困难。NGINX 纯粹是用 C 语言编写的,这在设计上不是内存安全的。使用这样的第 3 方代码库非常容易出错。即使对于经验丰富的工程师来说,也很容易陷入内存安全问题 [11],我们希望尽可能避免这些问题。

    我们用来补充 C 语言的另一种语言是 Lua。它的风险较小,但性能也较差。此外,在处理复杂的 Lua 代码和业务逻辑时,我们经常发现自己缺少静态类型 [12]。

    而且 NGINX 社区也不是很活跃,开发往往是 “闭门造车”[13]。

    选择建立我们自己的

    在过去的几年里,随着我们的客户群和功能集的持续增长,我们持续评估了三种选择:

  • 1. 继续投资 NGINX,向其付款进行定制,使其 100% 满足我们的需求。我们拥有所需的专业知识,但鉴于上述架构限制,需要付出大量努力才能以完全支持我们需求的方式重建它。
  • 2. 迁移到另一个第三方代理代码库。肯定有好的项目,比如 envoy[14] 和其他一些 [15]。但这条道路意味着在几年内可能会重复同样的循环。
  • 3. 从头开始建立一个内部平台和框架。这一选择需要在工程方面进行最大的前期投资。
  • 在过去的几年中,我们每个季度都会对这些选项进行评估。没有明显的公式来判断哪种选择是最好的。在几年的时间里,我们继续走阻力最小的道路,继续增强 NGINX。然而,在某些情况下,建立自有代理的投资回报率似乎更值得。我们呼吁从头开始建立一个代理,并开始设计我们梦想中的代理应用程序。

    Pingora 项目

    设计决定

    为了打造一个每秒提供数百万次请求且快速、高效和安全的代理,我们必须首先做出一些重要的设计决定。

    我们选择 Rust[16] 作为项目的语言,因为它可以在不影响性能的情况下以内存安全的方式完成 C 语言可以做的事情。

    尽管有一些很棒的现成第 3 方 HTTP 库,例如 hyper[17],我们选择构建自己的库是因为我们希望最大限度地提高处理 HTTP 流量的灵活性,并确保我们可以按照自己的节奏进行创新。

    在 Cloudflare,我们处理整个互联网的流量。我们必须支持许多奇怪且不符合 RFC 的 HTTP 流量案例。这是 HTTP 社区和 Web 中的一个常见困境,在严格遵循 HTTP 规范,和适应潜在遗留客户端或服务器的广泛生态系统的细微差别之间存在矛盾和冲突,需要在其中作出艰难抉择。

    HTTP 状态码在 RFC 9110 中定义为一个三位整数 [18],通常预期在 100 到 599 的范围内。Hyper 就是这样一种实现。但是,许多服务器支持使用 599 到 999 之间的状态代码。我们为此功能创建了一个 问题 [19],探讨了争论的各个方面。虽然 hyper 团队最终确实接受了这一更改,但他们有充分的理由拒绝这样的要求,而这只是我们需要支持的众多不合规行为案例之一。

    为了满足 Cloudflare 在 HTTP 生态系统中的地位要求,我们需要一个稳健、宽容、可定制的 HTTP 库,该库可以在互联网的各种风险环境中生存,并支持各种不合规的用例。保证这一点的最佳方法就是实施我们自己的架构。

    下一个设计决策关于我们的工作负载调度系统。我们选择多线程而不是多处理 [20],以便轻松共享资源,尤其是连接池。我们认为还需要实施 工作窃取 [21] 来避免上面提到的某些类别的性能问题。Tokio 异步运行时结果 非常适合 [22] 我们的需求。

    最后,我们希望我们的项目直观且对开发人员友好。我们构建的不是最终产品,而是应该可以作为一个平台进行扩展,因为在它之上构建了更多的功能。我们决定实施一个类似于 NGINX/OpenResty[23] 的基于 “请求生命周期” 事件的可编程接口。例如,“请求过滤器” 阶段允许开发人员在收到请求标头时运行代码来修改或拒绝请求。通过这种设计,我们可以清晰地分离我们的业务逻辑和通用代理逻辑。之前从事 NGINX 工作的开发人员可以轻松切换到 Pingora 并迅速提高工作效率。

    Pingora 在生产中更快

    让我们快进到现在。Pingora 处理几乎所有需要与源服务器交互的 HTTP 请求(例如缓存未命中),我们在此过程中收集了很多性能数据。

    首先,让我们看看 Pingora 如何加快我们客户的流量。Pingora 上的总体流量显示,TTFB 中位数减少了 5 毫秒,第 95 个百分位数减少了 80 毫秒。这不是因为我们运行代码更快。甚至我们的旧服务也可以处理亚毫秒范围内的请求。

    时间节省来自我们的新架构,它可以跨所有线程共享连接。这意味着更好的连接重用率,在 TCP 和 TLS 握手上花费的时间更少。Pingora有多牛逼!超受欢迎 Web 服务器超越Nginx

    在所有客户中,与旧服务相比,Pingora 每秒的新连接数只有三分之一。对于一个主要客户,它将连接重用率从 87.1% 提高到 99.92%,这将新连接减少了 160 倍。更直观地说,通过切换到 Pingora,我们每天为客户和用户节省了 434 年的握手时间。

    更多功能

    拥有工程师熟悉的开发人员友好界面,同时消除以前的限制,让我们能够更快地开发更多功能。像新协议这样的核心功能充当我们为客户提供更多产品的基石。

    例如,我们能够在没有重大障碍的情况下向 Pingora 添加 HTTP/2 上游支持。这使我们能够在不久之后向我们的客户提供 gRPC[24]。将相同的功能添加到 NGINX 将需要 更多的工程工作,并且可能无法实现 [25]。

    最近,我们宣布推出了 Cache Reserve[26],其中 Pingora 使用 R2 存储作为缓存层。随着我们向 Pingora 添加更多功能,我们能够提供以前不可行的新产品。

    更高效

    在生产环境中,与我们的旧服务相比,Pingora 在相同流量负载的情况下,消耗的 CPU 和内存减少了约 70% 和 67%。节省来自几个因素。

    与旧的 Lua 代码 [27] 相比,我们的 Rust 代码运行 效率更高 [28]。最重要的是,它们的架构也存在效率差异。例如,在 NGINX/OpenResty 中,当 Lua 代码想要访问 HTTP 头时,它必须从 NGINX C 结构中读取它,分配一个 Lua 字符串,然后将其复制到 Lua 字符串中。之后,Lua 还对其新字符串进行垃圾回收。在 Pingora 中,它只是一个直接的字符串访问。

    多线程模型还使得跨请求共享数据更加高效。NGINX 也有共享内存,但由于实施限制,每次共享内存访问都必须使用互斥锁,并且只能将字符串和数字放入共享内存。在 Pingora 中,大多数共享项目可以通过原子引用计数器 [29] 后面的共享引用直接访问。

    如上所述,CPU 节省的另一个重要部分是减少了新的连接。与仅通过已建立的连接发送和接收数据相比,TLS 握手成本显然更为高昂。

    更安全

    在我们这样的规模下,快速安全地发布功能十分困难。很难预测在每秒处理数百万个请求的分布式环境中可能发生的每个边缘情况。模糊测试和静态分析只能缓解这么多。Rust 的内存安全语义保护我们免受未定义行为的影响,并让我们相信我们的服务将正确运行。

    有了这些保证,我们可以更多地关注我们的服务更改将如何与其他服务或客户来源进行交互。我们能够以更高的节奏开发功能,而不用背负内存安全和难以诊断崩溃的问题。

    当崩溃确实发生时,工程师需要花时间来诊断它是如何发生的以及是什么原因造成的。自 Pingora 创立以来,我们已经处理了数百万亿个请求,至今尚未因为我们的服务代码而崩溃。

    事实上,Pingora 崩溃是如此罕见,当我们遇到一个问题时,我们通常会发现不相关的问题。最近,我们的服务开始崩溃后不久,我们发现了一个内核错误 [30]。我们还在一些机器上发现了硬件问题,过去排除了由我们的软件引起的罕见内存错误,即使在几乎不可能进行重大调试之后也是如此。

    总结

    总而言之,我们已经建立了一个更快、更高效、更通用的内部代理,作为我们当前和未来产品的平台。

    我们之后将介绍有关我们面临的问题和应用优化的更多技术细节,以及我们从构建 Pingora 并将其推出以支持互联网的重要部分的经验教训。同时还将介绍我们的开源计划。

    本文转载自 CloudFlare 博客,作者Yuchen Wu & Andrew Hauck

    链接:https://blog.cloudflare.com/zh-cn/how-we-built-pingora-the-proxy-that-connects-cloudflare-to-the-internet-zh-cn/

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    软件教程 nginx
    相关文章 更多
    精品专题 更多
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    IOS软件

    正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

    AI

    正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

    Mac软件 更多
    AirBuddy 3 macOS版
    AirBuddy 3 macOS版

    AirBuddy 3 是面向 macOS 的蓝牙外设增强工具,可集中查看 AirPods、Beats 与苹果设备电量,提供快速连接、播放控制、电量提醒、桌面小组件和多台 Mac 外设接力等功能。

    AirServer macOS版
    AirServer macOS版

    AirServer macOS版可把 Mac 转换为无线投屏接收端,通过 AirPlay 或 Google Cast 接收手机、平板和电脑画面,并支持多设备同时连接、高清镜像及会话录制,适合家庭娱乐、课堂教学、会议演示和应用展示。

    AnyDesk macOS版
    AnyDesk macOS版

    AnyDesk macOS版是一款适用于远程办公、设备维护和客户支持的远程桌面工具,可连接并操作异地计算机,支持文件传输、无人值守访问、会话权限控制及跨平台协作。

    Beamer 4 macOS版
    Beamer 4 macOS版

    Beamer 4是面向macOS的本地视频投屏工具,可将Mac中的影片投放到Apple TV、Chromecast及兼容设备,支持常见格式、多类字幕、环绕声、播放列表和电视遥控操作。

    Boom 3D macOS版
    Boom 3D macOS版

    Boom 3D macOS版是一款系统级音效增强工具,可为音乐、电影、游戏和流媒体提供3D虚拟环绕声、31段均衡器、音量增强及应用独立音量控制,并支持本地播放器与多种音频输出设备。

    Boris FX macOS版
    Boris FX macOS版

    Boris FX macOS版是一套面向剪辑、合成、调色及动态图形工作的专业后期工具,涵盖视觉特效、平面与三维跟踪、转描、画面修复、粒子动画和音频清理,可配合多种主流宿主软件使用。

    Capto macOS版
    Capto macOS版

    Capto 是面向 macOS 的屏幕截图、高清录屏与媒体编辑工具,支持区域及整屏捕获、网页长截图、双音轨处理、图片和视频标注、素材分类与多渠道分享,适合教师、学生、内容创作者及需要制作演示教程的用户。

    ChemDraw macOS版
    ChemDraw macOS版

    ChemDraw macOS版是一款面向化学学习、科研和制药工作的专业结构绘图工具,可创建分子、反应及生物聚合物图形,并提供结构整理、格式转换和科研成果展示能力。

    Cursor Crane macOS版
    Cursor Crane macOS版

    Cursor Crane 是一款仅面向 macOS 的键盘操控效率工具,可通过提示标签、网格、文字查找和窗口模式完成点击、滚动、定位与切换,并支持屏幕内容提取、脚本及工作流扩展。

    Deep Freeze 冰点还原 macOS版
    Deep Freeze 冰点还原 macOS版

    Deep Freeze 冰点还原 macOS版通过冻结系统配置,让受保护的Mac在重新启动后回到预设状态,并提供解冻空间、维护计划、密码保护及Apple Remote Desktop管理能力。

    Focusky macOS版
    Focusky macOS版

    Focusky macOS版是一款面向教学课件、商务汇报、产品展示和动画宣传内容的演示制作工具。它通过无限画布、路径编排、缩放旋转转场及多媒体编辑,将传统逐页幻灯片转化为更具空间感的动态演示。

    Folder Colorizer 2 macOS版
    Folder Colorizer 2 macOS版

    Folder Colorizer 2 macOS版是一款直观的文件夹外观定制工具,可更换颜色,添加表情、贴纸及图片背景,并支持批量处理、智能推荐和恢复默认样式,帮助用户更快辨认工作、学习与生活资料。

    WINDOWS 更多
    讯飞绘文 网页版
    讯飞绘文 网页版

    讯飞绘文网页版是科大讯飞推出的AI图文创作与内容运营工具,覆盖热点选题、文章生成、稿件校对、智能配图、排版发布和数据复盘等环节,适合自媒体创作者及内容团队在线使用。

    AirServer Windows版
    AirServer Windows版

    AirServer Windows版可把电脑变成AirPlay、Google Cast和Miracast无线投屏接收端,适合会议演示、课堂教学及家庭大屏分享。发送设备通常无需另装客户端,并可同时接收和智能排列多个镜像会话。

    AlwaysUp Windows版
    AlwaysUp Windows版

    AlwaysUp是一款面向Windows的系统服务注册与程序托管工具,可让普通应用、脚本及批处理在无人登录时随系统启动,并通过状态检测、异常重启、资源监控和邮件通知保障关键任务持续运行。

    AnyDesk Windows版
    AnyDesk Windows版

    AnyDesk Windows版是一款轻量化远程桌面与技术支持工具,可用于控制异地电脑、传输文件、远程打印及无人值守访问。它兼顾连接响应、安全权限和部署灵活性,适合个人远程办公、企业设备维护与客服支持。

    Boom 3D Windows版
    Boom 3D Windows版

    Boom 3D Windows版是一款面向音乐、电影和游戏场景的系统级音效增强工具,支持虚拟3D环绕声、31段均衡器、预设音效、应用音量控制及本地音乐播放,可配合耳机、扬声器和蓝牙耳机使用。

    Boris FX Windows版
    Boris FX Windows版

    Boris FX Windows版是一套服务于影视剪辑、视觉特效、运动跟踪、转描、图像修饰及音频修复的专业创作工具集合,可作为插件接入多种主流后期宿主,也包含可独立运行的应用,适合剪辑师、特效师与内容创作者使用。

    ChemDraw Windows版
    ChemDraw Windows版

    ChemDraw Windows版是一款面向化学研究、药物研发、材料科学和教学工作的专业结构绘图工具,可快速绘制分子、反应式及生物聚合物,并提供结构整理、格式转换、性质计算和科研文档协作能力。

    CODESOFT Windows版
    CODESOFT Windows版

    CODESOFT Windows版是一套企业级条码与RFID标签设计打印工具,可连接Excel、Access、SQL及云端数据源,支持变量、表单、GS1条码、数据库记录和多种工业打印机,适合制造、仓储、物流及合规标识场景。

    Deep Freeze 冰点还原 Windows版
    Deep Freeze 冰点还原 Windows版

    Deep Freeze 冰点还原 Windows版通过重启恢复技术保护系统盘及指定分区,自动撤销恶意程序、误操作和配置漂移造成的改动,并支持密码保护、解冻空间与多硬盘管理,适合学校机房、公共电脑、办公终端及家庭电脑使用。

    EDIUS Windows版
    EDIUS Windows版

    EDIUS 11 Windows版是一款面向影视制作、广播电视、纪录片、短视频及教育机构的专业非线性编辑工具,支持4K/8K、多格式混编、HDR调色、字幕、音频处理和后台渲染,并提供素材管理及丰富的导出预设。

    FastStone Capture Windows版
    FastStone Capture Windows版

    FastStone Capture Windows版是一款轻量级屏幕捕捉、录屏与图像编辑工具,可截取窗口、区域、菜单和滚动页面,并提供标注、模糊、取色、OCR、录音录像及多格式导出能力,适合办公说明、教程制作和问题反馈。

    Focusky Windows版
    Focusky Windows版

    Focusky Windows版是一款动画演示与交互课件制作工具,通过无限画布、缩放旋转镜头、模板素材和对象动画组织内容,可导入PPTX,并输出视频、EXE、PDF、网页等格式,适用于课堂教学、微课、商务汇报及产品展示。