Variables Nginx con njs: simple, indoloro y a través de JavaScript

njs es un intérprete de JavaScript en un servidor web ligero con el que puede crear nuevas variables nginx y solicitar controladores de etapas. ¿Para qué sirve njs? Lo que no puede? ¿Y por qué lo hicieron en absoluto? Estas y otras preguntas serán respondidas por Dmitry Volyntsev ( xeioex ), el desarrollador de nginx y el desarrollador principal del intérprete njs.



- Dmitry, ¿por qué necesitabas secuencias de comandos en configuraciones nginx?


- La primera razón es la directiva if . Las personas que la vieron por primera vez piensan que pueden usarse imperativamente. En realidad, esto no es así: la configuración de nginx es declarativa. En el siguiente ejemplo, puede pensar que la respuesta tendrá dos encabezados: X-First y X-Second. Pero solo el segundo encabezado obtendrá la respuesta, porque nginx está muy organizado: si escribimos dos directivas if, se seleccionará la última.

 location /only-one-if { set $true 1; if ($true) { add_header X-First 1; } if ($true) { add_header X-Second 2; } 

La segunda razón es a lo que nginx ha llegado ahora. Anteriormente, se usaba para almacenar en caché estadísticas y solicitudes, así como para equilibrar la carga, un conjunto de proxy clásico. La proliferación de microservicios ha erosionado el alcance de nginx. Si las configuraciones de configuración anteriores terminaron con un par de ubicaciones en varios backends en algunos idiomas, entonces con la arquitectura de microservicio tenemos más partes móviles. El backend se ha convertido en un grupo de componentes pequeños. La lógica de autorización, por ejemplo, debe duplicarse en cada microservicio o eliminarse, por ejemplo, en la interfaz. Para implementar la autorización avanzada, no siempre hay suficientes mecanismos de solución incorporados en nginx.

En tercer lugar, en nginx muchas directivas aceptan expresiones calculadas dinámicamente, por ejemplo:

 proxy cache bypass $cookie_nocache $arg_nocache; 

Puede concatenar variables entre sí o con cadenas literales. Pero esto no es suficiente, y me gustaría tener herramientas más poderosas, por ejemplo, para calcular el hash, para trabajar con datos numéricos, para convertir en mayúsculas y minúsculas.

Para expandir todos los cuellos de botella en nginx, debe desarrollar su propia sintaxis o usar algo listo. Llegamos a la conclusión de que es mejor tomar un lenguaje de programación de secuencias de comandos existente. Por lo tanto, los desarrolladores no necesitan aprender un nuevo idioma, lo que también ahorrará tiempo y reducirá el umbral de entrada. Elegimos JavaScript.

- ¿Y por qué JavaScript?


- Elegimos JavaScript por varias razones:

  • Un dialecto moderno, que es bueno para los desarrolladores que cambian de otros idiomas.
  • Estilo C-like. Esto es importante porque la configuración de nginx usa llaves, y en el futuro queremos agregar la capacidad de escribir código JS dentro de la configuración. Los frenos nos ayudarán con esto. En Lua, por ejemplo, el papel de las llaves se realiza al principio y al final; esto es inconveniente.
  • El modelo de JavaScript encaja bien con la arquitectura nginx.

"¿Entonces Lua también fue considerada?" ¿Es por principio y fin?


- Ya hay un proyecto de terceros listo para usar, OpenResty. Si no entra en detalles, entonces esto es esencialmente nginx + Lua, pero tiene una arquitectura que va en contra de nginx. Queríamos evitar las intersecciones con este ecosistema. Además, hay varias razones más:

  • Lua tiene una sintaxis similar a pascal.
  • Las matrices se indexan desde 1.
  • Lua sigue siendo un lenguaje de programación de nicho.

- ¿Cómo se compara njs con la competencia?


- Clasificamos njs en comparación con los motores conocidos: V8 y SpiderMonkey. No son efectivos para las tareas dentro de nginx, ya que los agudizan los navegadores y son muy pesados, y nginx requiere alta velocidad. Además, ambos motores están evolucionando rápidamente, su API es inestable. Finalmente, njs se puede integrar de manera más eficiente en nginx:


El número de contextos creados por segundo.

- ¿Qué estándares soporta njs?


- Por el momento, casi todos los elementos básicos de la especificación ECMAScript 5.1 se implementan con algunos elementos intercalados de las especificaciones 6 y 7. Es decir, objetos estándar como Object, Array, String, Number, Date, RegExp, JSON. Los cierres, las funciones anónimas y el trabajo con excepciones son totalmente compatibles.

No establecemos como nuestro objetivo principal el pleno cumplimiento de la especificación del idioma. Por lo tanto, por el momento no hay soporte para eval () , y hasta ahora no planeamos agregarlo. Pero planeamos agregar soporte para el const y dejar palabras clave, así como funciones de flecha.


Lo que puede y lo que no puede hacer en este momento

Es importante mencionar una cosa más: la falta de recolección de basura. La mayoría de los lenguajes modernos monitorean independientemente la vida útil de los objetos. Si el objeto ya no se usa, se elimina automáticamente. No puede prescindir de este mecanismo, pero generalmente tiene que sacrificar algo por ello: el trabajo del programa se ralentiza o incluso se detiene. En njs, la memoria no se libera hasta que se libera el objeto de solicitud.

Este enfoque tiene sus pros y sus contras. La principal desventaja es que no le permite trabajar eficazmente con consultas largas. Por lo tanto, en el futuro planeamos agregar la recolección de basura como una opción para habilitarla según sea necesario.

- ¿Qué es njs no?


- Antes de responder esta pregunta, me gustaría repetir una vez más que la tarea principal de njs es expandir las capacidades para una configuración flexible de nginx y resolver tareas en el lado del proxy.

Ahora la pregunta en sí. ¿Qué se debe considerar de antemano?
  • njs no es un reemplazo para Node.js.
  • El paquete nginx + njs no es un servidor de aplicaciones.
  • njs no implementa completamente los estándares ECMAScript, ya que no hay soporte para eval ().



Si este tema es extremadamente relevante para usted y desea más detalles, le recomendamos que vea la grabación de video del informe de Dmitry Volintsev en HighLoad ++ Siberia 2018, donde lo reveló por todos lados.


También invitamos a todos los profesionales a enviar sus informes a la conferencia de noviembre de HighLoad ++ 2018 , que se celebrará en Skolkovo los días 8 y 9 de noviembre. Si tiene una experiencia única e interesante y está listo para compartirla, regístrese antes del 1 de septiembre y complete el formulario .

Si tiene miedo de hablar en público, tenemos una escuela de oradores llamada, donde ayudamos a bombear estas habilidades de forma gratuita.

Source: https://habr.com/ru/post/es420465/


All Articles