现在可以用Rust编写NGINX模块

NGINX 宣布支持 Rust 编写模块

NGINX 宣布了 ngx-rust 项目的可用性,允许开发者使用 Rust 编写 NGINX 模块。Rust 编程语言因其稳定性、安全性、丰富的生态系统和强大的社区支持而成为一种强大且受欢迎的选择。

NGINX 的三大主要功能

NGINX 是一个高性能的开源 Web 服务器和反向代理服务器软件,广泛应用于互联网网站。它的三大主要功能包括:

  1. Web 服务器:处理 HTTP 和 HTTPS 请求,提供静态 Web 内容(如 HTML 文件、图像和 JavaScript),是托管网站和 Web 应用的关键组件。
  2. 反向代理服务器:作为客户端请求和后端服务器之间的中介,常用于分发请求到多个后端服务器,确保负载均衡和容错。
  3. 负载均衡器:将网络流量分配到多台服务器,防止服务器过载,优化资源使用并提升用户体验。

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:

  1. nginx-sys:从 NGINX 源代码生成绑定,通过 bindgen 自动化创建 FFI(外部函数接口)绑定。
  2. 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 入口点(如 postconfigurationpreconfigurationcreate_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 模块的实现,详细内容可参考 此博客

阅读 41
0 条评论