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を開く正しい方法の詳細な説明

推薦する

mysql IS NULL インデックスケースの説明を使用する

導入MySQL の SQL クエリ ステートメントで is null、is not null、!= ...

HTML&CSS&JS 互換性ツリー (IE、Firefox、Chrome)

Web デザインにおけるツリーとは何ですか?簡単に言うと、リンクをクリックするとサブディレクトリが展...

Tudou.com フロントエンドの概要

1. 分業とプロセス<br />Tudou.comでは、プロジェクト開発が中核であり、誰...

Dockerコンテナのエクスポートとインポートの例

目次DockerコンテナのエクスポートDockerコンテナのインポ​​ートこの記事では主に、コンテナ...

Celery と Docker を使用して Django で定期的なタスクを処理する方法

Django アプリケーションを構築して拡張していくと、必然的に特定のタスクをバックグラウンドで自動...

MySQLのインストールと設定方法のグラフィックチュートリアル(CentOS7)

1. システム環境[root@localhost ホーム]# cat /etc/redhat-re...

インライン要素スパンの最小高さの定義

span タグは HTML ウェブページを作成するときによく使用されますが、このタグの使い方がよくわ...

MySQL が暗黙のデフォルト値を処理する方法

何人かの学生は、マスターとスレーブの間の不一致の問題に遭遇したと述べました。一般的な状況としては、m...

fileReader 使用時の落とし穴と解決策

目次fileReader に関する落とし穴iOS における FileReader の落とし穴 (イメ...

スライドドアを実装するための CSS サンプルコード

いわゆるスライディングドアテクノロジーとは、さまざまな長さのテキストに合わせてボックスの背景を自動的...

JavaScriptの信頼性の低い未定義

undefined JavaScript では、値が undefined かどうかを判断したい場合は...

コンテナDockerCommitを介してイメージを送信し、DockerPushでイメージをプッシュします。

ローカルでコンテナを作成した後、このコンテナに基づいてローカル イメージを作成し、このイメージを D...

スローモーションアニメーション効果を実現するJavaScript

この記事では、スローモーションアニメーション効果を実現するためのJavaScriptの具体的なコード...

Vue補間式とv-textディレクティブの違い

目次1. プラグイン式を使用する2. プラグイン式でv-cloakを使用してちらつきの問題を解決する...

ネイティブ JavaScript を使用した Web 計算機の実装

この記事では、参考までに、計算機のWebバージョンを実装するためのJavaScriptの具体的なコー...