Haz que tu configuración de NGINX sea aún más modular y reutilizable con njs 0.7.7

NGINX | 20 de octubre de 2022


Desde que presentamos el módulo JavaScript de NGINX (njs) en 2015 (con su nombre original, nginScript) y lo pusimos a disposición general en 2017<.htmla>, hemos seguido incorporando nuevas funciones y perfeccionando nuestra implementación a lo largo de decenas de actualizaciones de versión. Normalmente esperamos al lanzamiento de una versión de NGINX Plus para hablar de las funciones de una nueva versión de NGINX JavaScript, pero la versión 0.7.7 nos entusiasma tanto que esta vez no podemos esperar.

Las importantes mejoras de njs 0.7.7 permiten que la configuración de NGINX sea aún más modular, organizada y reutilizable:

Para obtener más información sobre njs y consultar la lista de casos de uso para los que proporcionamos código de ejemplo, lea Cómo aprovechar la potencia y la comodidad de JavaScript para cada solicitud con el módulo JavaScript de NGINX en nuestro blog.

Para consultar una lista completa de todas las funciones nuevas y correcciones de errores de njs 0.7.7, consulte la documentación de Cambios.

Declaración de código y variables de JavaScript en contextos locales

En versiones anteriores de njs, había que importar el código JavaScript y declarar las variables pertinentes —mediante las directivas js_import, js_path, js_set y js_var— en el contexto de nivel superior http o stream, lo que equivale a declarar variables globales al principio de un archivo principal. Sin embargo, las directivas que realmente invocan las funciones y variables de JavaScript aparecen en un contexto secundario; por ejemplo, la directiva js_content en un bloque location{} de HTTP y la directiva js_access en un bloque server{} de Stream. Esto plantea dos problemas:

  1. Para quien revise la configuración, las declaraciones de los contextos http y stream son básicamente ruido, ya que no se indica dónde se utilizan realmente el código y las variables asociados.
  2. En el contexto secundario, no resulta evidente dónde se han importado y declarado el código y las variables. Aunque recomendamos incluir los bloques http{} y stream{} únicamente en el archivo de configuración principal (nginx.conf) y utilizar la directiva include para cargar archivos de configuración más pequeños y específicos para cada función 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 resultar especialmente problemático en entornos donde varias personas trabajan en la configuración de NGINX y no siempre siguen las convenciones establecidas.

En njs 0.7.7 y versiones posteriores, puede importar código y declarar variables en los contextos en los que se utilizan:

Tener toda la configuración de njs para un caso de uso específico en un único archivo también hace que el código sea más modular y portable.

Por ejemplo, en versiones anteriores de njs, al añadir un nuevo script había que modificar tanto nginx.conf (añadiendo js_import y, posiblemente, js_path, js_set y js_var) como el archivo en el que se invoca la función de JavaScript (en este caso, jscode_local.conf).

Cargando ejemplo de código…

Cargando ejemplo de código…

En njs 0.7.7 y versiones posteriores, toda la configuración relacionada con la función util se encuentra en un único archivo, jscode_integrated.conf:

Cargando ejemplo de código…

Modificar el comportamiento según el contexto de ejecución

Varias funciones nuevas de njs 0.7.7 permiten modificar el comportamiento del código JavaScript en función del contexto (fase de procesamiento) en el que se ejecuta.

La propiedad HTTP «r.internal»

La propiedad HTTP r.internal es un indicador booleano establecido en «true» para las solicitudes internas (que son gestionadas 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 genérico que puede invocarse tanto en contextos internos como no internos.

Las siguientes se clasifican como solicitudes internas:

Método mejorado de flujo s.send() Stream Method

En versiones anteriores de njs, el método s.send() de Stream depende del contexto, ya que la dirección en la que envía los datos viene determinada por la ubicación (ascendente o descendente) de la función de retorno en la que se llama al método. Esto funciona correctamente con las funciones de retorno síncronas, para las que se diseñó originalmente s.send(), pero falla con funciones asíncronas como ngx.fetch().

En njs 0.7.7 y versiones posteriores, la dirección se almacena en un indicador interno independiente que s.send() puede utilizar.

Operaciones de archivo más eficientes con el nuevo objeto fs.FileHandle() Object

El módulo del sistema de archivos (fs) implementa operaciones con archivos. El nuevo objeto FileHandle del módulo fs encapsula un descriptor numérico de archivo. 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 posteriormente para:

  • Ejecutar funciones como read() y write() en el archivo
  • Abrir un archivo y realizar operaciones de lectura y escritura en una ubicación específica sin leer el archivo completo

Se han implementado las siguientes propiedades de FileHandle (para obtener información sobre los argumentos obligatorios y opcionales de cada propiedad, consulte la documentación):

  • filehandle.fd
  • filehandle.read()
  • filehandle.stat()
  • filehandle.write()
  • filehandle.write()
  • filehandle.close()

Estos métodos se han actualizado para admitir FileHandle (consulta la documentación enlazada para obtener información sobre los argumentos de cada método):

Usa njs para mejorar tu configuración

Con njs 0.7.7, hemos facilitado que sus equipos trabajen con código njs y lo compartan. Los contextos ampliados para las directivas de njs hacen que mejorar la configuración de NGINX con código JavaScript personalizado sea aún más sencillo. Puede dar el primer paso hacia una puerta de enlace de API, un proxy inverso o un servidor web que sea mucho más que otro middleware o componente perimetral. Puede integrarlo en su aplicación mediante JavaScript, TypeScript o módulos de Node de terceros sin añadir otro componente a su pila. ¡Solo necesita NGINX!

¿Tienes alguna pregunta? Únete al Slack de la comunidad de NGINX y visita el canal #njs-code-review para obtener más información, plantear tus dudas y recibir comentarios sobre tu código njs.


Compartir
Etiquetas: F5 NGINX, News, Tech, 2022

Artículos relacionados del blog

Únete a F5 NGINX en AppWorld 2024
NGINX | 04/01/2024

Únete a F5 NGINX en AppWorld 2024

Descubre las numerosas razones para asistir al evento insignia de F5, que incluirá un emocionante anuncio sobre la cartera de productos NGINX.

Rotación de certificados SSL/TLS sin reinicios en NGINX Open Source
NGINX | 26/09/2023

Rotación de certificados SSL/TLS sin reinicios en NGINX Open Source

La función de diccionario compartido permite configurar NGINX sin necesidad de reiniciarlo al renovar los certificados SSL/TLS.

Exposición de APIs en Kubernetes
NGINX | 10/03/2022

Exposición de APIs en Kubernetes

La unidad 2 de Microservices March 2022 se centra en cómo exponer tus API en Kubernetes. Aquí tienes enlaces a los recursos que necesitas: la retransmisión en directo del 14 de marzo, artículos de blog y otros recursos de preparación, y el laboratorio práctico «Protege las API de Kubernetes mediante la limitación de solicitudes».

NGINX Sprint 2.0: visión clara, código renovado y nuevos compromisos con el código abierto
NGINX | 23/08/2021

NGINX Sprint 2.0: visión clara, código renovado y nuevos compromisos con el código abierto

Hoy, en NGINX Sprint 2.0, anunciamos cómo respaldaremos nuestra visión del futuro de las aplicaciones modernas con una mayor presencia en la comunidad de código abierto, incluida la participación en el proyecto comunitario Kubernetes, nuevos proyectos de software de código abierto y la arquitectura de referencia para aplicaciones modernas.

Presentamos NGINX Plus R22
NGINX | 09/06/2020

Presentamos NGINX Plus R22

NGINX Plus R22 incorpora nuevas funcionalidades, como la compatibilidad con OCSP para verificar la revocación de certificados en TLS mutuo, el uso de varios proveedores de identidad OIDC en una configuración, el seguimiento en tiempo real de la limitación de solicitudes y conexiones en el panel de NGINX Plus y mejoras en NGINX JavaScript.

Presentamos NGINX Plus R17
NGINX | 11/12/2018

Presentamos NGINX Plus R17

NGINX Plus R17 incorpora compatibilidad con la limitación de velocidad en dos fases y con TLS 1.3, la versión más reciente del protocolo Transport Layer Security. La configuración de OpenID Connect es más sencilla y NGINX ModSecurity WAF es el doble de rápido que antes. También se ha actualizado el módulo JavaScript de NGINX.