JS#

El módulo se utiliza para implementar manejadores en njs — un subconjunto del lenguaje JavaScript.

En nuestros repositorios, el módulo se construye dinámicamente dinámicamente y está disponible como un paquete separado llamado angie-module-njs o angie-pro-module-njs.

Nota

También está disponible una versión ligera del paquete, llamada ...-njs-light; sin embargo, no se puede usar junto con la versión regular.

Ejemplo de Configuración#

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;
        }
    }
}

El archivo 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};

Directivas#

js_access#

Sintaxis

js_access función | módulo.función;

Predeterminado

Contexto

stream, server

Establece una función njs que será llamada en la fase de acceso. Las funciones de módulos pueden ser referenciadas.

La función se llama una vez en el momento en que la sesión de stream alcanza la fase de acceso por primera vez. La función se llama con los siguientes argumentos:

En esta fase, es posible realizar la inicialización o registrar un callback con el método s.on() para cada fragmento de datos entrante hasta que se llame a uno de los siguientes métodos: s.done(), s.decline(), s.allow(). Tan pronto como se llama a uno de estos métodos, el procesamiento de la sesión de stream cambia a la siguiente fase y se eliminan todos los callbacks actuales de s.on().

js_fetch_buffer_size#

Sintaxis

js_fetch_buffer_size tamaño;

Predeterminado

js_fetch_buffer_size 16k;

Contexto

stream, server

Establece el tamaño del búfer utilizado para leer y escribir con Fetch API.

js_fetch_ciphers#

Sintaxis

js_fetch_ciphers cifrados;

Predeterminado

js_fetch_ciphers HIGH:!aNULL:!MD5;

Contexto

stream, server

Especifica los cifrados habilitados para conexiones HTTPS con Fetch API. Los cifrados se especifican en el formato entendido por la biblioteca OpenSSL.

La lista de cifrados depende de la versión de OpenSSL instalada. La lista completa se puede ver usando el comando openssl ciphers.

js_fetch_max_response_buffer_size#

Sintaxis

js_fetch_max_response_buffer_size tamaño;

Predeterminado

js_fetch_max_response_buffer_size 1m;

Contexto

stream, server

Establece el tamaño máximo de la respuesta recibida con Fetch API.

js_fetch_protocols#

Sintaxis

js_fetch_protocols [TLSv1] [TLSv1.1] [TLSv1.2] [TLSv1.3];

Predeterminado

js_fetch_protocols TLSv1 TLSv1.1 TLSv1.2;

Contexto

stream, server

Habilita los protocolos especificados para conexiones HTTPS con Fetch API.

js_fetch_timeout#

Sintaxis

js_fetch_timeout tiempo;

Predeterminado

js_fetch_timeout 60s;

Contexto

stream, server

Define un tiempo de espera para lectura y escritura para Fetch API. El tiempo de espera se establece solo entre dos operaciones de lectura/escritura sucesivas, no para toda la respuesta. Si no se transmiten datos dentro de este tiempo, la conexión se cierra.

js_fetch_trusted_certificate#

Sintaxis

js_fetch_trusted_certificate archivo;

Predeterminado

Contexto

stream, server

Especifica un archivo con certificados CA de confianza en formato PEM utilizados para verificar el certificado HTTPS con Fetch API.

js_fetch_verify#

Sintaxis

js_fetch_verify on | off;

Predeterminado

js_fetch_verify on;

Contexto

stream, server

Habilita o deshabilita la verificación del certificado del servidor HTTPS con Fetch API.

js_fetch_verify_depth#

Sintaxis

js_fetch_verify_depth número;

Predeterminado

js_fetch_verify_depth 100;

Contexto

stream, server

Establece la profundidad de verificación en la cadena de certificados del servidor HTTPS con Fetch API.

js_filter#

Sintaxis

js_filter función | módulo.función;

Predeterminado

Contexto

stream, server

Establece un filtro de datos. Se pueden referenciar funciones de módulos.

La función de filtro se llama una vez en el momento en que la sesión de stream alcanza la fase de contenido. La función de filtro se llama con los siguientes argumentos:

s

el objeto de la sesión de stream <https://nginx.org/en/docs/njs/reference.html#stream>

En esta fase, es posible realizar la inicialización o registrar un callback con el método s.on() <https://nginx.org/en/docs/njs/reference.html#s_on> para cada fragmento de datos entrante. El método s.off() <https://nginx.org/en/docs/njs/reference.html#s_off> puede usarse para desregistrar un callback y detener el filtrado.

Nota

Como el controlador js_filter devuelve su resultado de inmediato, solo admite operaciones síncronas. Por lo tanto, no se admiten operaciones asíncronas como ngx.fetch() o setTimeout().

js_import#

Syntax

js_import module.js | export_name from module.js;

Predeterminado

Context

stream, server

Importa un módulo que implementa manejadores de ubicación y de variables en njs. El export_name se utiliza como un espacio de nombres para acceder a las funciones del módulo. Si no se especifica export_name, el nombre del módulo se utilizará como espacio de nombres.

js_import stream.js;

Aquí, el nombre del módulo stream se utiliza como espacio de nombres al acceder a las exportaciones. Si el módulo importado exporta foo(), entonces se utilizará stream.foo para acceder a él.

Se pueden especificar varias directivas js_import.

js_path#

Syntax

js_path path;

Predeterminado

Context

stream, server

Establece una ruta adicional para los módulos njs.

js_preload_object#

Syntax

js_preload_object name.json | name from file.json;

Predeterminado

Context

stream, server

Precarga un objeto inmutable en tiempo de configuración. El name se utiliza como nombre de la variable global a través de la cual el objeto está disponible en el código njs. Si no se especifica name, se utilizará el nombre del archivo.

js_preload_object map.json;

Aquí, map se usa como nombre al acceder al objeto precargado.

Se pueden especificar varias directivas js_preload_object.

js_preread#

Syntax

js_preread function | module.function;

Predeterminado

Context

stream, server

Establece una función njs que se llamará en la fase preread. Se pueden referenciar funciones de módulos.

La función se llama una vez en el momento en que la sesión de stream alcanza la fase preread por primera vez. La función se llama con los siguientes argumentos:

En esta fase, es posible realizar la inicialización o registrar un callback con el método s.on() para cada fragmento de datos entrante hasta que se llame a uno de los siguientes métodos: s.done(), s.decline(), s.allow(). Cuando se llama a uno de estos métodos, la sesión de stream cambia a la siguiente fase y se eliminan todos los callbacks actuales de s.on().

Nota

Como el manejador js_preread devuelve su resultado inmediatamente, solo admite operaciones síncronas. Por lo tanto, las operaciones asíncronas como ngx.fetch() o setTimeout() no son compatibles. Sin embargo, las operaciones asíncronas son compatibles en los callbacks de s.on() en la fase preread.

js_set#

Syntax

js_set $variable function | module.function;

Predeterminado

Context

stream, server

Establece una función njs para la variable especificada. Se pueden referenciar funciones de módulos.

La función se llama cuando la variable se referencia por primera vez para una solicitud dada. El momento exacto depende de la fase en la que se haga la referencia. Esto se puede utilizar para realizar alguna lógica no relacionada con la evaluación de variables. Por ejemplo, si la variable se referencia solo en la directiva de registro s_log_format, su manejador no se ejecutará hasta la fase de registro. Este manejador se puede utilizar para realizar alguna limpieza justo antes de que se libere la solicitud.

Nota

Como el manejador js_set devuelve su resultado de inmediato, solo admite operaciones síncronas. Por lo tanto, las operaciones asíncronas como ngx.fetch() o setTimeout() no son compatibles.

js_shared_dict_zone#

Syntax

js_shared_dict_zone zone=name:size [timeout=time] [type=string | number] [evict];

Predeterminado

Context

stream

Establece el nombre y tamaño de la zona de memoria compartida que mantiene el diccionario clave-valor compartido entre los procesos de trabajo.

type

parámetro opcional, permite redefinir el tipo de valor a number, por defecto el diccionario compartido utiliza string como clave y como valor

timeout

parámetro opcional, establece el tiempo después del cual todas las entradas del diccionario compartido se eliminan de la zona

evict

parámetro opcional, elimina la pareja clave-valor más antigua cuando el almacenamiento de la zona está agotado

Ejemplos:

example.conf:
    # Crea un diccionario de 1Mb con valores de cadena,
    # elimina pares clave-valor después de 60 segundos de inactividad:
    js_shared_dict_zone zone=foo:1M timeout=60s;

    # Crea un diccionario de 512Kb con valores de cadena,
    # elimina forzosamente los pares clave-valor más antiguos cuando la zona está agotada:
    js_shared_dict_zone zone=bar:512K timeout=30s evict;

    # Crea un diccionario permanente de 32Kb con valores numéricos:
    js_shared_dict_zone zone=num:32k type=number;
example.js:
    function get(r) {
        r.return(200, ngx.shared.foo.get(r.args.key));
    }

    function set(r) {
        r.return(200, ngx.shared.foo.set(r.args.key, r.args.value));
    }

    function delete(r) {
        r.return(200, ngx.shared.bar.delete(r.args.key));
    }

    function increment(r) {
        r.return(200, ngx.shared.num.incr(r.args.key, 2));
    }

js_var#

Syntax

js_var $variable [value];

Predeterminado

Context

stream, server

Declara una variable escribible. El valor puede contener texto, variables y su combinación.

Propiedades del Objeto de Sesión#

Cada manejador njs de stream recibe un argumento, un objeto sesión de stream.