ngx_stream_js_module モジュール

知られていること
設定例
ディレクティブ
     js_access
     js_filter
     js_include
     js_preread
     js_set
Session Object Properties

ngx_stream_js_module モジュールはnginScript - JavaScript言語のサブセット、でのハンドラを実装するために使われます。

このモジュールはデフォルトではビルドされず、--add_module configuration パラメータを使ってnginScriptと一緒にコンパイルする必要があります:

./configure --add-module=path-to-njs/nginx

nginScriptモジュールと一緒にrepositoryは以下のコマンド(Mercurial クライアントが必要です)を使ってクローンすることができます:

hg clone http://hg.nginx.org/njs

このモジュールは動的なものとしてビルドすることもできます:

./configure --add-dynamic_module=path-to-njs/nginx

知られていること

このモジュールは実験的なもので、利用者責任です。

設定例

stream {
    js_include stream.js;

    js_set $foo foo;
    js_set $bar bar;

    server {
        listen 12345;

        js_preread qux;
        return     foo;
    }

    server {
        listen 12346;

        js_access  xyz;
        proxy_pass 127.0.0.1:8000;
        js_filter  baz;
    }
}

http {
    server {
        listen 8000;
        location / {
            return 200 $http_foo\n;
        }
    }
}

The stream.js file:

var req = '';
var matched = 0;
var line = '';

function qux(s) {
    n = s.buffer.indexOf('\n');
    if (n == -1) {
        return s.AGAIN;
    }

    line = s.buffer.substr(0, n);
}

function foo(s) {
    return line;
}

function bar(s) {
    var v = s.variables;
    s.log("hello from bar() handler!");
    return "foo-var" + v.remote_port + "; pid=" + v.pid;
}

// The filter processes one buffer per call.
// The buffer is available in s.buffer both for
// reading and writing.  Called for both directions.

function baz(s) {
    if (s.fromUpstream || matched) {
        return;
    }

    // Disable certain addresses.

    if (s.remoteAddress.match('^192.*')) {
        return s.ERROR;
    }

    // Read HTTP request line.
    // Collect bytes in 'req' until request
    // line is read.  Clear current buffer to
    // disable output.

    req = req + s.buffer;
    s.buffer = '';

    n = req.search('\n');

    if (n != -1) {
        // Inject a new HTTP header.
        var rest = req.substr(n + 1);
        req = req.substr(0, n + 1);

        addr = s.remoteAddress;

        s.log('req:' + req);
        s.log('rest:' + rest);

        // Output the result and skip further
        // processing.

        s.buffer = req + 'Foo: addr_' + addr + '\r\n' + rest;
        matched = 1;
    }
}

function xyz(s) {
    if (s.remoteAddress.match('^192.*')) {
        return s.ABORT;
    }
}

ディレクティブ

構文: js_access function;
デフォルト: -
コンテキスト: stream, server

access フェーズで呼ばれるnginScript関数を設定します。

構文: js_filter function;
デフォルト: -
コンテキスト: stream, server

データフィルタを設定します。

構文: js_include file;
デフォルト: -
コンテキスト: stream

nginScript内のサーバと変数のハンドラを実装するファイルを指定します。

構文: js_preread function;
デフォルト: -
コンテキスト: stream, server

preread フェーズで呼ばれるnginScript関数を設定します。

構文: js_set $variable function;
デフォルト: -
コンテキスト: stream

特定の変数のためにnginScript関数を設定します。

セッション オブジェクト プロパティ

各ストリーム nginScript ハンドラは1つの引数、ストリーム セッション オブジェクトを受け取ります。

セッションオブジェクトは以下のプロパティを持ちます:

remoteAddress
クライアントアドレス、読み込みのみ
eof
読み込みのみのbooleanプロパティ。もし現在のバッファが最後のバッファであればtrue
fromUpstream
読み込みのみのbooleanプロパティ。もし現在のバッファがupstreamサーバからクライアントへのものであればtrue
buffer
現在のバッファ。書き込み可
variables{}
nginx 変数オブジェクト、読み込みのみ
OK
OK リターンコード
DECLINED
DECLINED リターンコード
AGAIN
AGAIN リターンコード
ERROR
ERROR リターンコード
ABORT
ABORT リターンコード

セッションオブジェクトは以下のメソッドを持ちます:

log(string)
送信されたstringをエラーログに書き込みます

TOP
inserted by FC2 system