NGINXは、NGINXモジュールを Rustで記述できるngx-rustプロジェクトを発表 した。Rustプログラミング言語は、その安定性、セキュリティ機能、豊富なエコシステム、コミュニティの強力なサポートにより、強力で人気のある選択肢として浮上している。
NGINXは高性能なオープンソースのウェブサーバーとリバースプロキシサーバーソフトウェアで、インターネットのウェブサイトの大部分を支えている。2002年にIgor Sysoevによって開発されたNGINXは、その後進化を遂げ、ウェブホスティング、コンテンツ配信、アプリケーションデプロイメントにおいて広く人気を集めている。NGINXはそのパフォーマンス、スケーラビリティ、多用途性で知られ、ウェブコンテンツを提供し、インターネットトラフィックを効率的に管理するための重要なコンポーネントとなっている。
NGINXの主な機能は以下の3つである
-
ウェブサーバー: NGINXは主にウェブサーバーとして動作し、HTTPおよびHTTPSリクエストを処理する。HTMLファイル、画像、JavaScriptなどの静的なウェブコンテンツを提供ができ、ウェブサイトやウェブアプリケーションのホスティングに不可欠なコンポーネントとなっている。
-
リバースプロキシサーバ:NGINXはリバースプロキシサーバとして動作し、クライアントリクエストとバックエンドサーバの仲介を行う。複数のバックエンドサーバにリクエストを分散し、負荷分散と耐障害性を確保するために導入されることが多い。これは特にトラフィックの多い環境において価値がある。
-
ロードバランサー: NGINXはロードバランサーとして動作し、複数のサーバーにネットワークトラフィックを分散できる。これにより、サーバーが過負荷にならないようにし、リソースの使用を最適化し、ユーザーにシームレスなエクスペリエンスを提供する。
もともとngx-rustは、NGINXを使ったIstio互換のサービス・メッシュ製品の開発を促進するために作られた。しかし、このプロジェクトはしばらくの間休眠状態にあった。その間、コミュニティは積極的にこのプロジェクトに関与し、リポジトリをフォークし、ngx-rustが提供するRustバインディングの例に基づいてプロジェクトを作成した。
さらに最近では、F5のDistributed Cloud Bot Defenseチームが、NGINXプロキシを保護サービスに統合することを要求した。そのため、新しいモジュールの開発が必要となった。同時にF5は、Rustのポートフォリオを拡大し、進化する顧客のニーズに対応するために開発者のエクスペリエンスを向上させることを目指した。社内の技術革新スポンサーシップとオリジナルのngx-rust作者とのコラボレーションにより、F5はngx-rustプロジェクトを活性化させた。この復活には、ドキュメントを強化し、コミュニティ利用のためにビルドエルゴノミクスを改善したngx-rustクレートを公開することが含まれる。
NGINXは、ほとんどの機能を実装する基本的なビルディングブロックとしてモジュールに依存している。モジュールはまた、NGINXユーザがその機能をカスタマイズし、特定のユースケースをサポートすることを可能にする。従来、NGINXはC言語で書かれたモジュールをサポートしていたが、コンピュータサイエンスとプログラミング言語理論の進歩により、NGINXモジュール開発にRustのような言語を使用できるようになった。
ngx-rustを使い始めるには、ローカルでソースからビルドするか、ngx-rustプロジェクトに貢献するか、単にcrates.ioからクレートを取得するかを選択できる。ngx-rustのREADMEには、貢献するためのガイドラインとローカルビルド要件が記載されている。ngx-rustはまだ開発の初期段階であるが、F5はコミュニティのサポートによってその品質と機能を向上させる予定である。
ngx-rustプロジェクトは2つの主要なクレートから構成されている。
-
nginx-sys: このクレートはNGINXソースコードからバインディングを生成し、
bindgen
コード自動化によってFFI(Foreign Function Interface)バインディングの作成を自動化する。 -
ngx: メインのクレートは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を実装する必要があり、postconfiguration
、preconfiguration
、create_main_conf
などのNGINXエントリポイントを定義する。新しいモジュールは、その特定のタスクに必要な関数だけを実装すればよい。次のコードは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の機能を強化し、開発者により安全で人間工学的なウェブサーバでの作業方法を提供することを目的としている。また、この詳細なブログ記事で報告されているように、CloudflareはNGINXモジュールの実装にRustを使い始めた。