Auteur original : Maxim Ivanitskiy de F5
Lien d'origine : la rotation des certificats SSL/TLS peut être réalisée sans redémarrer la version open source de NGINX
Source de réimpression : communauté open source NGINX
La seule communauté chinoise officielle de NGINX, le tout sur nginx.org.cn
Dans le monde des serveurs Web hautes performances, NGINX est un choix populaire car son architecture légère et efficace lui permet de gérer de grandes quantités de trafic. En introduisant la fonction de dictionnaire partagé dans le module JavaScript NGINX (njs) , les performances de NGINX ont été portées au niveau supérieur.
Dans cet article, nous explorons les fonctionnalités et les avantages des dictionnaires partagés njs et montrons comment configurer NGINX Open Source pour faire pivoter les certificats SSL/TLS sans redémarrer.
Introduction aux dictionnaires partagés et leurs avantages
La nouvelle directive permet aux utilisateurs open source de NGINX d'activer les zones de mémoire partagée pour échanger efficacement des données entre les processus de travail. Ces zones de mémoire partagée agissent comme des dictionnaires clé-valeur, stockant des paramètres de configuration dynamiques accessibles et modifiables en temps réel. js_shared_dict_zone
Les principaux avantages des dictionnaires partagés sont les suivants :
- Frais généraux minimes et facile à utiliser – Construit directement dans njs, il est facile à configurer et à utiliser grâce à une API intuitive et une mise en œuvre simple. Il vous aide également à simplifier la gestion et le partage des données entre les processus de travail.
- Léger et efficace – s'intègre parfaitement à NGINX, en tirant parti de son modèle d'E/S non bloquant et piloté par les événements. Cette méthode réduit l'utilisation de la mémoire et améliore les capacités de traitement simultané, permettant à NGINX de gérer efficacement un grand nombre de connexions simultanées.
- Évolutivité – Grâce à la capacité de NGINX à évoluer horizontalement sur plusieurs processus de travail, vous pouvez partager et synchroniser des données entre ces processus sans avoir besoin de mécanismes de communication complexes entre processus. Les paramètres de durée de vie (TTL) vous permettent de gérer les enregistrements dans les entrées de dictionnaire partagées et de supprimer les entrées inactives de la zone. Le paramètre evict supprime la paire clé-valeur la plus ancienne pour laisser de la place à de nouvelles entrées.
Rotation SSL à l'aide d'un dictionnaire partagé
L'un des cas d'utilisation les plus efficaces des dictionnaires partagés est la rotation SSL/TLS. Lorsqu'ils sont utilisés , les certificats ou clés SSL/TLS peuvent être mis à jour sans redémarrer NGINX. De plus, il fournit une API de type REST pour gérer les certificats sur NGINX. js_shared_dict_zone
Vous trouverez ci-dessous un exemple de fichier de configuration NGINX qui utilise les directives et pour configurer un serveur HTTPS. Un gestionnaire JavaScript qui lit un certificat ou une clé SSL/TLS à partir d'un fichier. js_set
ssl_certificate
js_set
Cet extrait de configuration utilise un dictionnaire partagé pour stocker les certificats et les clés sous forme de cache dans la mémoire partagée. S'il n'y a pas de clé, le certificat ou la clé est lu sur le disque et placé dans le cache.
Vous pouvez également exposer un emplacement pour vider manuellement le cache. Une fois les fichiers sur le disque mis à jour (comme les mises à jour de certificats et de clés), le dictionnaire partagé lit ces mises à jour à partir du disque. Cet ajustement permet la rotation des certificats/clés sans redémarrer le processus 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;
}
...
}
Voici une implémentation JavaScript utilisant des certificats et des clés SSL/TLS en rotation : 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
}
Vous pouvez invalider le cache en envoyant une requête afin que NGINX charge le certificat ou la clé SSL/TLS à partir du disque lors de la prochaine négociation SSL/TLS. De plus, vous pouvez utiliser pour obtenir un certificat ou une clé SSL/TLS à partir de la demande tout en conservant et en mettant à jour le cache. /clear
js_content
Le code complet de cet exemple peut être trouvé dans le référentiel njs GitHub .
commencer immédiatement
La fonctionnalité de dictionnaire partagé est un puissant outil de programmation d'application qui offre des avantages significatifs en termes de simplicité et d'évolutivité. Grâce aux fonctionnalités, vous pouvez découvrir de nouvelles opportunités de croissance et gérer efficacement les demandes croissantes de trafic. js_shared_dict_zone
Prêt à accélérer votre déploiement NGINX ? Vous pouvez mettre à niveau votre déploiement NGINX pour débloquer de nouveaux cas d'utilisation. Pour plus d'informations sur cette fonctionnalité, veuillez consulter notre documentation . De plus, vous pouvez voir un exemple complet de fonctionnalité de dictionnaire partagé dans le projet njs-acme récemment lancé , qui permet au module d'exécution njs de fonctionner avec les fournisseurs ACME. js_shared_dict_zone
js_shared_dict_zone
Si vous êtes intéressé par la version open source de NGINX ou si vous avez des questions, n'hésitez pas à ajouter Xiao N Assistant sur WeChat (WeChat ID : nginxoss) pour rejoindre le groupe WeChat officiel de NGINX pour en savoir plus, poser des questions et obtenir des commentaires sur NGINX. version open source.
La seule communauté chinoise officielle de NGINX, le tout sur nginx.org.cn
Plus d'informations techniques liées à NGINX, des questions et réponses interactives, une série de cours et des ressources événementielles : Site officiel de la communauté Open Source |
Un programmeur né dans les années 1990 a développé un logiciel de portage vidéo et en a réalisé plus de 7 millions en moins d'un an. La fin a été très éprouvante ! Des lycéens créent leur propre langage de programmation open source en guise de cérémonie de passage à l'âge adulte - commentaires acerbes des internautes : s'appuyant sur RustDesk en raison d'une fraude généralisée, le service domestique Taobao (taobao.com) a suspendu ses services domestiques et repris le travail d'optimisation de la version Web Java 17 est la version Java LTS la plus utilisée Part de marché de Windows 10 Atteignant 70 %, Windows 11 continue de décliner Open Source Daily | Google soutient Hongmeng pour prendre le relais des téléphones Android open source pris en charge par Docker ; Electric ferme la plate-forme ouverte Apple lance la puce M4 Google supprime le noyau universel Android (ACK) Prise en charge de l'architecture RISC-V Yunfeng a démissionné d'Alibaba et prévoit de produire des jeux indépendants sur la plate-forme Windows à l'avenir