NJS#
El módulo proporciona integración del lenguaje de programación JavaScript en el modelo de procesamiento de eventos de Angie y permite ampliar la funcionalidad del servidor utilizando scripts JavaScript. Consta de dos módulos:
Instalación#
Para instalar el módulo, utilice uno de los siguientes paquetes:
Angie:
angie-module-njsoangie-module-njs-light;Angie PRO:
angie-pro-module-njsoangie-pro-module-njs-light.
Características#
El módulo amplía la funcionalidad del servidor utilizando scripts escritos en njs, un subconjunto de JavaScript, permitiendo la implementación de lógica personalizada del lado del servidor y mucho más:
Control de acceso complejo y comprobaciones de seguridad antes de que la solicitud llegue al servidor proxy.
Manipulación de encabezados de respuesta.
Escritura de manejadores asíncronos flexibles y filtros de contenido.
También está disponible una utilidad de línea de comandos independiente que puede utilizarse independientemente del servidor para desarrollar y depurar scripts njs.
Carga del Módulo#
Carga de módulos en el contexto main{}:
load_module modules/ngx_http_js_module.so; # para HTTP
load_module modules/ngx_stream_js_module.so; # para Stream
Uso#
La documentación detallada está disponible en las secciones de módulos individuales:
Seguridad#
El módulo no ejecuta código dinámico, especialmente código recibido desde la red.
La única forma de ejecutar dicho código utilizando njs es configurar la
directiva js_import en la configuración del servidor. El código JavaScript se carga una vez
al iniciar el servidor.
En el modelo de amenazas del módulo, el código JavaScript se considera una fuente confiable al igual que el archivo de configuración y los certificados del sitio. En la práctica, esto significa lo siguiente:
la divulgación de contenidos de memoria y otros problemas de seguridad causados por la modificación del código JavaScript no se consideran problemas de seguridad, sino que se tratan como errores regulares;
deben tomarse medidas para proteger el código JavaScript utilizado por el módulo;
si no hay directivas
js_importen el archivo de configuración, el servidor está protegido contra vulnerabilidades relacionadas con JavaScript.
Utilidad de Línea de Comandos#
La utilidad de línea de comandos njs ayuda a desarrollar y depurar scripts njs
y se instala junto con los módulos. A diferencia de cuando el módulo se ejecuta
como parte de Angie, los objetos de Angie (HTTP y
Stream) no están disponibles al utilizar la utilidad.
Ejemplos de uso de la utilidad:
$ echo "2**3" | njs -q
8
$ njs
>> globalThis
global {
njs: njs {
version: '0.3.9'
},
global: [Circular],
process: process {
argv: [
'/usr/bin/njs'
],
...
Objetos Precargados#
Para cada solicitud entrante, el módulo crea una máquina virtual separada. Esto proporciona muchos beneficios, como consumo de memoria predecible y aislamiento de solicitudes. Sin embargo, dado que todas las solicitudes están aisladas, si un manejador de solicitudes necesita acceder a cualquier dato, debe leerlo él mismo. Esto es ineficiente, especialmente cuando el volumen de datos es grande.
Para resolver este problema, se introdujo un mecanismo de objetos compartidos precargados. Tales objetos se crean como inmutables y no tienen cadenas de prototipos: sus valores no pueden cambiarse, las propiedades no pueden agregarse ni eliminarse.
Aquí hay algunos ejemplos de trabajo con objetos precargados en njs:
Acceso a propiedades por nombre:
preloaded_object.prop_name preloaded_object[prop_name]
Enumeración de propiedades:
for (i in preloaded_object_name) { // ... }
Aplicación de métodos integrados no modificadores utilizando
call():Array.prototype.filter.call(preloaded_object_name, ...)
Referencia de API#
Para una referencia completa de todos los objetos, métodos y propiedades de njs, consulte:
Información Adicional#
Sitio web oficial: https://nginx.org/en/docs/njs/
Ejemplos de uso: nginx/njs-examples