写点什么

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:0011270

评论 1 条评论

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

你真的了解v-model吗🔥

渔戈

前端 Vue3 10月月更

以指标驱动业务决策,Kyligence 亮相 Gartner IT Symposium/Xpo™ 峰会

Kyligence

数据分析 指标中台 OLAP技术

热门探讨:为何数字化转型的企业,大都“死”在了黎明前夕?

优秀

数字化转型

校招面试真题 | 显式等待与隐式等待的区别?与强制等待的方式分别是什么,有什么区别?

霍格沃兹测试开发学社

【网络安全篇】--HTML基础(预计学习时间:30分钟)从此以后不迷糊~

贤鱼很忙

html 前端 10月月更

【kafka运维】Topic的生产和消费运维脚本

石臻臻的杂货铺

kafka kafka运维 10月月更

详解Native Memory Tracking 追踪区域分析

华为云开发者联盟

开发 华为云 企业号十月 PK 榜

【高并发】深度解析ScheduledThreadPoolExecutor类的源代码

冰河

并发编程 多线程 高并发 协程 异步编程

Python列表和元组有什么区别

芥末拌个饭吧

后端 python 3.5+ 10月月更

《Go语言学习路线图》让你少踩坑,高效学,Let’s Go!

王中阳Go

golang 学习方法 技术专题合集 10月月更 “程”风破浪的开发者

Go语言入门—06切片

良猿

Go golang 后端 10月月更

技术分享 | 测试开发工程师必读经典好书清单,抽奖赠书送福利!

霍格沃兹测试开发学社

牛客刷题系列之初阶版(自守数,返回小于 N 的质数个数,第一个只出现一次的字符)

雪芙花

c c++ 10月月更

一种基于柔性事务的分布式事务解决方案设计探究

京东科技开发者

编程 分布式事务 事务 事务回滚 柔性事务

C++精通之路:红黑树

雪芙花

c c++ 10月月更

升级全新网络方案,给你低成本、高性能的裸金属体验

华为云开发者联盟

云计算 后端 华为云 云服务器 企业号十月 PK 榜

面试官:数据库加了唯一索引,就不会有重复数据了吗???

小小怪下士

Java MySQL 程序员

【网络安全篇】JavaSript基础内容大全

贤鱼很忙

10月月更

你真的了解过Vue的组件化开发吗🔥

渔戈

前端 Vue3 10月月更

全彩LED显示屏近年来在中国的发展趋势

Dylan

LED显示屏 户外LED显示屏 led显示屏厂家

7 步保障 Kubernetes 集群安全

SEAL安全

Kubernetes 云原生 Kubernetes 集群 企业号十月 PK 榜 审计日志

记一个“奇葩”需求的实现

甜点cc

JavaScript 前端 Element UI 10月月更

基于Ernie-3.0 CAIL2019法研杯要素识别多标签分类任务

汀丶人工智能

nlp

复杂场景数据处理的 OLTP 与 OLAP 融合实践

NebulaGraph

数据库 知识图谱

openGemini内核源码正式对外开源

华为云开发者联盟

数据库 物联网 华为云 企业号十月 PK 榜

Vue的开发模式与webpack🔥

渔戈

前端 Vue3 10月月更

vue-router学习-1

Studying_swz

前端 10月月更

HashMap源码分析(六)

知识浅谈

hashmap 10月月更

Java中的super和this关键字详解

共饮一杯无

Java 10月月更 super和this关键字

牛客刷题系列之进阶版(搜索旋转排序数组,链表内指定区间反转)

雪芙花

c c++ 10月月更

2022年第六届数据质量管理国际峰会重磅开启

数据质量管理智库

数据 数据隐私 数据安全 峰会 数据质量

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