No mundo dos servidores web de alto desempenho, o NGINX é uma escolha popular porque sua arquitetura leve e eficiente permite que ele lide com grandes cargas de tráfego. Com a introdução da função de dicionário compartilhado como parte do módulo JavaScript do NGINX (njs) , os recursos de desempenho do NGINX alcançam o próximo nível.
Nesta postagem do blog, exploramos a funcionalidade e os benefícios do dicionário compartilhado njs e mostramos como configurar o NGINX Open Source sem a necessidade de reiniciar ao rotacionar certificados SSL/TLS.
A nova diretiva js_shared_dict_zone
permite que usuários do NGINX Open Source habilitem zonas de memória compartilhada para troca eficiente de dados entre processos de trabalho. Essas zonas de memória compartilhada atuam como dicionários de chave-valor, armazenando definições de configuração dinâmicas que podem ser acessadas e modificadas em tempo real.
Os principais benefícios do dicionário compartilhado incluem:
evict
remove o par chave-valor mais antigo para abrir espaço para novas entradas.Um dos casos de uso mais impactantes para o dicionário compartilhado é a rotação SSL/TLS. Ao usar js_shared_dict_zone
, não há necessidade de reiniciar o NGINX no caso de uma atualização de certificado ou chave SSL/TLS. Além disso, ele fornece uma API semelhante a REST para gerenciar certificados no NGINX.
Abaixo está um exemplo do arquivo de configuração NGINX que configura o servidor HTTPS com as diretivas js_set
e ssl_certificate
. Os manipuladores JavaScript usam js_set
para ler o certificado SSL/TLS ou a chave de um arquivo.
Este snippet de configuração usa o dicionário compartilhado para armazenar certificados e chaves na memória compartilhada como um cache. Se a chave não estiver presente, ele lê o certificado ou a chave do disco e os coloca no cache.
Você também pode expor um local que limpa o cache. Depois que os arquivos no disco são atualizados (por exemplo, os certificados e chaves são renovados), o dicionário compartilhado impõe a leitura do disco. Este ajuste permite a rotação de certificados/chaves sem a necessidade de reiniciar o processo NGINX.
http { ... js_shared_dict_zone zona=kv:1m;
servidor { … # Define uma função njs para a variável. Retorna um valor de certificado/chave js_set $dynamic_ssl_cert main.js_cert; js_set $dynamic_ssl_key main.js_key;
# usar dados da variável ssl_certificate data:$dynamic_ssl_cert; ssl_certificate_key data:$dynamic_ssl_key;
# um local para limpar o cache location = /clear { js_content main.clear_cache; # permitir 127.0.0.1; # negar tudo; }
... }
E aqui está a implementação JavaScript para rotação de certificados e chaves SSL/TLS usando js_shared_dict_zone
:
function js_cert(r) { if (r.variables['ssl_server_name']) { return read_cert_or_key(r, '.cert.pem'); } else { return ''; } } function js_key(r) { if (r.variables['ssl_server_name']) { return read_cert_or_key(r, '.key.pem'); } else { return ''; } } /** * Recupera o valor da chave/certificado da memória compartilhada ou do fallback para o disco */ function read_cert_or_key(r, fileExtension) { let data = ''; let path = ''; const zone = 'kv'; let certName = r.variables.ssl_server_name; let prefix = '/etc/nginx/certs/'; path = prefix + certName + fileExtension; r.log('Resolvendo ${path}'); const chave = ['certs', caminho].join(':'); const cache = zona && ngx.shared && ngx.shared[zona];
if (cache) { data = cache.get(key) || ''; if (data) { r.log(`Ler ${key} do cache`); return data; } } try { data = fs.readFileSync(path, 'utf8'); r.log('Ler do cache'); } catch (e) { data = ''; r.log(`Erro ao ler do arquivo:${path}. Erro=${e}`); } if (cache && data) { try { cache.set(key, data); r.log('Persistido no cache'); } catch (e) { const errMsg = `Erro ao gravar na zona de dicionário compartilhada: ${zone}. Erro=${e}`; r.log(errMsg); } } retornar dados }
Ao enviar a solicitação /clear
, o cache é invalidado e o NGINX carrega o certificado ou a chave SSL/TLS do disco no próximo handshake SSL/TLS. Além disso, você pode implementar um js_content
que recebe um certificado SSL/TLS ou uma chave da solicitação enquanto persiste e atualiza o cache também.
O código completo deste exemplo pode ser encontrado no repositório njs GitHub .
A função de dicionário compartilhado é uma ferramenta poderosa para a programabilidade do seu aplicativo que traz vantagens significativas em termos de simplificação e escalabilidade. Ao aproveitar os recursos do js_shared_dict_zone
, você pode desbloquear novas oportunidades de crescimento e lidar com eficiência com as crescentes demandas de tráfego.
Pronto para turbinar sua implantação do NGINX com js_shared_dict_zone
? Você pode atualizar sua implantação do NGINX com js_shared_dict_zone
para desbloquear novos casos de uso e saber mais sobre esse recurso em nossa documentação . Além disso, você pode ver um exemplo completo de uma função de dicionário compartilhado no projeto njs-acme introduzido recentemente, que permite que o tempo de execução do módulo njs funcione com provedores ACME.
Se você estiver interessado em começar a usar o NGINX Open Source e tiver dúvidas, participe do NGINX Community Slack – apresente-se e conheça esta comunidade de usuários do NGINX!
"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."