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_FOLDER
mkdir ngx-rust-howto
cd ngx-rust-howto
cargo 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/
声明:本文由 InfoQ 翻译,未经许可禁止转载。
点击底部阅读原文访问 InfoQ 官网,获取更多精彩内容!
微信扫码关注该文公众号作者