写点什么

NGINX 模块现在可以用 Rust 编写了

作者:Claudio Masolo

  • 2023-11-11
    北京
  • 本文字数:1870 字

    阅读完需:约 6 分钟

大小:743.70K时长:04:13
NGINX 模块现在可以用 Rust 编写了

NGINX 近日公布了 ngx-rust 项目,允许开发人员使用 Rust 编写 NGINX 模块。 Rust 编程语言因其稳定性、多种安全特性、丰富的生态系统和强大的社区支持而成为一种强大且流行的语言选项。

 

NGINX 是一款高性能、开源的 Web 服务器和反向代理服务器软件,大部分互联网网站都在使用它。 NGINX 最初由 Igor Sysoev 于 2002 年创建,此后一直在发展,并广泛流行于 Web 托管、内容交付和应用程序部署领域。它的性能、可扩展性和多功能优势闻名于世,也因此成为提供 Web 内容和有效管理互联网流量的网站关键组件。

 

NGINX 的三大功能分别是:

  • Web 服务器:NGINX 主要扮演 Web 服务器的角色,用于处理 HTTP 和 HTTPS 请求。它可以提供静态 Web 内容,例如 HTML 文件、图像和 JavaScript,因而成为托管网站和 Web 应用程序的重要组件。

  • 反向代理服务器:NGINX 可以作为反向代理服务器,充当客户端请求和后端服务器之间的中介。常见的部署方式是用它来跨多个后端服务器分发传入请求,确保负载平衡和容错性。这在高流量环境中特别有用。

  • 负载均衡器:NGINX 可以充当负载均衡器,在多个服务器之间分配传入的网络流量。这可确保各个服务器不会过载,优化资源的使用率并为用户提供无缝体验。

 

一开始,ngx-rust 是为了推动用户使用 NGINX 开发与 Istio 兼容的服务网格产品而诞生的。不过这个项目沉寂了一段时间,在此期间社区积极参与其中,分叉存储库并基于 ngx-rust 提供的 Rust 绑定示例来创建他们的项目。

 

最近,F5 的分布式云机器人防御团队需要将 NGINX 代理集成到他们的防护服务中,这需要开发一个新模块。与此同时,F5 希望可以扩展其 Rust 产品组合并改善开发体验,以满足不断变化的客户需求。通过内部创新赞助以及与 ngx-rust 原作者的合作,F5 重振了 ngx-rust 项目。他们发布了 ngx-rust crate,优化了文档,构建也变得更友好,更适合社区使用了。

 

NGINX 实现大多数功能的基本构建块是模块(Modules)。NGINX 用户还能自定义模块的功能来支持特定的用例。传统上,NGINX 只支持用 C 编写的模块,但计算机科学和编程语言理论的进步让 Rust 等语言也可以用于 NGINX 模块开发了。

 

想要使用 ngx-rust 的话,你可以选择在本地从源代码构建、为 ngx-rust 项目做出贡献,或者直接从 crates.io 获取 crate。 ngx-rust 自述文件提供了贡献指南和本地构建要求。虽然 ngx-rust 仍处于开发的早期阶段,但 F5 计划在社区支持下提升其质量,带来更多特性。

 

ngx-rust 项目包含两个关键的 crate:

  • nginx-sys:这个 crate 从 NGINX 源代码生成绑定,通过 bindgen 代码自动化来自动创建外部函数接口(FFI)绑定。

  • ngx:这个主 crate 负责实现 Rust 粘合代码、API,并重新导出 nginx-sys。模块编写者通过 ngx 符号与 NGINX 交互,并且有了 nginx-sys 的重新导出就不需要显式导入了。

 

初始化 ngx-rust 项目工作区时,需要创建一个工作目录、初始化 Rust 项目和设置依赖项:

cd $YOUR_DEV_FOLDERmkdir ngx-rust-howtocd ngx-rust-howtocargo init --lib
复制代码


创建 Rust 模块时,需要实现 HTTPModule 特征(trait),该特征定义了 NGINX 入口点,包括后配置、预配置、create_main_conf 等。新模块只需要实现针对其特定任务所需的函数。以下代码是 postconfiguration 方法实现的示例:


struct Module;struct Module; impl http::HTTPModule for Module {     type MainConf = ();     type SrvConf = ();     type LocConf = ModuleConfig;     unsafe extern "C" fn postconfiguration(cf: *mut ngx_conf_t) -> ngx_int_t {         let htcf = http::ngx_http_conf_get_module_main_conf(cf, &ngx_http_core_module);         let h = ngx_array_push(             &mut (*htcf).phases[ngx_http_phases_NGX_HTTP_ACCESS_PHASE as usize].handlers,         ) as *mut ngx_http_handler_pt;         if h.is_null() {             return core::Status::NGX_ERROR.into();         }         // set an Access phase handler         *h = Some(howto_access_handler);         core::Status::NGX_OK.into()     } }  
复制代码

ngx-rust-howto 存储库提供了更多示例代码和实现。

 

随着 ngx-rust 项目的推出,NGINX 正在拥抱 Rust 编程语言,为开发人员提供了一种编写 NGINX 模块的新方式。该举措旨在增强 NGINX 的能力,并为开发人员提供一种更安全、更符合习惯的方式来使用 Web 服务器。此外,Cloudflare 开始使用 Rust 来实现 NGINX 模块,这篇博客文章介绍了相关细节。

 

原文链接

https://www.infoq.com/news/2023/10/nginx-modules-rust/

2023-11-11 08:0011169

评论 1 条评论

发布
用户头像
这图是游戏Rust的。。。
2023-11-13 14:45 · 北京
回复
没有更多了
发现更多内容

pycharm的安装

工程师日月

5月月更

CMMI研究院刚刚推出两门新认证课程

高山

培训 CMMI 确保安全 确保安防

基于 Agora SDK 实现 Windows 端的多人视频互动(基于3.6.2版本)

声网

音视频 sdk

通用池化框架commons-pool2实践

FunTester

微博评论高性能高可用计算架构

Trent

高可用 架构设计 高性能 训练营

vue框架

恒山其若陋兮

5月月更

druid 源码阅读 3——DataSource的结构(变量)

张大彪

数据库连接池 -Druid 源码学习(三)

wjchenge

Druid 数据库连接池

Redis「1」流水线、事务、Lua 脚本

Samson

Redis 核心技术与实战 5月月更

聊聊 Kafka:Kafka 消息重复的场景以及最佳实践

老周聊架构

kafka 5月月更

Go Web编程入门:路由

宇宙之一粟

Go Go web 5月月更

618大促100用户级秒杀系统架构设计

IT屠狗辈

架构实战营

在线TSV转XML/JSON工具

入门小站

工具

存在负权边,Bellman-Ford

工程师日月

算法 5月月更

下一站,智能世界:华为给全球轨道数字化带来全新加速度

脑极体

【愚公系列】2022年05月 二十三种设计模式(十二)-代理模式(Proxy Pattern)

愚公搬代码

5月月更

druid源码学习三-继续探究DruidDataSource类init方法

Nick

Apache Druid

面试答不上Java并发编程?阿里P8提供的27道并发面试解析,请查收

Java浪潮

Java spring 架构 编程语言

区块链+供应链:共建全国统一大市场

CECBC

【LeetCode】删列造序Java题解

Albert

LeetCode 5月月更

微博评论高性能高可用计算架构设计分析

锎心😌😌😌

面试还不会Spring?阿里P8总结的100道面试解析,让你实锤面试官

Java浪潮

Java 编程 架构

模块五:微博评论的高性能高可用框架

jiaoxn

设计模式之建造者模式

乌龟哥哥

5月月更

Druid 连接池源码阅读 03

石小天

元宇宙参与指南——如何融入元宇宙建设?

CECBC

学生管理系统(1)简介

5月月更

微博系统中”微博评论“的高性能高可用计算架构

凯博无线

架构实战营 - 模块五 - 作业

michael

架构实战营 #架构实战营 「架构实战营」

微博评论的高性能高可用计算架构

大眼喵

「架构实战营」

Long与Arrays的使用注意

zarmnosaj

5月月更

NGINX 模块现在可以用 Rust 编写了_架构_InfoQ精选文章