Temos o prazer de anunciar que o NGINX Plus Release 18 (R18) já está disponível. O NGINX Plus é o único balanceador de carga, cache de conteúdo, servidor web e gateway de API tudo-em-um . Baseado no NGINX Open Source, o NGINX Plus inclui recursos aprimorados exclusivos e suporte premiado. O R18 simplifica os fluxos de trabalho de configuração para DevOps e melhora a segurança e a confiabilidade dos seus aplicativos em escala.
Mais de 87% dos sites agora usam SSL/TLS para criptografar comunicações pela Internet, contra 66% há apenas três anos. De ponta a ponta A criptografia agora é o padrão de implantação para sites e aplicativos, e a explosão de certificados SSL/TLS significa que algumas empresas estão gerenciando milhares de certificados em ambientes de produção. Isso exige uma abordagem mais flexível para implantar e configurar certificados.
A novidade nesta versão é o suporte para carregamento dinâmico de certificados . Com milhares de certificados, não é escalável definir cada um manualmente na configuração para carregamento do disco. Além de ser um processo tedioso, a configuração se torna incontrolavelmente grande e a inicialização do NGINX Plus inaceitavelmente lenta. Com o NGINX Plus R18 , os certificados SSL/TLS agora podem ser carregados sob demanda sem serem listados individualmente na configuração. Para simplificar ainda mais as implantações automatizadas, os certificados podem ser provisionados com a API NGINX Plus e nem precisam ficar no disco.
Novos recursos adicionais no NGINX Plus R18 incluem:
80‑90
. Isso permite que o NGINX Plus ofereça suporte a uma gama mais ampla de aplicativos, como FTP passivo, que exigem que intervalos de portas sejam reservados.Completando esta versão estão a configuração simplificada para ambientes em cluster e módulos dinâmicos novos e atualizados (incluindo Brotli). As atualizações do ecossistema NGINX Plus incluem organização de código modular com o módulo NGINX JavaScript e instalação direta do Helm do NGINX Ingress Controller oficial para Kubernetes.
APIs obsoletas – O NGINX Plus R13 (agosto de 2017) introduziu a novíssima API NGINX Plus para coleta de métricas e reconfiguração dinâmica de grupos upstream, substituindo as APIs Status e Upstream Conf que implementavam essas funções anteriormente. Conforme anunciado na época, as APIs obsoletas continuaram disponíveis e com suporte por um período significativo de tempo, que terminou com o NGINX Plus R16 . Se sua configuração incluir as diretivas status
e/ou upstream_conf
, você deverá substituí-las pela diretiva api
como parte da atualização para o R18.
Para obter orientação e assistência na migração para a nova API NGINX Plus , consulte o guia de transição em nosso blog ou entre em contato com nossa equipe de suporte.
Diretiva listen
atualizada – Anteriormente, quando a diretiva listen
especificava um nome de host que era resolvido para vários endereços IP, apenas o primeiro endereço IP era usado. Agora, um soquete de escuta é criado para cada endereço IP retornado.
Alterações no módulo JavaScript NGINX (njs) – O objeto req.response
obsoleto foi removido do módulo JavaScript NGINX . Funções declaradas usando a sintaxe function(req,res)
que também fazem referência a propriedades do objeto res
geram erros de tempo de execução, retornando código de status HTTP500
e uma entrada correspondente no log de erros:
AAAA / MM / DD hh : mm : ss [erro] 34#34: exceção js: TypeError: não é possível obter a propriedade "return" de undefined
Como o código JavaScript é interpretado em tempo de execução, o comando de validação sintática nginx
-t
não detecta a presença de objetos e propriedades inválidos. Você deve verificar cuidadosamente seu código JavaScript e remover esses objetos antes de atualizar para o NGINX Plus R18 .
Além disso, objetos JavaScript que representam o estado NGINX (por exemplo, r.headersIn
) agora retornam undefined
em vez da string vazia quando não há valor para uma determinada propriedade. Essa alteração significa que os objetos JavaScript específicos do NGINX agora se comportam da mesma forma que os objetos JavaScript integrados.
Sistemas operacionais mais antigos removidos ou a serem removidos:
Com versões anteriores do NGINX Plus, a abordagem típica para gerenciar certificados SSL/TLS para sites e aplicativos seguros era criar um bloco de servidor
separado para cada nome de host, especificando estaticamente o certificado e a chave privada associada como arquivos no disco. (Para facilitar a leitura, usaremos certificado para nos referir ao certificado e à chave pareados a partir de agora.) Os certificados foram então carregados quando o NGINX Plus foi inicializado. Com o NGINX Plus R18 , os certificados podem ser carregados dinamicamente e, opcionalmente, armazenados no armazenamento de chave-valor do NGINX Plus na memória em vez de no disco.
Há dois casos de uso principais para carregamento dinâmico de certificados:
Em ambos os casos, o NGINX Plus pode executar o carregamento dinâmico de certificados com base no nome do host fornecido pelo Server Name Indication (SNI) como parte do handshake TLS. Isso permite que o NGINX Plus hospede vários sites seguros em uma única configuração de servidor e selecione o certificado apropriado sob demanda para cada solicitação recebida.
Com o “carregamento lento”, os certificados SSL/TLS são carregados na memória somente quando as solicitações chegam e especificam o nome do host correspondente. Isso simplifica a configuração (eliminando a lista de certificados por nome de host) e reduz a utilização de recursos no host. Com um grande número (milhares) de certificados, pode levar vários segundos para ler todos eles do disco e carregá-los na memória. Além disso, uma grande quantidade de memória é usada quando a configuração do NGINX é recarregada, porque o novo conjunto de processos de trabalho carrega uma nova cópia dos certificados na memória, juntamente com os certificados carregados pelo conjunto anterior de trabalhos. Os certificados anteriores permanecem na memória até que a conexão final estabelecida na configuração antiga seja concluída e os trabalhadores anteriores sejam encerrados. Se a configuração for atualizada com frequência e as conexões do cliente forem duradouras, pode haver várias cópias dos certificados na memória, o que pode levar ao esgotamento da memória.
O carregamento lento de certificados do disco é ideal para implantações com grandes números de certificados e/ou quando as recargas de configuração são frequentes. Por exemplo, empresas de SaaS geralmente atribuem um subdomínio separado para cada cliente. A integração de novos clientes é difícil porque você precisa criar um novo servidor virtual para cada um e, em seguida, copiar a nova configuração e o certificado do cliente para cada instância do NGINX Plus. O carregamento lento elimina a necessidade de alterações de configuração – basta implantar os certificados em cada instância e pronto.
Para oferecer suporte ao carregamento lento, as diretivas ssl_certificate
e ssl_certificate_key
agora aceitam parâmetros variáveis. A variável deve estar disponível durante o processamento SNI, que ocorre antes da linha de solicitação e dos cabeçalhos serem lidos. A variável mais comumente usada é $ssl_server_name
, que contém o nome do host extraído pelo NGINX Plus durante o processamento SNI. O certificado e a chave são lidos do disco durante o handshake TLS no início de cada sessão do cliente e armazenados em cache na memória do sistema de arquivos, reduzindo ainda mais a utilização da memória.
Uma configuração de site seguro se torna tão simples quanto isto:
Essa mesma configuração de servidor
pode ser usada para um número ilimitado de sites seguros. Isso tem dois benefícios:
de servidor
separado para cada nome de host, tornando a configuração muito menor e, portanto, mais fácil de ler e gerenciar.Observe que o carregamento lento faz com que o handshake TLS demore de 20 a 30% mais, dependendo do ambiente, devido às chamadas do sistema de arquivos necessárias para recuperar o certificado do disco. No entanto, a latência adicional afeta apenas o handshake – uma vez que a sessão TLS é estabelecida, o processamento da solicitação leva o tempo normal.
Agora você pode armazenar dados de certificado SSL/TLS na memória, no armazenamento de chave-valor do NGINX Plus, bem como em arquivos no disco. Quando o parâmetro para a diretiva ssl_certificate
ou ssl_certificate_key
começa com o prefixo data:,
o NGINX Plus interpreta o parâmetro como dados PEM brutos (fornecidos na forma de uma variável que identifica a entrada no armazenamento de chave-valor onde os dados realmente residem).
Um benefício adicional do armazenamento no repositório de chave-valor em vez de no disco é que as imagens de implantação e os backups não incluem mais cópias da chave privada, que um invasor pode usar para descriptografar todo o tráfego enviado de e para o servidor. Empresas com pipelines de implantação altamente automatizados se beneficiam da flexibilidade de poder usar a API NGINX Plus para inserir certificados programaticamente no armazenamento de chave-valor. Além disso, as empresas que migram aplicativos para um ambiente de nuvem pública, onde não há um módulo de segurança de hardware (HSM) real para proteção de chave privada, se beneficiam da segurança adicional de não armazenar chaves privadas em disco.
Aqui está um exemplo de configuração para carregar certificados do armazenamento de chave-valor:
Uma maneira de carregar certificados e chaves privadas no armazenamento de chave-valor com a API NGINX Plus é executar o seguinte comando curl
(somente o início dos dados da chave é mostrado). Se estiver usando o comando curl
, lembre-se de fazer uma cópia dos dados PEM e substituir cada quebra de linha por \n
; caso contrário, as quebras de linha serão removidas da carga JSON.
$ curl -d '{"www.example.com":"-----INICIAR CHAVE PRIVADA RSA-----\n..."}' http://localhost:8080/api/4/http/keyvals/ssl_key
Usar o armazenamento de chave-valor para certificados é ideal para implantações em cluster do NGINX Plus, porque você carrega o certificado apenas uma vez para propagação automática no cluster. Para proteger os dados do certificado em si, use a diretiva zone_sync_ssl
para criptografar com TLS as conexões entre os membros do cluster. Usar o armazenamento de chave-valor também é ideal para certificados de curta duração ou para automatizar integrações com emissores de certificados como Let's Encrypt e Hashicorp Vault .
Assim como no carregamento lento do disco, o carregamento de certificados do armazenamento de chave-valor acontece durante cada handshake TLS, o que acarreta uma perda de desempenho. Para handshakes TLS mais rápidos, use as diretivas ssl_certificate
e ssl_certificate_key
com um parâmetro codificado para um arquivo no disco. Além disso, os certificados ECC são mais rápidos que os certificados RSA.
Observe que, embora o armazenamento de chave-valor torne mais difícil para um invasor obter arquivos de chave privada do que no armazenamento em disco, um invasor com acesso de shell ao host NGINX Plus ainda pode acessar chaves carregadas na memória. O armazenamento de chave-valor não protege chaves privadas na mesma extensão que um módulo de segurança de hardware (HSM); para que o NGINX Plus busque chaves de um HSM, use o parâmetro engine: engine-name : key-id
na diretiva ssl_certificate_key
.
O NGINX Plus oferece suporte à autenticação OpenID Connect e ao logon único para aplicativos de back-end por meio de nossa implementação de referência . Isso foi simplificado e aprimorado agora que o armazenamento de chave-valor pode ser modificado diretamente do módulo JavaScript usando variáveis ( veja abaixo ).
A implementação de referência do OpenID Connect agora emite aos clientes tokens de sessão opacos na forma de um cookie do navegador. Os tokens opacos não contêm informações de identificação pessoal sobre o usuário, portanto, nenhuma informação sensível é armazenada no cliente. O NGINX Plus armazena o token de ID real no armazenamento de chave-valor e o substitui pelo token opaco que o cliente apresenta. A validação do JWT é realizada para cada solicitação para que tokens expirados ou inválidos sejam rejeitados.
A implementação de referência do OpenID Connect agora também oferece suporte a tokens de atualização para que tokens de ID expirados sejam atualizados perfeitamente sem exigir interação do usuário. O NGINX Plus armazena o token de atualização enviado por um servidor de autorização no armazenamento de chave-valor e o associa ao token de sessão opaco. Quando o token de ID expira, o NGINX Plus envia o token de atualização de volta ao servidor de autorização. Se a sessão ainda for válida, o servidor de autorização emite um novo token de ID, que é atualizado perfeitamente no armazenamento de chave-valor. Os tokens de atualização possibilitam o uso de tokens de ID de curta duração, o que proporciona maior segurança sem incomodar os usuários.
A implementação de referência do OpenID Connect agora fornece um URL de logout. Quando usuários conectados visitam o URI /logout , seus IDs e tokens de atualização são excluídos do armazenamento de chave-valor, e eles devem se autenticar novamente ao fazer uma solicitação futura.
Um bloco de servidor
normalmente tem uma diretiva de escuta
especificando a única porta na qual o NGINX Plus escuta; se várias portas precisarem ser configuradas, há uma diretiva de escuta
adicional para cada uma delas. Com o NGINX Plus R18 , agora você também pode especificar intervalos de portas, por exemplo 80‑90
, quando for inconveniente especificar um grande número de diretivas de escuta
individuais.
Os intervalos de portas podem ser especificados para a diretiva de escuta
HTTP e a diretiva de escuta
TCP/UDP (Stream). A configuração a seguir permite que o NGINX Plus atue como um proxy para um servidor FTP no modo passivo, onde a porta de dados é escolhida entre um grande intervalo de portas TCP.
Esta configuração configura um servidor virtual para fazer proxy de conexões com o servidor FTP na mesma porta em que a conexão foi feita.
Quando o armazenamento de chave-valor está habilitado, o NGINX Plus fornece uma variável para os valores armazenados lá com base em uma chave de entrada (normalmente uma parte dos metadados da solicitação). Anteriormente, a única maneira de criar, modificar ou excluir valores no armazenamento de chave-valor era com a API NGINX Plus . Com o NGINX Plus R18 , você pode alterar o valor de uma chave diretamente na configuração, definindo a variável que contém o valor.
O exemplo a seguir usa o armazenamento de chave-valor para manter uma lista de endereços IP de clientes que acessaram o site recentemente, juntamente com o último URI solicitado.
A diretiva set
(linha 7) atribui um valor ( $last_uri
) para cada endereço IP do cliente ( $remote_addr
), criando uma nova entrada se estiver ausente ou modificando o valor para refletir o $uri
da solicitação atual. Assim, a lista atual de clientes recentes e seus URIs solicitados está disponível com uma chamada para a API NGINX Plus :
$ curl http://localhost:8080/api/4/http/keyvals/recents { "10.19.245.68": "/blog/nginx-plus-r18-released/", "172.16.80.227": "/products/nginx/", "10.219.110.168": "/blog/nginx-unit-1-8-0-now-available" }
Casos de uso mais poderosos podem ser alcançados com extensões de script, como o módulo NGINX JavaScript (njs) e o módulo Lua. Qualquer configuração que utilize njs tem acesso a todas as variáveis, incluindo aquelas apoiadas pelo armazenamento de chave-valor, por exemplo r.variables.last_uri
.
As verificações de integridade ativas do NGINX Plus testam rotineiramente os sistemas de back-end para que o tráfego não seja direcionado para sistemas que são conhecidos por não serem íntegros. O NGINX Plus R18 estende esse importante recurso com dois recursos adicionais.
Ao definir uma verificação de integridade para um aplicativo de backend, você pode usar um bloco de correspondência
para especificar o valor esperado para vários aspectos da resposta, incluindo o código de status HTTP e sequências de caracteres nos cabeçalhos e/ou corpo da resposta. Quando a resposta inclui todos os valores esperados, o backend é considerado íntegro.
Para verificações ainda mais complexas, o NGINX Plus R18 agora fornece a diretiva require
para testar o valor de qualquer variável – tanto variáveis NGINX padrão quanto variáveis declaradas por você. Isso lhe dá mais flexibilidade ao definir verificações de integridade porque as variáveis podem ser avaliadas com blocos de mapa
, expressões regulares e até mesmo extensões de script.
A diretiva require
dentro de um bloco match
especifica uma ou mais variáveis, todas as quais devem ter um valor diferente de zero para que o teste seja aprovado. A configuração de exemplo a seguir define um servidor upstream saudável como aquele que retorna cabeçalhos indicando que a resposta pode ser armazenada em cache – um cabeçalho Expires
com um valor diferente de zero ou um cabeçalho Cache-Control
.
Usar blocos de mapa
dessa maneira é uma maneira comum de incorporar lógica OR na configuração do NGINX Plus. A diretiva require
permite que você aproveite essa técnica em verificações de integridade, bem como execute verificações de integridade avançadas. Verificações de integridade avançadas também podem ser definidas usando o módulo JavaScript (njs) para analisar atributos adicionais das respostas de cada servidor upstream, como tempo de resposta .
Quando o NGINX Plus atua como um balanceador de carga de Camada 4 (L4) para aplicativos TCP/UDP, ele envia dados por proxy em ambas as direções na conexão estabelecida entre o cliente e o servidor de backend. Verificações de integridade ativas são uma parte importante dessa configuração, mas, por padrão, o status de integridade de um servidor de backend é considerado apenas quando um novo cliente tenta estabelecer uma conexão. Se um servidor de backend ficar offline, clientes estabelecidos poderão sofrer um tempo limite ao enviar dados para o servidor.
Com a diretiva proxy_session_drop
, nova no NGINX Plus R18 , você pode fechar a conexão imediatamente quando o próximo pacote for recebido ou enviado para o servidor offline. O cliente é forçado a se reconectar, momento em que o NGINX Plus envia suas solicitações por proxy para um servidor backend íntegro.
Quando essa diretiva é habilitada, duas outras condições também acionam o encerramento de conexões existentes: falha de uma verificação de integridade ativa e remoção do servidor de um grupo upstream por qualquer motivo. Isso inclui remoção por meio de pesquisa de DNS, onde um servidor de backend é definido por um nome de host com vários endereços IP, como aqueles fornecidos por um registro de serviço .
O NGINX Plus oferece suporte à sincronização do estado de tempo de execução em todo o cluster desde o NGINX Plus R15 . O módulo Zone Synchronization atualmente oferece suporte ao compartilhamento de dados de estado sobre sessões persistentes , limitação de taxa e armazenamento de chave-valor em uma implantação em cluster de instâncias do NGINX Plus.
Uma única configuração zone_sync
agora pode ser usada para todas as instâncias em um cluster. Anteriormente, você tinha que configurar o endereço IP ou o nome do host de cada membro explicitamente, o que significava que cada instância tinha uma configuração ligeiramente diferente. Agora você pode fazer com que o servidor zone_sync
escute em todas as interfaces locais especificando um valor curinga para o parâmetro endereço : porta na diretiva listen
. Isso é particularmente valioso ao implantar o NGINX Plus em um cluster dinâmico onde o endereço IP da instância não é conhecido até o momento da implantação.
Usar a mesma configuração em cada instância simplifica muito a implantação em ambientes dinâmicos (por exemplo, com grupos de dimensionamento automático ou clusters em contêineres).
Os seguintes módulos dinâmicos foram adicionados ou atualizados nesta versão:
O módulo JavaScript NGINX (njs) foi atualizado para a versão 0.3.0 . A melhoria mais notável é o suporte aos módulos de importação
e exportação
de JavaScript, que permitem organizar seu código JavaScript em vários arquivos específicos de função. Anteriormente, todo o código JavaScript tinha que residir em um único arquivo.
O exemplo a seguir mostra como os módulos JavaScript podem ser usados para organizar e simplificar o código necessário para um caso de uso relativamente simples. Aqui, empregamos JavaScript para realizar o mascaramento de dados para privacidade do usuário, de modo que uma versão com hash (mascarada) do endereço IP do cliente seja registrada em vez do endereço real. Um determinado endereço IP mascarado no log sempre representa o mesmo cliente, mas não pode ser convertido de volta para o endereço IP real.
[ Editor – O exemplo nesta seção é apenas um dos muitos casos de uso do módulo NGINX JavaScript. Para uma lista completa, consulte Casos de uso para o módulo JavaScript NGINX .
O código é atualizado para usar a diretiva js_import
, que substitui a diretiva js_include
no NGINX Plus R23 e posteriores. Para obter mais informações, consulte a documentação de referência do módulo NGINX JavaScript – a seção Exemplo de configuração mostra a sintaxe correta para a configuração do NGINX e os arquivos JavaScript.
No NGINX Plus R22 e posteriores, além dos módulos de importação
e exportação
JavaScript , você pode usar a diretiva njs js_import
para organizar seu código JavaScript em vários arquivos específicos de função. ]
Colocamos as funções necessárias para o mascaramento de endereço IP em um módulo JavaScript que exporta uma única função, maskIp()
. A função exportada depende de funções privadas que estão disponíveis apenas dentro do módulo e não podem ser chamadas por outro código JavaScript.
Este módulo agora pode ser importado para o arquivo JavaScript principal ( main.js ) e as funções exportadas podem ser referenciadas.
Como resultado, main.js é muito simples, contendo apenas as funções referenciadas pela configuração do NGINX. A instrução import
especifica um caminho relativo ou absoluto para o arquivo do módulo. Quando um caminho relativo é fornecido, você pode usar a nova diretiva js_path
para especificar caminhos adicionais a serem pesquisados.
Os novos recursos melhoram muito a legibilidade e a manutenção, especialmente quando há um grande número de diretivas njs em uso e/ou uma grande quantidade de código JavaScript. Agora, equipes separadas podem manter seu próprio código JavaScript sem precisar realizar uma mesclagem complexa no arquivo JavaScript principal.
Agora você pode instalar o NGINX Ingress Controller para Kubernetes diretamente do nosso novo repositório Helm, sem precisar baixar os arquivos de origem do gráfico Helm (embora isso ainda seja suportado). Para mais informações, consulte o repositório do GitHub .
As diretivas proxy_upload_rate
e proxy_download_rate
agora funcionam corretamente para datagramas UDP.
Anteriormente, o NGINX Plus podia travar quando a diretiva health_check
era incluída em um local que fazia referência à variável $proxy_protocol_tlv_0xEA
, por exemplo, em um ambiente AWS PrivateLink .
Anteriormente, se um servidor upstream respondesse lentamente por um longo tempo, ele poderia nunca mais ser selecionado porque seu valor para a métrica de tempo especificada era muito alto em comparação com outros servidores upstream. Agora, um servidor upstream anteriormente lento é eventualmente reintroduzido no processo de seleção do balanceador de carga, pois novas medições permitem que a média móvel seja reduzida.
Isso se aplica a algoritmos de balanceamento de carga que usam o tempo de resposta upstream como uma métrica de seleção, especificamente least_time
e random
com o parâmetro least_time
.
Se você estiver executando o NGINX Plus, recomendamos fortemente que atualize para o NGINX Plus R18 o mais rápido possível. Você também receberá uma série de correções e melhorias adicionais, e isso ajudará a NGINX, Inc. a ajudá-lo quando precisar abrir um tíquete de suporte.
Revise cuidadosamente os novos recursos e mudanças de comportamento descritos nesta postagem do blog antes de prosseguir com a atualização.
Se você ainda não experimentou o NGINX Plus, recomendamos que experimente – para segurança, balanceamento de carga e gateway de API, ou como um servidor web totalmente suportado com APIs aprimoradas de monitoramento e gerenciamento. Você pode começar hoje mesmo com uma avaliação gratuita de 30 dias . Veja você mesmo como o NGINX Plus pode ajudar você a entregar e dimensionar seus aplicativos.
"Esta postagem do blog pode fazer referência a produtos que não estão mais disponíveis e/ou não têm mais suporte. Para obter as informações mais atualizadas sobre os produtos e soluções F5 NGINX disponíveis, explore nossa família de produtos NGINX . O NGINX agora faz parte do F5. Todos os links anteriores do NGINX.com redirecionarão para conteúdo semelhante do NGINX no F5.com."