NGINX JavaScriptモジュール(njs)を導入して以来、2015 (元の名前は nginScript) を開発し、2017 年に一般公開して以来、数十回のバージョン アップデートを通じて、新機能の追加と実装の改良を着実に続けてきました。 通常、NGINX JavaScript の新しいバージョンの機能については NGINX Plus のリリースを待って議論しますが、今回はバージョン 0.7.7 に非常に興奮しており、待ちきれません。
njs 0.7.7 の大幅な機能強化により、NGINX 構成がさらにモジュール化され、整理され、再利用しやすくなります。
fs.FileHandle
オブジェクトにより、ファイル操作がより効率的になります。njs の詳細と、サンプル コードを提供しているユース ケースの一覧を確認するには、ブログの「NGINX JavaScript モジュールを使用して各リクエストで JavaScript のパワーと利便性を活用する」をお読みください。
njs 0.7.7 のすべての新機能とバグ修正の完全なリストについては、変更点のドキュメントを参照してください。
以前の njs バージョンでは、JavaScript コードをインポートし、 js_import
、 js_path
、 js_set
、およびjs_var
ディレクティブを使用して、最上位のhttp
またはストリーム
コンテキストで関連する変数を宣言する必要がありました。これは、メイン ファイルの先頭でグローバル変数を宣言するのと同じです。 ただし、実際に JavaScript 関数と変数を呼び出すディレクティブは、子コンテキストに表示されます。たとえば、HTTP location{}
ブロック内のjs_content
ディレクティブや、Stream server{}
ブロック内のjs_access
ディレクティブなどです。 これにより、次の 2 つの問題が発生します。
http
およびstream
コンテキスト内の宣言は、関連するコードと変数が実際にどこで使用されているかが示されていないため、本質的にはノイズです。http{} ブロック
とstream{}
ブロックを含め、 include
ディレクティブを使用して/etc/nginx/conf.dおよび/etc/nginx/stream.dディレクトリから小さな機能固有の設定ファイルを読み込むことをお勧めしますが、NGINX の設定は柔軟であり、複数のファイルにhttp{} ブロック
とstream{}
ブロックを含めることができます。 これは、複数の人が NGINX 構成に取り組んでおり、確立された規則に必ずしも従わない可能性がある環境では特に問題になる可能性があります。njs 0.7.7 以降では、コードをインポートし、変数が使用されるコンテキストで変数を宣言できます。
HTTP –
これらのディレクティブは、 http
コンテキストだけでなく、サーバー コンテキスト
とロケーション
コンテキストにも出現できます。
これらのディレクティブは、 if
コンテキストだけでなく、 location
およびlimit_except
コンテキストにも出現できます。
特定のユースケースのすべての njs 構成を 1 つのファイルにまとめると、コードのモジュール化と移植性も向上します。
たとえば、以前の njs バージョンでは、新しいスクリプトを追加するときに、 nginx.conf ( js_import
と、場合によってはjs_path
、 js_set
、 js_var
を追加) と、JavaScript 関数が呼び出されるファイル (ここではjscode_local.conf ) の両方を変更する必要がありました。
njs 0.7.7 以降では、 util 関数に関連するすべての設定はjscode_integrated.conf という1 つのファイルにあります。
njs 0.7.7 のいくつかの新機能により、実行中のコンテキスト (処理フェーズ) に応じて JavaScript コードの動作を変更できるようになりました。
r.internal
プロパティHTTP r.internal
プロパティは、内部リクエスト ( internal
ディレクティブを含むlocation{}
ブロックによって処理される) に対して「true」に設定されるブール フラグです。 スクリプトが内部コンテキストと非内部コンテキストの両方で呼び出すことができる一般的なイベント ハンドラーを使用する場合は、 r.internal
フラグを使用してロジックをフォークできます。
以下は内部リクエストとして分類されます:
error_page
、 index
、 random_index
、 try_files
ディレクティブによってリダイレクトされたリクエストX-Accel-Redirect
応答ヘッダーによってリダイレクトされたリクエストauth_request
およびmirror
ディレクティブ、 ngx_http_addition_moduleモジュール内のディレクティブ、または Server Side Include (SSI) include
仮想
コマンド ( ngx_http_ssi_moduleモジュールでサポート) によって呼び出されるサブリクエスト書き換え
指示によって変更されたリクエストs.send()
ストリーム メソッドの改善以前の njs バージョンでは、Stream s.send()
メソッドはコンテキストに依存します。これは、メソッドが呼び出されるコールバックの場所 (上流または下流) によって、データを送信する方向が決まるためです。 これは、 s.send()
が元々設計された同期コールバックでは正常に機能しますが、 ngx.fetch()
などの非同期関数では失敗します。
njs 0.7.7 以降では、方向は別の内部フラグに保存され、 s.send()
で使用できるようになります。
fs.FileHandle()
オブジェクトによるより効率的なファイル操作ファイル システム モジュール ( fs
) は、ファイルに対する操作を実装します。 fs
モジュールの新しいFileHandle
オブジェクトは、数値ファイル記述子のオブジェクト ラッパーです。 FileHandle
オブジェクトのインスタンスは、fs.promises.open()
メソッドによって作成されます。
FileHandle
オブジェクトを使用してファイル記述子を取得します。このファイル記述子はさらに次の目的で使用できます。
read()
やwrite()
などの関数を実行するFileHandle
の次のプロパティが実装されています (各プロパティの必須およびオプションの引数の詳細については、ドキュメントを参照してください)。
ファイルハンドル.fd
ファイルハンドル.read()
ファイルハンドル.stat()
ファイルハンドル.write()
ファイルハンドル.write()
ファイルハンドル.close()
これらのメソッドは、 FileHandle
をサポートするように更新されました (各メソッドの引数の詳細については、リンクされたドキュメントを参照してください)。
njs 0.7.7 では、チームが njs コードで作業したり共有したりすることがより容易になりました。 njs ディレクティブの拡張コンテキストにより、カスタム JavaScript コードを使用して NGINX 構成を拡張することがさらに簡単になります。 API ゲートウェイ、リバース プロキシ、または Web サーバーへの第一歩を踏み出すことができます。これは単なるミドルウェアやエッジ コンポーネント以上のものです。 スタックに別のコンポーネントを追加することなく、JavaScript、 TypeScript 、またはサードパーティのノード モジュールを通じてアプリケーションの一部にすることができます。 必要なのはNGINXだけです!
ご質問がありますか? NGINX コミュニティ Slackに参加し、 #njs-code-reviewチャネルをチェックして、詳細を知り、質問し、njs コードに関するフィードバックを得てください。
「このブログ投稿には、入手できなくなった製品やサポートされなくなった製品が参照されている場合があります。 利用可能な F5 NGINX 製品およびソリューションに関する最新情報については、 NGINX 製品ファミリーをご覧ください。 NGINX は現在 F5 の一部です。 以前の NGINX.com リンクはすべて、F5.com の同様の NGINX コンテンツにリダイレクトされます。"