Cloudflare 從 Nginx 到 Pingora:性能、效率與安全的全面升級


在互聯網的快速發展中,高性能、高效率和高安全性的網絡服務成為了各大互聯網基礎設施提供商的核心追求。Cloudflare 作為全球領先的互聯網安全和基礎設施公司,近期做出了一個重大技術決策:棄用長期使用的 Nginx,轉而采用其內部開發的基于 Rust 的新一代代理服務——Pingora。
在這里插入圖片描述

一、棄用 Nginx 的原因

在這里插入圖片描述

(一)架構限制影響性能

Nginx 作為一款高性能的 HTTP 和反向代理服務器,多年來一直是 Cloudflare 的核心組件之一。然而,隨著 Cloudflare 業務規模的迅速擴張,Nginx 的架構局限性逐漸顯現。Nginx 的 worker(進程)架構導致每個請求只能由單個 worker 處理,這不僅造成了 CPU 內核之間的負載不平衡,還使得執行 CPU 密集型或阻塞 I/O 任務的請求會減緩其他請求的速度。此外,Nginx 的連接池與單個 worker 相對應,限制了連接的重用率。當增加更多的 worker 進行擴展時,連接會分散在更多的孤立池中,導致連接重用率下降,增加了資源消耗。

(二)功能擴展困難

Nginx 雖然在 Web 服務器、負載均衡器或簡單的網關方面表現出色,但對于更高級、定制化的功能需求,其擴展性存在明顯不足。Cloudflare 在嘗試圍繞 Nginx 構建所需功能時,面臨著與上游代碼庫保持一致的挑戰,這并不容易實現。此外,Nginx 社區的活躍度有限,開發工作往往缺乏開源社區的支持和協作。

二、Pingora 的優勢

(一)性能提升

Pingora 采用 Rust 編程語言開發,Rust 的內存安全和高性能特性使其在處理高并發請求時表現優異。Pingora 的多線程架構允許跨所有線程共享連接,從而實現更好的連接重用率,減少了 TCP 和 TLS 握手的時間。實際數據顯示,Pingora 的 TTFB(第一個字節時間)中位數減少了 5 毫秒,第 95 百分位數減少了 80 毫秒。對于一個主要客戶,Pingora 將連接重用率從 87.1% 提高到 99.92%,減少了 160 倍的新連接。

(二)效率優化

在生產環境中,Pingora 在相同流量負載的情況下,消耗的 CPU 和內存資源分別減少了約 70% 和 67%。Rust 代碼的運行效率高于舊的 Lua 代碼,多線程模型也使得跨請求共享數據更加高效。

(三)安全性增強

Rust 的內存安全語義保護 Cloudflare 免受未定義行為的影響,使其相信服務將正確運行。這使得 Cloudflare 能夠更多地關注服務更改將如何與其他服務或客戶來源進行交互,以更高的節奏開發功能,而不用背負內存安全和難以診斷崩潰的問題。

三、Pingora 的使用示例

Cloudflare 官方提供了一個簡單的 Pingora 使用示例,展示了如何快速構建一個負載均衡器:

use pingora_core::services::background::background_service;
use pingora_core::server::configuration::Opt;
use pingora_core::server::Server;
use pingora_core::upstreams::peer::HttpPeer;
use pingora_core::Result;
use pingora_load_balancing::{health_check, selection::RoundRobin, LoadBalancer};
use pingora_proxy::{ProxyHttp, Session};
use std::sync::Arc;pub struct LB(Arc<LoadBalancer<RoundRobin>>);#[async_trait::async_trait]
impl ProxyHttp for LB {type CTX = ();fn new_ctx(&self) -> Self::CTX {}async fn upstream_peer(&self, _session: &mut Session, _ctx: &mut ()) -> Result<Box<HttpPeer>> {let upstream = self.0.select(b"", 256).unwrap();let peer = Box::new(HttpPeer::new(upstream, true, "one.one.one.one".to_string()));Ok(peer)}
}fn main() {let opt = Opt::from_args();let mut my_server = Server::new(Some(opt)).unwrap();my_server.bootstrap();let mut upstreams = LoadBalancer::try_from_iter(["1.1.1.1:443", "1.0.0.1:443"]).unwrap();let hc = health_check::TcpHealthCheck::new();upstreams.set_health_check(hc);upstreams.health_check_frequency = Some(std::time::Duration::from_secs(1));let background = background_service("health check", upstreams);let upstreams = background.task();let mut lb = pingora_proxy::http_proxy_service(&my_server.configuration, LB(upstreams));lb.add_tcp("0.0.0.0:6188");my_server.add_service(lb);my_server.add_service(background);my_server.run_forever();
}

在這個示例中,Pingora 使用 Rust 的異步編程特性,通過簡單的代碼實現了負載均衡器的基本功能。它展示了 Pingora 的靈活性和開發效率,同時也體現了 Rust 在處理高并發網絡服務時的優勢。

四、Pingora 的 GitHub 鏈接

Cloudflare 已經正式開源了 Pingora 框架,源代碼采用 Apache License,托管在 GitHub。以下是 Pingora 的 GitHub 倉庫鏈接,你可以在這里查看代碼、提交問題或參與貢獻:

  • Pingora GitHub 倉庫地址:https://github.com/cloudflare/pingora

五、總結

Cloudflare 從 Nginx 轉向 Pingora 是一個具有里程碑意義的決策。Pingora 不僅在性能、效率和安全性方面顯著優于 Nginx,還為 Cloudflare 提供了更強大的功能擴展能力。隨著 Cloudflare 將 Pingora 開源,這一技術變革有望為整個互聯網行業帶來新的啟示和機遇,推動更多企業探索更高效、更安全的網絡服務解決方案。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/84575.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/84575.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/84575.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從編輯到安全設置: 如何滿足專業文檔PDF處理需求

隨著數字化辦公的發展&#xff0c;PDF 已成為跨平臺文檔交互的標準格式。無論是在日常辦公、學術研究&#xff0c;還是項目協作中&#xff0c;對 PDF 文件進行高效編輯與管理的需求日益增長。功能全面、操作流暢且無額外負擔的 PDF 編輯工具&#xff0c;它是一款在功能上可與 A…

Kafka消費者組位移重設指南

#作者&#xff1a;張桐瑞 文章目錄 一、Kafka 與傳統消息引擎的核心差異二、重設消費者組位移的核心原因三、重設位移的兩大維度與七種策略四、重設位移的實現方式&#xff08;一&#xff09;Java API 方式&#xff08;二&#xff09;命令行腳本方式&#xff08;Kafka 0.11&am…

分類模型:邏輯回歸

1、針對設計&#xff1a;二分類 Logistic 回歸最初是為二分類問題設計的&#xff0c; Logistic 回歸基于概率&#xff0c;通過 Sigmoid 函數轉換輸入特征的線性組合&#xff0c;將任意實數映射到 [0, 1] 區間內。 通過引入一個決策規則&#xff08;通常是概率的閾值&#xff…

CppCon 2015 學習:C++ WAT

這段代碼展示了 C 中的一些有趣和令人困惑的特性&#xff0c;尤其是涉及數組訪問和某些語法的巧妙之處。讓我們逐個分析&#xff1a; 1. assert(map[“Hello world!”] e;) 這一行看起來很不尋常&#xff0c;因為 map 在這里被用作數組下標訪問器&#xff0c;但是在前面沒有…

vscode自定義主題語法及流程

vscode c/c 主題 DIY 啟用自己的主題(最后步驟) 重啟生效 文件–>首選項–>主題–>顏色主題: 也可以在插件里找到哈 手把手教你制作 在C:\Users\jlh.vscode\extensions下自己創建一個文件夾 里面有兩個文件和一個文件夾 具體內容: package.json: {"name&…

前端傳遞日期范圍(開始時間和結束時間),后端解析及查詢

前端技術&#xff1a;Vue3 TypeScript Element Plus 后端技術&#xff1a;Java Spring Boot MyBatis 應用效果&#xff1a; 原來方案 1、前端日期控件使用 el-date-picker&#xff0c;日期顯示格式和日期值返回格式都為&#xff1a;YYYY-MM-DD <el-form :model"…

零基礎設計模式——行為型模式 - 命令模式

第四部分&#xff1a;行為型模式 - 命令模式 (Command Pattern) 接下來&#xff0c;我們學習行為型模式中的命令模式。這個模式能將“請求”封裝成一個對象&#xff0c;從而讓你能夠參數化客戶端對象&#xff0c;將請求排隊或記錄請求日志&#xff0c;以及支持可撤銷的操作。 …

禁止 Windows 更新后自動重啟

Windows 默認會在安裝重要更新后自動重啟&#xff0c;但你可以調整設置來避免這種情況&#xff1a; ??方法 1&#xff1a;通過組策略&#xff08;適用于 Windows 專業版/企業版&#xff09;?? 按 Win R&#xff0c;輸入 gpedit.msc 打開 ??本地組策略編輯器??。導航…

GoldenDB簡述

GoldenDB是國產的分布式數據庫。它徹底解決了事務一致性&#xff0c;數據實時一致性的問題。采用的是Shared Nothing&#xff08;分片式存儲&#xff09;的分布式架構。就是不共享數據&#xff0c;各自節點持有各自的數據。對比不共享的&#xff0c;還有其他兩種分布式架構&…

訓練過程中的 Loss ?

文章目錄 在我們訓練的過程中&#xff0c;設置好這個epochs也就是訓練的輪次&#xff0c;然后計算這個損失函數&#xff0c;我們可以知道這個具體的訓練的情況&#xff0c;那么在訓練的過程中&#xff0c;這個損失函數的變化有哪些情況&#xff1f;對應的一個解釋情況是怎么樣的…

S2B2B農產品供應鏈交易多平臺開發有哪些發展前景?如何維護?

一、S2B2B農產品供應鏈交易多平臺開發的未來發展前景 本文將由小編為您介紹關于S2B2B農產品供應鏈交易多平臺開發的內容&#xff0c;希望能夠幫助大家。在數字化時代&#xff0c;農產品供應鏈的數字化轉型成為了一種必然趨勢。S2B2B(Supplier to Business to Business)模式通過…

關于有害的過度使用 std::move

翻譯&#xff1a;2023 11 月 24 日On harmful overuse of std::move cppreference std::move 論 std::move 的有害過度使用 - The Old New Thing C 的 std::move 函數將其參數轉換為右值引用&#xff0c;這使得其內容可以被另一個操作“消費”&#xff08;移動&#xff09;。…

Ubuntu24.04 onnx 模型轉 rknn

前面的環境配置有點懶得寫&#xff0c;教程也很多&#xff0c;可以自己找 rknn-toolkit2 gitee 地址&#xff1a;pingli/rknn-toolkit2 試了很多開源的代碼&#xff0c;都沒辦法跑通&#xff0c; 最后自己改了一版 微調后的 qwen2 模型適用 from rknn.api import RKNN impor…

Electron通信流程

前言 今天講Electron框架的通信流程&#xff0c;首先我們需要知道為什么需要通信。這得益于Electron的多進程模型&#xff0c;它主要模仿chrome的多進程模型如下圖&#xff1a; 作為應用開發者&#xff0c;我們將控制兩種類型的進程&#xff1a;主進程和渲染器進程 。 …

uni-app項目實戰筆記1--創建項目和實現首頁輪播圖功能

ps:本筆記來自B站咸蝦米壁紙項目 一.創建項目&#xff0c;完成項目初始化搭建 1.在HBuilder X創建wallper項目&#xff0c;使用默認模塊&#xff0c;選擇vue&#xff1b; 2.在項目根目錄下創建common目錄&#xff0c;用于存放靜態資源&#xff0c;創建項目時自動生成static目…

機械制造系統中 PROFINET 與 PROFIBUS-DP 的融合應用及捷米科技解決方案

在機械制造領域&#xff0c;工業通信網絡的兼容性與靈活性直接影響產線的自動化水平與生產效率。當前&#xff0c;多數機械制造系統采用PROFINET 控制器構建核心網絡架構&#xff0c;并通過微波無線連接實現設備互聯。隨著工業網絡的發展&#xff0c;系統中常需同時集成PROFINE…

MCP 協議系列序言篇:開啟 AI 應用融合新時代的鑰匙

文章目錄 序言&#xff1a;AI 應用層進入 MCP 時代為什么 MCP 開啟 AI 應用融合新時代的鑰匙為什么是 MCP&#xff1f;它與 Function Calling、Agent 有什么區別&#xff1f;Function CallingAI AgentMCP&#xff08;Model Context Protocol&#xff09; MCP 如何工作MCP Serve…

【threejs】每天一個小案例講解:光照

代碼倉 GitHub - TiffanyHoo/three_practices: Learning three.js together! 可自行clone&#xff0c;無需安裝依賴&#xff0c;直接liver-server運行/直接打開chapter01中的html文件 運行效果圖 知識要點 常見光照類型及其特點如下&#xff1a; 1. 環境光&#xff08;Ambi…

大模型在輸尿管下段積水預測及臨床應用的研究

目錄 一、引言 1.1 研究背景與意義 1.2 研究目的 1.3 研究范圍與限制 1.4 文獻綜述 1.5 研究方法和框架 二、相關理論與概念 2.1 大模型技術原理 2.2 輸尿管下段積水病理機制 2.3 大模型在醫學預測領域的應用 三、大模型預測輸尿管下段積水的方法 3.1 數據收集 3.…

gitlab相關操作

2025.06.11今天我學習了如何在終端使用git相關操作&#xff1a; 一、需要修改新的倉庫git地址的時候&#xff1a; &#xff08;1&#xff09;檢查當前遠程倉庫 git remote -v 輸出示例&#xff1a; origin https://github.com/old-repo.git (fetch) origin https://github.c…