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 charges de trafic. Avec l'introduction de la fonction de dictionnaire partagé dans le cadre du module JavaScript NGINX (njs) , les capacités de performance de NGINX atteignent le niveau supérieur.
Dans cet article de blog, nous explorons les fonctionnalités et les avantages du dictionnaire partagé njs et montrons comment configurer NGINX Open Source sans avoir besoin de redémarrer lors de la rotation des certificats SSL/TLS.
La nouvelle directive js_shared_dict_zone
permet aux utilisateurs de NGINX Open Source d'activer les zones de mémoire partagée pour un échange de données efficace 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 qui peuvent être consultés et modifiés en temps réel.
Les principaux avantages du dictionnaire partagé sont les suivants :
evict
supprime la paire clé-valeur la plus ancienne pour faire de la place pour de nouvelles entrées.L’un des cas d’utilisation les plus impactants pour le dictionnaire partagé est la rotation SSL/TLS. Lorsque vous utilisez js_shared_dict_zone
, il n'est pas nécessaire de redémarrer NGINX en cas de mise à jour d'un certificat ou d'une clé SSL/TLS. De plus, il vous offre une API de type REST pour gérer les certificats sur NGINX.
Vous trouverez ci-dessous un exemple du fichier de configuration NGINX qui configure le serveur HTTPS avec les directives js_set
et ssl_certificate
. Les gestionnaires JavaScript utilisent js_set
pour lire le certificat ou la clé SSL/TLS à partir d'un fichier.
Cet extrait de configuration utilise le dictionnaire partagé pour stocker les certificats et les clés dans la mémoire partagée en tant que cache. Si la clé n'est pas présente, il lit le certificat ou la clé à partir du disque et le place dans le cache.
Vous pouvez également exposer un emplacement qui efface le cache. Une fois les fichiers sur le disque mis à jour (par exemple, les certificats et les clés sont renouvelés), le dictionnaire partagé impose la lecture à partir du disque. Ce réglage permet de faire tourner les certificats/clés sans avoir besoin de redémarrer le processus NGINX.
http { ... js_shared_dict_zone zone=kv:1m;
serveur { … # Définit une fonction njs pour la variable. Renvoie une valeur de cert/key js_set $dynamic_ssl_cert main.js_cert; js_set $dynamic_ssl_key main.js_key;
# utiliser les données de la variable ssl_certificate data:$dynamic_ssl_cert; ssl_certificate_key data:$dynamic_ssl_key;
# un emplacement pour vider le cache location = /clear { js_content main.clear_cache; # autoriser 127.0.0.1; # refuser tout; }
... }
Et voici l'implémentation JavaScript pour la rotation des certificats et clés SSL/TLS en utilisant 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 ''; } } /** * Récupère la valeur de clé/cert de la mémoire partagée ou se replie sur le disque */ 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('Résolution de ${path}'); const key = ['certs', path].join(':'); const cache = zone && ngx.shared && ngx.shared[zone];
if (cache) { data = cache.get(key) || ''; if (data) { r.log(`Lire ${key} depuis le cache`); renvoyer les données; } } essayer { data = fs.readFileSync(path, 'utf8'); r.log('Lire depuis le cache'); } catch (e) { data = ''; r.log(`Erreur de lecture depuis le fichier : ${path}. Erreur=${e}`); } if (cache && data) { try { cache.set(key, data); r.log('Persisted in cache'); } catch (e) { const errMsg = `Erreur d'écriture dans la zone de dictionnaire partagé : ${zone}. Erreur=${e}`; r.log(errMsg); } } renvoyer des données }
En envoyant la requête /clear
, le cache est invalidé et NGINX charge le certificat ou la clé SSL/TLS à partir du disque lors de la prochaine négociation SSL/TLS. De plus, vous pouvez implémenter un js_content
qui prend un certificat ou une clé SSL/TLS de la requête tout en conservant et en mettant à jour le cache également.
Le code complet de cet exemple peut être trouvé dans le dépôt GitHub njs .
La fonction de dictionnaire partagé est un outil puissant pour la programmabilité de votre application qui apporte des avantages significatifs en termes de rationalisation et d'évolutivité. En exploitant les capacités de js_shared_dict_zone
, vous pouvez débloquer de nouvelles opportunités de croissance et gérer efficacement les demandes de trafic croissantes.
Prêt à dynamiser votre déploiement NGINX avec js_shared_dict_zone
? Vous pouvez mettre à niveau votre déploiement NGINX avec js_shared_dict_zone
pour débloquer de nouveaux cas d'utilisation et en savoir plus sur cette fonctionnalité dans notre documentation . De plus, vous pouvez voir un exemple complet d'une fonction de dictionnaire partagé dans le projet njs-acme récemment introduit, qui permet au runtime du module njs de fonctionner avec les fournisseurs ACME.
Si vous souhaitez vous lancer avec NGINX Open Source et avez des questions, rejoignez NGINX Community Slack – présentez-vous et apprenez à connaître cette communauté d'utilisateurs NGINX !
« Cet article de blog peut faire référence à des produits qui ne sont plus disponibles et/ou qui ne sont plus pris en charge. Pour obtenir les informations les plus récentes sur les produits et solutions F5 NGINX disponibles, explorez notre famille de produits NGINX . NGINX fait désormais partie de F5. Tous les liens NGINX.com précédents redirigeront vers un contenu NGINX similaire sur F5.com."