Desde la introducción del módulo JavaScript de NGINX (njs) en2015 (bajo su nombre original, nginScript) y poniéndolo a disposición del público en 2017<.htmla>, hemos continuado agregando nuevas funciones y refinando nuestra implementación a lo largo de docenas de actualizaciones de versiones . Normalmente esperamos un lanzamiento de NGINX Plus para discutir las características de una nueva versión de NGINX JavaScript, ¡pero estamos tan entusiasmados con la versión 0.7.7 que esta vez no podemos esperar!
Las mejoras significativas en njs 0.7.7 ayudan a que su configuración de NGINX sea aún más modular, organizada y reutilizable:
fs.FileHandle
hace que las operaciones con archivos sean más eficientes .Para obtener más información sobre njs y revisar la lista de casos de uso para los que proporcionamos código de muestra, lea Cómo aprovechar el poder y la conveniencia de JavaScript para cada solicitud con el módulo JavaScript de NGINX en nuestro blog.
Para obtener una lista completa de todas las nuevas características y correcciones de errores en njs 0.7.7, consulte la documentación de Cambios .
En versiones anteriores de njs, debes importar tu código JavaScript y declarar las variables relevantes (con las directivas js_import
, js_path
, js_set
y js_var
) en el contexto http
o de flujo
de nivel superior, el equivalente a declarar variables globales en la parte superior de un archivo principal. Pero las directivas que realmente invocan las funciones y variables de JavaScript aparecen en un contexto secundario; por ejemplo, con la directiva js_content
en un bloque HTTP location{}
y la directiva js_access
en un bloque Stream server{}
. Esto crea dos problemas:
http
y stream
son esencialmente ruido, porque no hay ninguna indicación de dónde se utilizan realmente el código y las variables asociadas.http{}
y stream{}
solo en el archivo de configuración principal ( nginx.conf ) y usar la directiva include
para leer archivos de configuración más pequeños y específicos de funciones desde los directorios /etc/nginx/conf.d y /etc/nginx/stream.d , la configuración de NGINX es flexible: puede incluir bloques http{}
y stream{}
en varios archivos. Esto puede ser especialmente problemático en entornos donde varias personas trabajan en su configuración NGINX y es posible que no siempre sigan las convenciones establecidas.En njs 0.7.7 y versiones posteriores, puedes importar código y declarar variables en los contextos donde se utilizan:
HTTP –
Estas directivas pueden aparecer en los contextos de servidor
y ubicación
, así como en el contexto http
:
Estas directivas pueden aparecer tanto en el contexto if
como en los contextos location
y limit_except
:
Transmisión : estas directivas pueden aparecer tanto en el contexto del servidor
como en el contexto de la transmisión
:
Tener toda la configuración de njs para un caso de uso específico en un solo archivo también hace que su código sea más modular y portátil.
A modo de ejemplo, en versiones anteriores de njs, cuando agregabas un nuevo script, tenías que cambiar tanto nginx.conf (agregando js_import
y posiblemente js_path
, js_set
y js_var
) como el archivo donde se invoca la función JavaScript (aquí, jscode_local.conf ).
En njs 0.7.7 y versiones posteriores, toda la configuración relacionada con la función util está en un solo archivo, jscode_integrated.conf :
Varias características nuevas en njs 0.7.7 le permiten modificar el comportamiento de su código JavaScript dependiendo del contexto (fase de procesamiento) donde se esté ejecutando.
r.internal
La propiedad HTTP r.internal
es un indicador booleano establecido como “verdadero” para solicitudes internas (que son manejadas por bloques location{}
que incluyen la directiva internal
). Puede utilizar el indicador r.internal
para bifurcar la lógica cuando un script utiliza un controlador de eventos general que puede llamarse en contextos internos y no internos.
Se clasifican como solicitudes internas las siguientes:
error_page
, index
, random_index
y try_files
X-Accel-Redirect
desde un servidor ascendenteauth_request
y mirror
, las directivas en el módulo ngx_http_addition_module o el comando virtual
de inclusión
del lado del servidor (SSI) (compatible con el módulo ngx_http_ssi_module )de reescritura
s.send()
mejoradoEn versiones anteriores de njs, el método s.send()
de Stream depende del contexto, porque la dirección en la que envía datos está determinada por la ubicación (ascendente o descendente) de la devolución de llamada donde se llama al método. Esto funciona bien para devoluciones de llamadas sincrónicas (para las cuales se diseñó originalmente s.send())
, pero falla con funciones asincrónicas como ngx.fetch()
.
En njs 0.7.7 y versiones posteriores, la dirección se almacena en un indicador interno separado, que luego s.send()
puede usar.
fs.FileHandle()
El módulo del sistema de archivos ( fs
) implementa operaciones en archivos. El nuevo objeto FileHandle
en el módulo fs
es un contenedor de objetos para un descriptor de archivo numérico. Las instancias del objeto FileHandle
se crean mediante el método fs.promises.open()
.
Utilice el objeto FileHandle
para obtener un descriptor de archivo, que puede utilizarse además para:
read()
y write()
en el archivoSe han implementado las siguientes propiedades de FileHandle
(para obtener información sobre los argumentos obligatorios y opcionales para cada propiedad, consulte la documentación ):
manejadordearchivo.fd
manejadordearchivo.read()
manejador de archivo.stat()
manejadordearchivo.write()
manejadordearchivo.write()
manejador de archivo.close()
Estos métodos se han actualizado para admitir FileHandle
(consulte la documentación vinculada para obtener información sobre los argumentos de cada método):
fs.openSync()
fs.promesas.abrir()
fs.fstatSync()
fs.readSync()
fs.writeSync()
(búfer)fs.writeSync()
(cadena)Con njs 0.7.7, hemos facilitado que sus equipos trabajen y compartan código njs. Los contextos extendidos para las directivas njs hacen que sea aún más sencillo mejorar la configuración de NGINX con código JavaScript personalizado. Puede dar el primer paso hacia una puerta de enlace API, un proxy inverso o un servidor web, que sea más que simplemente otro middleware o componente de borde. Puede hacerlo parte de su aplicação a través de JavaScript, TypeScript o módulos de nodo de terceros sin agregar otro componente a su pila. ¡Todo lo que necesitas es NGINX!
¿Tiene preguntas?Únase al Slack de la comunidad NGINX y consulte el canal #njs-code-review para obtener más información, hacer preguntas y recibir comentarios sobre su código njs.
"Esta publicación de blog puede hacer referencia a productos que ya no están disponibles o que ya no reciben soporte. Para obtener la información más actualizada sobre los productos y soluciones F5 NGINX disponibles, explore nuestra familia de productos NGINX . NGINX ahora es parte de F5. Todos los enlaces anteriores de NGINX.com redirigirán a contenido similar de NGINX en F5.com.