NJS#

O módulo fornece integração da linguagem de programação JavaScript no modelo de processamento de eventos do Angie e permite estender a funcionalidade do servidor usando scripts JavaScript. Ele consiste em dois módulos:

  • HTTP JS — para processamento de tráfego HTTP;

  • Stream JS — para processamento de tráfego TCP/UDP.

Instalação#

Para instalar o módulo, use um dos seguintes pacotes:

  • Angie: angie-module-njs ou angie-module-njs-light;

  • Angie PRO: angie-pro-module-njs ou angie-pro-module-njs-light.

Recursos#

O módulo estende a funcionalidade do servidor usando scripts escritos em njs, um subconjunto de JavaScript, permitindo a implementação de lógica personalizada do lado do servidor e muito mais:

  • Controle de acesso complexo e verificações de segurança antes que a requisição chegue ao servidor com proxy.

  • Manipulação de cabeçalhos de resposta.

  • Escrita de manipuladores assíncronos flexíveis e filtros de conteúdo.

Também está disponível um utilitário de linha de comando independente que pode ser usado independentemente do servidor para desenvolver e depurar scripts njs.

Carregando o Módulo#

Carregando módulos no contexto main{}:

load_module modules/ngx_http_js_module.so;    # para HTTP
load_module modules/ngx_stream_js_module.so;  # para Stream

Uso#

A documentação detalhada está disponível nas seções para módulos individuais:

Segurança#

O módulo não executa código dinâmico, especialmente código recebido da rede. A única maneira de executar tal código usando njs é configurar a diretiva js_import na configuração do servidor. O código JavaScript é carregado uma vez na inicialização do servidor.

No modelo de ameaças do módulo, o código JavaScript é considerado uma fonte confiável assim como o arquivo de configuração e os certificados do site. Na prática, isso significa o seguinte:

  • divulgação de conteúdo de memória e outros problemas de segurança causados por modificação do código JavaScript não são considerados problemas de segurança, mas são tratados como bugs regulares;

  • medidas devem ser tomadas para proteger o código JavaScript usado pelo módulo;

  • se não houver diretivas js_import no arquivo de configuração, o servidor está protegido contra vulnerabilidades relacionadas ao JavaScript.

Utilitário de Linha de Comando#

O utilitário de linha de comando njs ajuda a desenvolver e depurar scripts njs e é instalado junto com os módulos. Diferentemente de quando o módulo é executado como parte do Angie, os objetos Angie (HTTP e Stream) não estão disponíveis ao usar o utilitário.

Exemplos de uso do utilitário:

$ echo "2**3" | njs -q
8

$ njs

>> globalThis
global {
 njs: njs {
  version: '0.3.9'
 },
 global: [Circular],
 process: process {
  argv: [
   '/usr/bin/njs'
  ],
...

Objetos Pré-carregados#

Para cada requisição recebida, o módulo cria uma máquina virtual separada. Isso fornece muitos benefícios, como consumo de memória previsível e isolamento de requisições. No entanto, como todas as requisições são isoladas, se um manipulador de requisição precisa acessar quaisquer dados, ele deve lê-los por conta própria. Isso é ineficiente, especialmente quando o volume de dados é grande.

Para resolver este problema, foi introduzido um mecanismo para objetos compartilhados pré-carregados. Tais objetos são criados como imutáveis e não possuem cadeias de protótipos: seus valores não podem ser alterados, propriedades não podem ser adicionadas ou removidas.

Aqui estão alguns exemplos de trabalho com objetos pré-carregados em njs:

  • Acessando propriedades por nome:

    preloaded_object.prop_name
    preloaded_object[prop_name]
    
  • Enumerando propriedades:

    for (i in preloaded_object_name) {
          // ...
    }
    
  • Aplicando métodos integrados não modificadores usando call():

    Array.prototype.filter.call(preloaded_object_name, ...)
    

Referência da API#

Para uma referência completa de todos os objetos, métodos e propriedades njs, consulte:

Informações Adicionais#