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

推薦する

nginx がアップストリーム アドレスにジャンプしない問題の解決方法

序文今日、nginx で非常に奇妙な問題に遭遇しました。フロントエンドの tomcat がページにジ...

Linux システム Docker への ASP.NET Core アプリケーションのデプロイのプロセス分析

目次1. システム環境2. 運用プロセスと途中で遭遇した問題1. システム環境1. Tencent ...

Docker イメージを削除できません エラー: そのようなイメージはありません: xxxxxx 解決策

序文docker イメージを削除できません。docker docker imagesを確認すると、イ...

航空機戦争ゲームを実装するためのJavaScript

この記事では、キャンバスとjsを使用して簡単な飛行機戦争を実装する方法を参考までに紹介します。具体的...

JavaScriptの原理と方向性

これが何を指しているのかをどのように判断するのでしょうか? ①グローバル環境で呼び出された場合はwi...

CSS3 は本当に SCSS に取って代わるのでしょうか?

Web ページのスタイル設定に関しては、プロジェクトで純粋な CSS または SCSS (および他...

MySQLは2つの日付間の日数、月数、年数を計算します

MySQL 組み込みの日付関数 TIMESTAMPDIFF は、2 つの日付間の秒数、分数、時間数、...

JavaScript は、シンプルな虫眼鏡の最も完全なコード分析を実装します (ES5)

この記事では、参考までに、シンプルな虫眼鏡を実装するためのJavaScriptの具体的なコードを紹介...

MySQLインデックスの作成について知っておくべきこと

目次序文: 1. インデックスメソッドを作成する2. インデックスを作成するために必要な権限序文: ...

例を通してMySQLパーティションテーブルの原理と一般的な操作を学びます

1. パーティションテーブルの意味パーティション テーブル定義は、任意のサイズに設定できるルールに従...

Dockerfile echoは、指定されたファイル内の複数行のテキストを実装する方法を指定します。

Dockerfile内の指定されたファイルに複数の行を追加します。echoの後の「$」記号に注意し...

MySQL ステートメントの概要

目次1. データベースの使用を選択2. 情報を表示する3. テーブルを作成する4. データを挿入する...

ランダムロールコールテーブルを実装するためのネイティブJavaScript

この記事では、JavaScriptのランダムロールコールテーブルの具体的なコードを参考までに紹介しま...