NGINX 宣布支持 Rust 编写模块
NGINX 宣布了 ngx-rust 项目的可用性,允许开发者使用 Rust 编写 NGINX 模块。Rust 编程语言因其稳定性、安全性、丰富的生态系统和强大的社区支持而成为一种强大且受欢迎的选择。
NGINX 的三大主要功能
NGINX 是一个高性能的开源 Web 服务器和反向代理服务器软件,广泛应用于互联网网站。它的三大主要功能包括:
- Web 服务器:处理 HTTP 和 HTTPS 请求,提供静态 Web 内容(如 HTML 文件、图像和 JavaScript),是托管网站和 Web 应用的关键组件。
- 反向代理服务器:作为客户端请求和后端服务器之间的中介,常用于分发请求到多个后端服务器,确保负载均衡和容错。
- 负载均衡器:将网络流量分配到多台服务器,防止服务器过载,优化资源使用并提升用户体验。
ngx-rust 项目的背景与复兴
ngx-rust 最初是为了加速开发与 Istio 兼容的 NGINX 服务网格产品而创建。虽然项目一度停滞,但社区积极参与,基于 ngx-rust 提供的 Rust 绑定示例进行了分叉和开发。
最近,F5 的 Distributed Cloud Bot Defense 团队需要将 NGINX 代理集成到其保护服务中,这促使了新模块的开发。同时,F5 希望扩展其 Rust 产品组合并改进开发者体验。通过内部创新赞助和与 ngx-rust 原作者的合作,F5 复兴了 ngx-rust 项目,发布了改进文档和构建便利性的 ngx-rust crates。
NGINX 模块与 Rust 的结合
NGINX 依赖模块作为实现大多数功能的基本构建块,传统上仅支持 C 语言编写的模块。随着计算机科学和编程语言理论的发展,Rust 等语言也被用于开发 NGINX 模块。
ngx-rust 项目的关键组件
ngx-rust 项目包含两个关键 crates:
- nginx-sys:从 NGINX 源代码生成绑定,通过
bindgen自动化创建 FFI(外部函数接口)绑定。 - ngx:实现 Rust 胶水代码和 API,并重新导出 nginx-sys。模块开发者通过 ngx 符号与 NGINX 交互,无需显式导入 nginx-sys。
如何开始使用 ngx-rust
开发者可以选择从源代码本地构建、贡献到 ngx-rust 项目,或直接从 crates.io 获取 crate。ngx-rust 的 README 提供了贡献指南和本地构建要求。虽然 ngx-rust 仍处于早期开发阶段,但 F5 计划通过社区支持提升其质量和功能。
创建 Rust 模块的示例
创建 Rust 模块需要实现 HTTPModule 特性,定义 NGINX 入口点(如 postconfiguration、preconfiguration、create_main_conf 等)。以下是一个 postconfiguration 方法的示例代码:
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 的功能,并为开发者提供更安全、更便捷的工作方式。Cloudflare 也开始使用 Rust 进行 NGINX 模块的实现,详细内容可参考 此博客。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。