序文多くの Web 開発者は Lua 言語に精通していないため、nginx は njs モジュールを導入しました。これにより、nginx 構成に js スクリプトを導入して、より複雑な nginx 構成機能を実現できます。 以下ではnjsモジュールの機能と使い方を紹介します。 1. NJSモジュールをインストールするload_module ディレクティブはこのバージョンからのみサポートされているため、nginx バージョン 1.9.11 以上が必要です。 方法1: NJSモジュールを動的にロードする注: nginx のバージョンが異なると、対応するバージョンの NJS モジュールが必要になります。
モジュールモジュール/ngx_http_js_module.soをロードします。 モジュールモジュール/ngx_stream_js_module.so をロードします。 方法2: コンパイル中にモジュールを追加するソースコードをダウンロードする https://hg.nginx.org/njs/?_ga=2.99259804.301589667.1638621670-451035464.1638621670 このリポジトリはMercurialで管理されており、ソースコードをダウンロードするにはhgコマンドを使用する必要があります。 hg クローン http://hg.nginx.org/njs nginxをコンパイルするときに次の設定を追加します ./configure --add-module=<njs へのパス>/njs/nginx 2. NJSモジュールの動作環境の特徴NJS モジュールは Nodejs を実行しないため、nginx js は lua モジュールのように nginx のミドルウェアとしてのみ使用でき、完全なバックエンド サービスとして独立して使用することはできません。 フロントエンドの学生が慣れ親しんでいるノードやブラウザの実行環境とは異なり、njs は v8 解析エンジンを使用しません。Nginx は ECMAScript 言語仕様に基づいて解析エンジンを公式にカスタマイズします。そのため、サポートされる構文や機能も標準とは異なります。 1. リクエストごとにランタイム環境を作成し、リクエストが終了したら破棄する ノード実行時に起動した仮想マシンはメモリ内に常駐し、仮想マシン実行時にメモリガベージコレクションが自動的に完了します。 NJS は、リクエストごとに新しい仮想マシンを作成し、メモリを割り当て、リクエストの終了時に仮想マシンを破棄してメモリを解放します。 2. 非ブロッキングコード実行 njs はイベント駆動型モデルを使用して NJS ランタイム環境をスケジュールします。 NJS がブロッキング操作 (ネットワーク データの読み取りや外部サブリクエストの作成など) を実行すると、Nginx は現在の NJS VM の実行を一時停止し、イベントが完了したら再スケジュールします。したがって、NJSコードは単純な線形方式で記述できる。 3. ECAMA仕様構文の一部のみサポート NJSはECMAScript 5.1仕様に基づいており、ECMAScript 6の一部の機能をサポートしています。 サポートされている構文のリスト https://nginx.org/en/docs/NJS/compatibility.html?_ga=2.91935000.301589667.1638621670-451035464.1638621670 4. 統合リクエストの処理 Nginx はリクエストを複数の段階で処理します。通常、Nginx の命令は特定の段階で実行され、リクエストを処理します。Nginx モジュールはこの機能を使用して、リクエストをデバッグまたは変更します。 NJS モジュールは、特定の段階で js コード ロジックを実行するための命令も使用します。 3つのNJSモジュールでサポートされる命令と対応する処理ステージ
NJSの簡単な使用例4つ次の例では、jsを使用してログ形式を定義します。 Nginx設定ディレクトリにlogging.jsファイルを作成する // ファイルの場所: [nginx ルート ディレクトリ]/conf/logging.js // ファイルの内容: リクエストを解析し、すべてのリクエストヘッダーを出力します。 function logAllHeaders(r) { var log = `${r.variables.time_iso8601} client=${r.remoteAddress} method=${r.method} uri=${r.uri} status=${r.status}`; r.rawHeadersIn.forEach(h => log += ` in.${h[0]}=${h[1]}`); r.rawHeadersOut.forEach(h => log += ` out.${h[0]}=${h[1]}`); ログを返します。 } デフォルトをエクスポートする { logAllHeaders } # nginx 設定ファイル http { js_import logging.js; #js_import は js スクリプトをロードします。このスクリプトは nginx 設定ファイルのディレクトリに配置されます。js ファイル名はモジュールの名前空間として使用されます。関数を参照する場合は、[ファイル名] で参照できます。 [関数名] js_set $log_all_headers logging.logAllHeaders; #js_set は js ファイル内の関数 logAllHeaders の出力を変数 $log_all_headers に保存します。 log_format kvpairs $log_all_headers; # ログ形式をカスタマイズする kvpairs サーバー{ 聞く 80; access_log /var/log/nginx/access.log kvpairs; # このルールのログ形式を、ルート上のカスタマイズされた形式に設定します /usr/share/nginx/html; } } 5. NJSがサポートするコマンド参照ドキュメント NJS は多くの命令をサポートしていません。複雑な機能を実現するには、他の Nginx 命令と組み合わせて使用する必要があります。 以下はよく使われる指示です js_body_filterはレスポンスの本文を変更します 構文: js_body_filter function | module.function [buffer_type=string | buffer]; デフォルト: - コンテキスト: location、limit_except このディレクティブはバージョン 0.5.2 で登場しました。 例 /** * レスポンスボディを処理する関数 * @param { object } r - http オブジェクト * @param { buffer_type } data - リクエストボディデータ * @param { boolean } flags - 最後のデータブロックかどうか */ 関数フィルター(r, データ, フラグ) { r.sendBuffer(data.toLowerCase(), フラグ); } js_contentはリクエストレスポンスを処理する 構文: js_content function | module.function; デフォルト: - コンテキスト: location、limit_except 例 http { # js モジュールをインポートします js_import http.js; サーバー{ 聞く 80; 場所 / コンテンツ { # js_content 命令を通じて実行される js 関数を指定します js_content http.content; } } } // http.js ファイル関数 content(r) { r.ステータス = 200; r.headersOut['Content-Type'] = "text/plain; charset=utf-8"; r.headersOut['コンテンツの長さ'] = 12; r.sendHeader(); r.send("満足です"); r.終了() } エクスポートデフォルト{コンテンツ} js_header_filterは返されたリクエストヘッダーを変更します 構文: js_header_filter function | module.function; デフォルト: - コンテキスト: location、limit_except このディレクティブはバージョン 0.5.1 で登場しました。 js_importはjsファイルをインポートします 構文: js_import module.js | export_name from module.js; デフォルト: - コンテキスト: http このディレクティブはバージョン 0.4.0 で登場しました。 例 http { # js モジュールをインポートします。ファイル名はモジュールの名前空間として使用されます。関数を参照する場合は、[ファイル名].[関数名] で参照できます。js_import http.js; サーバー{ 聞く 80; 場所 / コンテンツ { # js_content 命令を通じて実行される js 関数を指定します js_content http.content; } } } js_setは変数を設定します 構文: js_set $variable function | module.function; デフォルト: - コンテキスト: http この命令によって参照される関数は、変数が初めて参照されたときに実行されます。関数内では同期操作のみがサポートされます。 参考文献
要約するnjs モジュールを使用して nginx 構成に js スクリプトを導入する方法についての記事はこれで終わりです。nginx 構成に js スクリプトを導入することに関するより関連性の高いコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 |
目次序文環境の準備カテゴリコンポーネントアプリのコンポーネント1. デフォルトスロット2. 名前付き...
1. 問題の原因友人の @水米田 から、POSITION に基づくマスタースレーブについて質問があり...
この記事の例では、両端キューを実装するためのJavaScriptの具体的なコードを参考までに共有して...
目次1. インラインスタイル2. インポート方法を使用する3.cssモジュールのエクスポート4. ス...
1. MySQLのデフォルトストレージエンジンの変更MySQL 5.1 より前のバージョンでは、デフ...
序文場合によっては、第 1 正規形設計パターンに従わないビジネス テーブルに遭遇することがあります。...
目次序文記述子getとsetの詳細な説明オブジェクトの属性の乗っ取りオブジェクトのすべてのプロパティ...
目次序文仮想DOM仮想DOMとは仮想DOMの利点レンダリング関数とは何ですか? jsx Vue3 で...
2048ミニゲーム、参考までに具体的な内容は以下のとおりですまず、2048ゲームは16のグリッドか...
通常、Web サイトを構築する目的は、検索エンジンにインデックス登録してもらい、プロモーションを拡大...
目次1. ユニオンタイプ2. クロスオーバータイプ3. 型保護3.1 カスタム型保護3.2 保護の種...
目次1. データベース操作2. データ型3. バックアップとリカバリ3. 操作4. 上級5. 知識補...
目次序文1. オフィス文書の種類のプレビュー2. PDF形式のプレビュー3. 画像の種類4. ビデオ...
ディスクを自動的に検出する構成キーの値注: このキー値は Linux プラットフォームでのみサポート...
効果原理主にCSSグラデーションを使用して、切り取りを必要としない背景のくり抜きを実現します。クーポ...