En el mundo de los servidores web de alto rendimiento, NGINX es una opción popular porque su arquitectura liviana y eficiente le permite manejar grandes cargas de tráfico. Con la introducción de la función de diccionario compartido como parte del módulo JavaScript de NGINX (njs) , las capacidades de rendimiento de NGINX alcanzan el siguiente nivel.
En esta publicación de blog, exploramos la funcionalidad y los beneficios del diccionario compartido njs, y mostramos cómo configurar NGINX Open Source sin la necesidad de reiniciar al rotar certificados SSL/TLS.
La nueva directiva js_shared_dict_zone
permite a los usuarios de NGINX Open Source habilitar zonas de memoria compartida para un intercambio de datos eficiente entre procesos de trabajo. Estas zonas de memoria compartida actúan como diccionarios clave-valor que almacenan configuraciones dinámicas a las que se puede acceder y modificar en tiempo real.
Los principales beneficios del diccionario compartido incluyen:
desalojador
elimina el par clave-valor más antiguo para dejar espacio para nuevas entradas.Uno de los casos de uso más impactantes del diccionario compartido es la rotación SSL/TLS. Al usar js_shared_dict_zone
, no es necesario reiniciar NGINX en caso de una actualización de clave o certificado SSL/TLS. Además, te ofrece una API tipo REST para administrar certificados en NGINX.
A continuación se muestra un ejemplo del archivo de configuración NGINX que configura el servidor HTTPS con las directivas js_set
y ssl_certificate
. Los controladores de JavaScript utilizan js_set
para leer el certificado o la clave SSL/TLS de un archivo.
Este fragmento de configuración utiliza el diccionario compartido para almacenar certificados y claves en la memoria compartida como caché. Si la clave no está presente, lee el certificado o la clave del disco y lo coloca en la memoria caché.
También puedes exponer una ubicación que borre el caché. Una vez que se actualizan los archivos en el disco (por ejemplo, se renuevan los certificados y las claves), el diccionario compartido impone la lectura desde el disco. Este ajuste permite rotar certificados/claves sin la necesidad de reiniciar el proceso 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;
}
...
}
Y aquí está la implementación de JavaScript para la rotación de certificados y claves 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 '';
}
}
/**
* 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
}
Al enviar la solicitud /clear
, se invalida el caché y NGINX carga el certificado o la clave SSL/TLS desde el disco en el próximo protocolo de enlace SSL/TLS. Además, puedes implementar un js_content
que tome un certificado o clave SSL/TLS de la solicitud mientras persiste y actualiza el caché también.
El código completo de este ejemplo se puede encontrar en el repositorio de GitHub de njs .
La función de diccionario compartido es una herramienta poderosa para la programabilidad de su aplicación que aporta ventajas significativas en optimización y escalabilidad. Al aprovechar las capacidades de js_shared_dict_zone
, puede desbloquear nuevas oportunidades de crecimiento y gestionar de manera eficiente las crecientes demandas de tráfico.
¿Está listo para potenciar su implementación de NGINX con js_shared_dict_zone
? Puede actualizar su implementación de NGINX con js_shared_dict_zone
para desbloquear nuevos casos de uso y obtener más información sobre esta función en nuestra documentación . Además, puede ver un ejemplo completo de una función de diccionario compartido en el proyecto njs-acme recientemente presentado, que permite que el entorno de ejecución del módulo njs funcione con proveedores ACME.
Si está interesado en comenzar a utilizar NGINX Open Source y tiene preguntas, únase a NGINX Community Slack : ¡preséntese y conozca esta comunidad de usuarios de NGINX!
"Esta publicación de blog puede hacer referencia a productos que ya no están disponibles o que ya no reciben soporte. Para obtener la información más actualizada sobre los productos y soluciones F5 NGINX disponibles, explore nuestra familia de productos NGINX . NGINX ahora es parte de F5. Todos los enlaces anteriores de NGINX.com redirigirán a contenido similar de NGINX en F5.com.