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 zona=kv:1m;
servidor { … # Establece una función njs para la variable. Devuelve un valor de certificado/clave js_set $dynamic_ssl_cert main.js_cert; js_set $dynamic_ssl_key main.js_key;
# usa los datos de la variable ssl_certificate datos:$dynamic_ssl_cert; ssl_certificate_key datos:$dynamic_ssl_key;
# una ubicación para borrar el caché location = /clear { js_content main.clear_cache; # permitir 127.0.0.1; # denegar todo; }
... }
Y aquí está la implementación de JavaScript para la rotación de certificados y claves SSL/TLS usando js_shared_dict_zone
:
función js_cert(r) { si (r.variables['ssl_server_name']) { devolver read_cert_or_key(r, '.cert.pem'); } de lo contrario { devolver ''; } } función js_key(r) { si (r.variables['ssl_server_name']) { devolver read_cert_or_key(r, '.key.pem'); } de lo contrario { devolver ''; } } /** * Recupera el valor de la clave/certificado de la memoria compartida o se vuelve al disco */ función read_cert_or_key(r, fileExtension) { dejar datos = ''; dejar ruta = ''; const zona = 'kv'; dejar nombreCert = r.variables.ssl_server_name; dejar prefijo = '/etc/nginx/certs/'; ruta = prefijo + nombreCert + fileExtension; r.log('Resolviendo${path} '); clave constante = ['certs', ruta].join(':'); caché constante = zona && ngx.shared && ngx.shared[zona];
si (caché) { datos = cache.get(clave) || ''; si (datos) { r.log(`Leer${key} de caché`); devolver datos; } } try { datos = fs.readFileSync(ruta, 'utf8'); r.log('Leer desde caché'); } catch (e) { datos = ''; r.log(`Error al leer desde el archivo:${path} . Error=${e} `); } if (cache && data) { try { cache.set(key, data); r.log('Persistente en caché'); } catch (e) { const errMsg = `Error al escribir en la zona de diccionario compartido:${zone} . Error=${e} `; r.log(errMsg); } } devolver datos }
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.