硬核干货——《中小企业 AI 实战指南》免费下载! 了解详情
写点什么

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

评论 1 条评论

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

SAP Fiori 应用 Footerbar 区域按钮的高亮显示逻辑

汪子熙

JavaScript SAP Fiori SAP UI5

让秋招飞,Java岗高频面试题盘点,站着就把offer给拿了

北游学Java

Java 面试 秋招

【架构实战营】第 4 模块作业

swordman

架构实战营

python-运算函数-sum

Geek_6370d5

☕【Java技术之旅】从底层角度去认识线程的原理

码界西柚

Java 线程 Thread 线程协作 5月日更

如何将BSP应用配置成Fiori Launchpad上的一个tile

汪子熙

SAP abap Fiori SAP UI5 bsp

SAP 不同 ABAP 系统里同一 Customizing activity 的显示差异分析

汪子熙

CRM SAP ERP abap 定制化

另一种方式实现事务码SE16里的结果集修改

汪子熙

JavaScript SAP Fiori

C4C Cloud Application Studio做ABSL开发的一些性能方面的最佳实践

汪子熙

Cloud CRM SAP C4C

模块四-千万级学生管理系统试卷存储方案

华仔架构训练营

架构实战营 模块四:学习总结

👈

架构实战营

Authorization object在哪些ABAP代码里使用到

汪子熙

CRM SAP abap Netweaver

利用Chrome的Heap Snapshot功能分析一个时间段内的内存占用率

汪子熙

JavaScript chrome

HBase常见问题

数据社

大数据 HBase 5月日更

千万级学生管理系统的考试试卷存储方案

颜培攀

架构实战营

Inner Join, Left Outer Join和Association的区别

汪子熙

SAP abap ST05

SAP Fiori Launchpad Tile点击后跳转的调试技巧

汪子熙

JavaScript SAP Fiori SAP UI5

SAP CDS view注解解析 - @Environment.systemField

汪子熙

SAP abap

架构实战营 模块四:课后作业

👈

架构实战营

Kafka-详细笔记

ninetyhe

分布式 高并发系统设计 消息系统 Kafk

到底哪种类型的错误信息会阻止business transaction的保存

汪子熙

CRM SAP abap

一个查看 SAP UI5 控件所有公有方法的小技巧

汪子熙

JavaScript SAP SAP UI5

数据科学指南#基础篇 Matplotlib 入门

Lev

Python 数据科学 matplotlib data-science

Java Elasticsearch 使用

Java elasticsearch

如何在SAP CRM WebClient UI里创建HANA Live Report

汪子熙

CRM SAP WebClient UI

找出 SAP OData service出错根源的小技巧

汪子熙

SAP Fiori SAP UI5 OData

使用DOM Breakpoints找到修改属性的Javascript代码

汪子熙

JavaScript html chrome

学生考试系统存储设计

王硕

架构训练营

架构实战营作业4

大肚皮狒狒

架构师实战营:模块四 千万级学生管理系统的考试试卷存储方案

ifc177

#架构实战营

美团二面:Redis与MySQL双写一致性如何保证?

捡田螺的小男孩

数据库 面试 一致性 缓存;

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