njs モジュールを使用して nginx 構成に js スクリプトを導入する

njs モジュールを使用して nginx 構成に js スクリプトを導入する

序文

多くの 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ファイルをnginxルートディレクトリのmodulesディレクトリに配置します。
  • nginx.confにインポートモジュールを追加する
モジュールモジュール/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モジュールでサポートされる命令と対応する処理ステージ

処理段階HTTP モジュールストリームモジュール
アクセス – 認証とアクセス制御auth_request と js_content js_アクセス
事前読み取り – ペイロードの読み取り/書き込み該当なしjs_preread
フィルター – プロキシ中の読み取り/書き込み応答js_body_filter js_header_filter js_フィルター
コンテンツ – クライアントに応答を送信するjs_コンテンツ該当なし
ログ/変数 – 要求に応じて評価js_set js_set

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 は js 構文をサポートしています: https://nginx.org/en/docs/njs/compatibility.html?_ga=2.128028686.301589667.1638621670-451035464.1638621670
  • NGINX JavaScript モジュールを使用して、リクエストごとに JavaScript のパワーと利便性を活用する: https://www.nginx.com/blog/harnessing-power-convenience-of-javascript-for-each-request-with-nginx-javascript-module
  • NJS モジュールのドキュメント: http://nginx.org/en/docs/http/ngx_http_js_module.html#example
  • ソースコード: https://hg.nginx.org/njs/?_ga=2.99259804.301589667.1638621670-451035464.1638621670
  • NJS 組み込みオブジェクト、メソッド、関数: https://nginx.org/en/docs/njs/reference.html
  • NJS の使用例: https://github.com/nginx/njs-examples/#hello-world-example-http-hello

要約する

njs モジュールを使用して nginx 構成に js スクリプトを導入する方法についての記事はこれで終わりです。nginx 構成に js スクリプトを導入することに関するより関連性の高いコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

<<:  HTML ページに SVG を挿入する複数の方法

>>:  CSSでemを開く正しい方法の詳細な説明

推薦する

親子コンポーネントの通信を解決するための3つのVueスロット

目次序文環境の準備カテゴリコンポーネントアプリのコンポーネント1. デフォルトスロット2. 名前付き...

MySQLがbinlogファイルを手動で登録し、マスタースレーブ異常を引き起こす理由

1. 問題の原因友人の @水米田 から、POSITION に基づくマスタースレーブについて質問があり...

JavaScriptは両端キューを実装する

この記事の例では、両端キューを実装するためのJavaScriptの具体的なコードを参考までに共有して...

ReactでCSSをエレガントに書く方法

目次1. インラインスタイル2. インポート方法を使用する3.cssモジュールのエクスポート4. ス...

MySQL ストレージ エンジン MyISAM と InnoDB の違いの概要

1. MySQLのデフォルトストレージエンジンの変更MySQL 5.1 より前のバージョンでは、デフ...

MySQLでカンマ区切り値の列を列に変換する方法

序文場合によっては、第 1 正規形設計パターンに従わないビジネス テーブルに遭遇することがあります。...

JavaScript でプロパティハイジャックを実装する方法 defineProperty

目次序文記述子getとsetの詳細な説明オブジェクトの属性の乗っ取りオブジェクトのすべてのプロパティ...

Vue で jsx 構文を正しく使用する方法

目次序文仮想DOM仮想DOMとは仮想DOMの利点レンダリング関数とは何ですか? jsx Vue3 で...

2048 ゲームを実装するためのネイティブ js

2048ミニゲーム、参考までに具体的な内容は以下のとおりですまず、2048ゲームは16のグリッドか...

ウェブサイトのコンテンツが検索エンジンに含まれないようにする方法

通常、Web サイトを構築する目的は、検索エンジンにインデックス登録してもらい、プロモーションを拡大...

TypeScript のユニオン型、交差型、型ガード

目次1. ユニオンタイプ2. クロスオーバータイプ3. 型保護3.1 カスタム型保護3.2 保護の種...

1つの記事でNavicat for MySQLの基本を理解する

目次1. データベース操作2. データ型3. バックアップとリカバリ3. 操作4. 上級5. 知識補...

vue3 のさまざまなファイルタイプのプレビュー機能の例

目次序文1. オフィス文書の種類のプレビュー2. PDF形式のプレビュー3. 画像の種類4. ビデオ...

Zabbix 5.0 ディスク自動検出と読み取り/書き込み監視の問題を分析する

ディスクを自動的に検出する構成キーの値注: このキー値は Linux プラットフォームでのみサポート...

CSS で中空効果を実装するサンプルコード

効果原理主にCSSグラデーションを使用して、切り取りを必要としない背景のくり抜きを実現します。クーポ...