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개(스트림 세션 객체)를 받습니다.