前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >开源项目|超越Nginx的性能代理框架-Pingora

开源项目|超越Nginx的性能代理框架-Pingora

作者头像
用户1904552
发布2025-02-27 10:26:12
发布2025-02-27 10:26:12
9500
代码可运行
举报
文章被收录于专栏:周末程序猿周末程序猿
运行总次数:0
代码可运行

什么是Pingora?

PingoraCloudflare弃用Nginx,选择使用Rust重新构建新的代理Pingora框架,已经在Cloudflare的云服务上运行多年,支持每秒处理每秒处理超过4000万个互联网请求。

Github地址:https://github.com/cloudflare/pingora

功能

  • 异步 Rust:快速且可靠
  • HTTP 1/2 端到端代理
  • 基于 OpenSSL 或 BoringSSL 的 TLS
  • gRPC 和 websocket 代理
  • 优雅的重载
  • 可定制的负载平衡和故障转移策略
  • 支持多种观测工具

为什么放弃Nginx,再构建一个代理框架

根据Cloudflare官方博客,我整理了几个点(详细博客:https://blog.cloudflare.com/how-we-built-pingora-the-proxy-that-connects-cloudflare-to-the-internet):

1、Nginx的性能瓶颈

对于一个普通的Server框架来说,Nginx的性能已经非常好了,比如 golangNginx 对比:

代码语言:javascript
代码运行次数:0
复制
Nginx:      Requests per second:    23770.74 [#/sec] (mean)
Golang:     Requests per second:    21807.00 [#/sec] (mean)
Swoole:     Requests per second:    19711.22 [#/sec] (mean)
Node.js:    Requests per second:    6680.53 [#/sec] (mean)

可见在众多Server框架中,Nginx本身的性能是比较高的,但是对于代理服务来说,这个性能可能有时满足不了需求,因此需要一个更好的Server框架来支持。

2、Nginx的架构需要优化

(1)Nginx是多进程架构,每个请求只能通过单个worker处理,这样可能会导致CPU之间的负载不均的问题,从而在整理性能上变慢; (2)连接池问题:由于Nginx的连接池是单worker对应的,当请求在到达单个worker时,只能重用该worker内的连接,这样导致会维护更多的代理连接;

nginx架构

(3)功能难以添加,比如如果要在Nginx上增加功能,要么通过C扩展功能,要么通过脚本语言(lua或者新增支持的javascript);

3、Pingora的优势

(1)性能更高,根据PingoraCloudflare上应用的总体流量显示,TTFB中位数减少了5毫秒,第95个百分位数减少了80毫秒,由于跨所有线程共享连接,这意味着更好的连接重用率,在TCPTLS握手上花费的时间更少;

Pingora架构

(2)Pingora根据社区可以提供更多的功能,方便扩展; (3)由于使用Rust开发,可以在不影响性能的情况下以内存安全的方式完成 C 语言可以做的事情,同时在开发过程中调试更方便,内存更加安全;

Pingora使用

1、创建HTTP代理

代码语言:javascript
代码运行次数:0
复制
pub struct LB();

#[async_trait]
impl ProxyHttp for LB {
    async fn upstream_peer(...) -> Result<Box<HttpPeer>> {
        todo!()
    }
}

2、将代理绑定到pingora_proxy上

代码语言:javascript
代码运行次数:0
复制
fn main() {
    let mut upstreams = LoadBalancer::try_from_iter(["1.1.1.1:443", "1.0.0.1:443"]).unwrap();

    let mut lb = pingora_proxy::http_proxy_service(&my_server.configuration, LB(upstreams));
    lb.add_tcp("127.0.0.1:6188");

    let mut my_server = Server::new(None).unwrap();
    my_server.add_service(lb);
    my_server.run_forever();
}

3、版本要求

(1)Rust最低要求:Rust 1.72 (2)尽量在Linux下编译,由于官方文档提示优先支持Linux下的功能 (3)架构支持:x86_64aarch64 (4)注意事项:

  • 查看Rust版本:rustc -V
  • 升级Rust版本:rustup update
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-03-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 周末程序猿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是Pingora?
  • 功能
  • 为什么放弃Nginx,再构建一个代理框架
    • 1、Nginx的性能瓶颈
    • 2、Nginx的架构需要优化
    • 3、Pingora的优势
  • Pingora使用
    • 1、创建HTTP代理
    • 2、将代理绑定到pingora_proxy上
    • 3、版本要求
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档