ngx_stream_js_module

ngx_stream_js_module 모듈은 njs에서 핸들러를 구현하는 데 사용합니다(JavaScript 언어의 서브셋).

예제 구성

이 예제는 0.4.0 이후로 작동합니다.

stream {
    js_import stream.js;

    js_set $bar stream.bar;
    js_set $req_line stream.req_line;

    server {
        listen 12345;

        js_preread stream.preread;
        return     $req_line;
    }

    server {
        listen 12346;

        js_access  stream.access;
        proxy_pass 127.0.0.1:8000;
        js_filter  stream.header_inject;
    }
}

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

stream.js 파일:

var line = '';

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

function preread(s) {
    s.on('upload', function (data, flags) {
        var n = data.indexOf('\n');
        if (n != -1) {
            line = data.substr(0, n);
            s.done();
        }
    });
}

function req_line(s) {
    return line;
}

// Read HTTP request line.
// Collect bytes in 'req' until
// request line is read.
// Injects HTTP header into a client's request

var my_header =  'Foo: foo';
function header_inject(s) {
    var req = '';
    s.on('upload', function(data, flags) {
        req += data;
        var n = req.search('\n');
        if (n != -1) {
            var rest = req.substr(n + 1);
            req = req.substr(0, n + 1);
            s.send(req + my_header + '\r\n' + rest, flags);
            s.off('upload');
        }
    });
}

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

    s.allow();
}

export default {bar, preread, req_line, header_inject, access};

Directives

Syntax:  js_access function | module.function;
Default: —
Context: stream, server

액세스 단계에서 호출할 njs 함수를 설정합니다. 0.4.0 이상에서 모듈 함수를 참조할 수 있습니다.

Syntax:  js_fetch_ciphers ciphers;
Default: js_fetch_ciphers HIGH:!aNULL:!MD5;
Context: stream, server
This directive appeared in version 0.7.0.

Fetch API를 사용하여 HTTPS 연결에 대해 활성화된 암호를 지정합니다. 이 암호는 OpenSSL 라이브러리에서 이해하는 형식으로 지정합니다.

전체 목록은 “openssl ciphers” 명령을 사용하여 확인할 수 있습니다.

Syntax:  js_fetch_protocols [TLSv1] [TLSv1.1] [TLSv1.2] [TLSv1.3];
Default: js_fetch_protocols TLSv1 TLSv1.1 TLSv1.2;
Context: stream, server
This directive appeared in version 0.7.0.

Fetch API를 사용하여 HTTPS 연결에 대한 지정된 프로토콜을 활성화합니다.

Syntax:  js_fetch_trusted_certificate file;
Default: —
Context: stream, server
This directive appeared in version 0.7.0.

Fetch API로 HTTPS 인증서를 인증하는 데 사용한 PEM 형식으로 신뢰할 수 있는 CA  인증서와 함께 file을 지정합니다.

Syntax:  js_fetch_verify_depth number;
Default: js_fetch_verify_depth 100;
Context: stream, server
This directive appeared in version 0.7.0.

Fetch API로 HTTPS 서버 인증서 체인에 인증 깊이를 설정합니다.

Syntax:  js_filter function | module.function;
Default: —
Context: stream, server

데이터 필터를 설정합니다. 0.4.0 이상에서 모듈 함수를 참조할 수 있습니다.

Syntax:  js_import module.js | export_name from module.js;
Default: —
Context: stream
This directive appeared in version 0.4.0.

njs에서 위치와 변수 핸들러를 구현하는 모듈을 가져옵니다. export_name을 네임스페이스로 사용하여 모듈 함수에 액세스합니다. export_name을 지정하지 않으면 모듈 이름을 네임스페이스로 사용합니다.

js_import stream.js;

여기에서는 내보내기에 액세스할 때 모듈 이름 stream을 네임스페이스로 사용합니다. 가져온 모듈에서 foo()를 내보낼 경우, stream.foo를 사용하여 이를 참조합니다.

여러 js_import 명령을 지정할 수 있습니다.

Syntax:  js_include file;
Default: —
Context: stream

서버와 변수 핸들러를 njs로 구현하는 파일을 지정합니다.

nginx.conf:
js_include stream.js;
js_set     $js_addr address;
server {
    listen 127.0.0.1:12345;
    return $js_addr;
}

stream.js:
function address(s) {
    return s.remoteAddress;
}

이 명령은 0.4.0 이후로 사용 중단되므로, 대신 js_import 명령을 사용해야 합니다.

Syntax:  js_path path;
Default: —
Context: stream
This directive appeared in version 0.3.0.

njs 모듈에 추가 경로를 설정합니다.

Syntax:  js_preread function | module.function;
Default: —
Context: stream, server

preread 단계에서 호출하는 njs 함수를 설정합니다. 0.4.0 이상에서 모듈 함수를 참조할 수 있습니다.

Syntax:  js_set $variable function | module.function;
Default: —
Context: stream

지정된 variable에 njs 함수를 설정합니다. 0.4.0 이상에서 모듈 함수를 참조할 수 있습니다.

특정 요청에 대해 처음으로 변수를 참조했을 때 이 함수를 호출합니다. 정확한 시점은 변수를 참조하는 단계에 따라 달라집니다. 이는 변수 평가와 관련이 없는 일부 로직을 실행하는 데 사용할 수 있습니다. 예를 들어 변수를 log_format 명령에서만 참조할 경우 로그 단계가 되어야 핸들러가 실행됩니다. 이 핸들러는 요청을 해제하기 직전에 약간의 정리를 하는 데 사용합니다.

js_set 핸들러는 그 결과를 즉시 반환하므로 동기식 콜백만 지원합니다. 그러므로 비동기식 콜백(예: ngx.fetch() 또는 setTimeout())은 지원하지 않습니다.

Syntax:  js_var $variable [value];
Default: —
Context: stream
This directive appeared in version 0.5.3.

쓰기 가능한 변수를 선언합니다. 이 값에는 텍스트, 변수 및 그 두 가지의 조합을 포함할 수 있습니다.

세션 객체 속성

각 stream njs 핸들러는 인수 1개(스트림 세션 객체)를 받습니다.