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

推薦する

Reactは適応性の高い仮想リストを実装する

目次変換前:変換後: 0x0の基本0x1 「固定高さ」の仮想リストを実装する原理:最適化: 0x2 ...

CSS スティッキーフッタークラシックレイアウトの実装

スティッキーフッターレイアウトとは何ですか?一般的な Web ページのレイアウトは、通常、ヘッダー部...

MySQL の遅いクエリとクエリ再構築方法の記録

序文スロークエリとは何か、またスロークエリを最適化するにはどうすればよいか。以下では、これら 2 つ...

Reactイベントバインディングの詳細な説明

1. 何ですかreactアプリケーションでは、イベント名はキャメルケース形式で記述されます。たとえ...

MySQL でパーティション分割後にクエリを実装するために MRG_MyISAM (MERGE) を使用する例

大量のデータベース データを最適化することは非常に高度な科学であり、開発者が習得する必要がある専門的...

base target="" はフレームを開くためのベースリンクのターゲットを指定します

<base target=_blank> は、基本リンクのターゲット フレームを新しいペ...

HTMLは無効なテーブル幅設定の問題を解決します

テーブルに table-layer:fixed スタイルを設定し、テーブル内の行が結合されていること...

html2canvas で破線境界線を実装する例

html2canvas は、HTML 要素からキャンバスを生成するライブラリです。描画されるキャンバ...

mysqldump でデータベースをバックアップするときに特定のライブラリを除外する例

例: mysqldump –all-databases を使用すると、すべてのライブラリがエクスポー...

ubuntu20.04 LTSにdockerをインストールする方法

ゼロ: 古いバージョンをアンインストールするDocker の古いバージョンは、docker、dock...

JavaScript の async と await のシンプルで詳細な学習

目次1. はじめに2. 詳しい説明2.1、非同期2.1.1. 関数はPromise以外のオブジェクト...

Dockerを使用してSonarQubeをインストールする詳細なチュートリアル

目次1. イメージをプルする1.1 関連するイメージをプルして実行する1.1.1 関連する画像を取得...

Node.js でメモリ効率の高いアプリケーションを作成する方法

目次序文問題: 大きなファイルのコピーNodeJS のストリームとバッファバッファストリーム解決策 ...

DockerでRedisをデプロイして起動する方法

DockerでRedisをデプロイするまずLinuxにDockerをインストールし、次にDocker...