写点什么

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

作者:Claudio Masolo

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

    阅读完需:约 6 分钟

大小:743.70K时长:00:00
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:0011351

评论 1 条评论

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

一文了解登陆Hoo虎符的Moonbeam治理通证GLMR

区块链前沿News

Hoo 虎符交易所 Moonbeam GLMR

开发者喜欢的“夜宵”是什么?揭秘开发者的独特“口味”

OceanBase 数据库

数据库 开源 新年 oceanbase 开发者大会

【前端】一文彻底学会Promise

恒生LIGHT云社区

JavaScript 前端 Promise

2022年,跨境ERP还是一门好生意吗?

ToB行业头条

大画 Spark :: 网络(2)-上篇-通过网络收取消息的过程

dclar

大数据 spark Spark 源码

尚硅谷《MySQL高级特性篇》教程发布

@零度

MySQL

如何突破职业瓶颈

FunTester

Go 性能测试 测试框架 FunTester 职业瓶颈

java开发之SpringBoot转发和重定向

@零度

JAVA开发 springboot

2021中国开源先锋33人榜单出炉:华为三位开源专家入选

科技热闻

研读网络安全法律法规,提升技术管理者 “法” 商

星环科技

全面拆解携程云原生实践,打造智能弹性的云端酒店直连系统!

亚马逊云科技 (Amazon Web Services)

网络

强化云原生基础服务,焱融科技 YRCloudFile 与秒云完成产品兼容性互认证

焱融科技

云计算 分布式 云原生 高性能 文件存储

TCP socket和web socket的区别

汪子熙

前端 node,js 1月月更

大咖眼中的AI开源|王敏捷:深图在人工智能中的探索和研究

亚马逊云科技 (Amazon Web Services)

网络

The Data Way Vol.9|还不清楚商业化之于开源的价值?建议你看看这家公司

SphereEx

数据库 开源 播客 ShardingSphere SphereEx

万字总结Keras深度学习中文文本分类

华为云开发者联盟

深度学习 CNN keras 文本分类 TextCNN

APP性能分析工作台——你的最佳桌面端性能分析助手

字节跳动终端技术

字节跳动 APM Mars 应用性能监控产品

🏆【Alibaba中间件技术系列】「RocketMQ技术专题」让我们一同来看看RocketMQ和Kafka索引设计

码界西柚

RocketMQ Alibaba Alibaba技术 1月月更

大数据开发之离线分析工具Hive

@零度

大数据 hive

Tech Talk 活动预告|“公有云+5G” 时代下的开发难题,架构师大咖带你逐个击破!

亚马逊云科技 (Amazon Web Services)

网络

百度搜索中台新一代内容架构:FaaS化和智能化实战

百度Geek说

架构 后端 搜索 Faas

盘点 | 常用 PG 数据恢复方案概览【建议收藏】

RadonDB

数据库 postgresql RadonDB

AWS Command Line Interface 使用S3入门

阿呆

AWS S3

如何提高后台服务应用问题的排查效率?日志 VS 远程调试

汪子熙

node.js 后台开发 1月月更

近数据处理(NDP)——GaussDB(for MySQL)性能提升的秘密

华为云开发者联盟

MySQL 多线程 GaussDB(for MySQL) 近数据处理 算子下推

Kafka的生产集群部署

编程江湖

kafka

高新技术企业几维科技加入龙蜥,为操作系统安全添砖加瓦

OpenAnolis小助手

Linux 开源

模块六作业

Geek_e6f7f6

架构训练营

使用亚马逊云科技安全服务防御、检测和响应 Log4j 漏洞

亚马逊云科技 (Amazon Web Services)

网络

服务探活的五种方式

捉虫大师

微服务 dubbo 健康检查 服务探活

低代码实现探索(十三)字典.静态实体.系统变量

零道云-混合式低代码平台

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