Autor original: Maxim Ivanitskiy da F5
Link original: a rotação do certificado SSL/TLS pode ser alcançada sem reiniciar a versão de código aberto do NGINX
Fonte de reimpressão: comunidade de código aberto NGINX
A única comunidade chinesa oficial do NGINX, toda em nginx.org.cn
No mundo dos servidores web de alto desempenho, o NGINX é uma escolha popular porque sua arquitetura leve e eficiente permite lidar com grandes quantidades de tráfego. Ao introduzir a função de dicionário compartilhado no módulo NGINX JavaScript (njs) , o desempenho do NGINX foi levado para o próximo nível.
Neste artigo, exploramos os recursos e benefícios dos dicionários compartilhados njs e mostramos como configurar o NGINX Open Source para alternar certificados SSL/TLS sem reiniciar.
Introdução aos dicionários compartilhados e suas vantagens
A nova diretiva permite que os usuários de código aberto NGINX habilitem áreas de memória compartilhada para trocar dados de forma eficiente entre processos de trabalho. Essas áreas de memória compartilhada atuam como dicionários de valores-chave, armazenando definições de configuração dinâmicas que podem ser acessadas e modificadas em tempo real. js_shared_dict_zone
As principais vantagens dos dicionários compartilhados incluem:
- Sobrecarga mínima e fácil de usar – Integrado diretamente no njs, é fácil de configurar e usar graças a uma API intuitiva e implementação simples. Também ajuda a simplificar o gerenciamento e o compartilhamento de dados entre processos de trabalho.
- Leve e eficiente – integra-se perfeitamente ao NGINX, aproveitando seu modelo de E/S sem bloqueio e orientado a eventos. Este método reduz o uso de memória e melhora os recursos de processamento simultâneo, permitindo que o NGINX lide com eficiência com um grande número de conexões simultâneas.
- Escalabilidade – Com a capacidade do NGINX de escalar horizontalmente em vários processos de trabalho, você pode compartilhar e sincronizar dados entre esses processos sem a necessidade de mecanismos complexos de comunicação entre processos. As configurações de tempo de vida (TTL) permitem gerenciar registros em entradas de dicionário compartilhado e remover entradas inativas da zona. O parâmetro evict exclui o par de valores-chave mais antigo para abrir espaço para novas entradas.
Rotação SSL usando dicionário compartilhado
Um dos casos de uso mais eficazes para dicionários compartilhados é a rotação SSL/TLS. Quando usados , os certificados ou chaves SSL/TLS podem ser atualizados sem reiniciar o NGINX. Além disso, fornece uma API semelhante a REST para gerenciar certificados no NGINX. js_shared_dict_zone
Abaixo está um exemplo de arquivo de configuração NGINX que usa as diretivas e para configurar um servidor HTTPS. Um manipulador JavaScript que lê um certificado ou chave SSL/TLS de um arquivo. js_set
ssl_certificate
js_set
Este trecho de configuração usa um dicionário compartilhado para armazenar certificados e chaves como cache na memória compartilhada. Se não houver chave, o certificado ou chave será lido do disco e colocado no cache.
Você também pode expor um local para limpar manualmente o cache. Depois que os arquivos no disco são atualizados (como atualizações de certificados e chaves), o dicionário compartilhado lê essas atualizações do disco. Este ajuste permite a rotação de certificado/chave sem reiniciar o processo NGINX.
http {
...
js_shared_dict_zone zone=kv:1m;
server {
…
# Sets an njs function for the variable. Returns a value of cert/key
js_set $dynamic_ssl_cert main.js_cert;
js_set $dynamic_ssl_key main.js_key;
# use variable's data
ssl_certificate data:$dynamic_ssl_cert;
ssl_certificate_key data:$dynamic_ssl_key;
# a location to clear cache
location = /clear {
js_content main.clear_cache;
# allow 127.0.0.1;
# deny all;
}
...
}
Aqui está uma implementação de JavaScript usando certificados e chaves SSL/TLS rotativos: 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 '';
}
}
/**
* Retrieves the key/cert value from Shared memory or fallback to disk
*/
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('Resolving ${path}');
const key = ['certs', path].join(':');
const cache = zone && ngx.shared && ngx.shared[zone];
if (cache) {
data = cache.get(key) || '';
if (data) {
r.log(`Read ${key} from cache`);
return data;
}
}
try {
data = fs.readFileSync(path, 'utf8');
r.log('Read from cache');
} catch (e) {
data = '';
r.log(`Error reading from file:${path}. Error=${e}`);
}
if (cache && data) {
try {
cache.set(key, data);
r.log('Persisted in cache');
} catch (e) {
const errMsg = `Error writing to shared dict zone: ${zone}. Error=${e}`;
r.log(errMsg);
}
}
return data
}
Você pode invalidar o cache enviando uma solicitação para que o NGINX carregue o certificado ou chave SSL/TLS do disco durante o próximo handshake SSL/TLS. Além disso, você pode usar para obter um certificado ou chave SSL/TLS da solicitação enquanto persiste e atualiza o cache. /clear
js_content
O código completo deste exemplo pode ser encontrado no repositório GitHub do njs .
comece imediatamente
O recurso de dicionário compartilhado é uma poderosa ferramenta de programação de aplicativos que oferece vantagens significativas em simplicidade e escalabilidade. Com recursos, você pode descobrir novas oportunidades de crescimento e lidar com eficiência com as crescentes demandas de tráfego. js_shared_dict_zone
Pronto para acelerar sua implantação do NGINX? Você pode atualizar sua implantação NGINX para desbloquear novos casos de uso. Para obter mais informações sobre esse recurso, consulte nossa documentação . Além disso, você pode ver um exemplo completo de funcionalidade de dicionário compartilhado no projeto njs-acme lançado recentemente , que permite que o tempo de execução do módulo njs funcione com provedores ACME. js_shared_dict_zone
js_shared_dict_zone
Se você estiver interessado na versão de código aberto do NGINX ou tiver alguma dúvida, fique à vontade para adicionar o Xiao N Assistant no WeChat (WeChat ID: nginxoss) para se juntar ao grupo WeChat oficial do NGINX para saber mais, fazer perguntas e obter feedback sobre o NGINX versão de código aberto.
A única comunidade chinesa oficial do NGINX, toda em nginx.org.cn
Mais informações técnicas relacionadas ao NGINX, perguntas e respostas interativas, série de cursos e recursos para eventos: Site oficial da comunidade de código aberto | Conta oficial do WeChat |
Um programador nascido na década de 1990 desenvolveu um software de portabilidade de vídeo e faturou mais de 7 milhões em menos de um ano. O final foi muito punitivo! Alunos do ensino médio criam sua própria linguagem de programação de código aberto como uma cerimônia de maioridade - comentários contundentes de internautas: Contando com RustDesk devido a fraude desenfreada, serviço doméstico Taobao (taobao.com) suspendeu serviços domésticos e reiniciou o trabalho de otimização de versão web Java 17 é a versão Java LTS mais comumente usada no mercado do Windows 10 Atingindo 70%, o Windows 11 continua a diminuir Open Source Daily | Google apoia Hongmeng para assumir o controle de telefones Android de código aberto apoiados pela ansiedade e ambição da Microsoft; Electric desliga a plataforma aberta Apple lança chip M4 Google exclui kernel universal do Android (ACK) Suporte para arquitetura RISC-V Yunfeng renunciou ao Alibaba e planeja produzir jogos independentes na plataforma Windows no futuro