Autor original: Maxim Ivanitskiy de F5
Enlace original: La rotación de certificados SSL/TLS se puede lograr sin reiniciar la versión de código abierto de NGINX
Fuente de reimpresión: comunidad de código abierto NGINX
La única comunidad china oficial de NGINX, toda en nginx.org.cn
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 cantidades de tráfico. Al introducir la función de diccionario compartido en el módulo JavaScript (njs) de NGINX , el rendimiento de NGINX se ha llevado al siguiente nivel.
En este artículo, exploramos las características y beneficios de los diccionarios compartidos njs y mostramos cómo configurar NGINX Open Source para rotar certificados SSL/TLS sin reiniciar.
Introducción a los diccionarios compartidos y sus ventajas.
La nueva directiva permite a los usuarios de código abierto de NGINX habilitar áreas de memoria compartida para intercambiar datos de manera eficiente entre procesos de trabajo. Estas áreas de memoria compartida actúan como diccionarios de valores clave y almacenan ajustes de configuración dinámicos a los que se puede acceder y modificar en tiempo real. js_shared_dict_zone
Las principales ventajas de los diccionarios compartidos incluyen:
- Gastos generales mínimos y fácil de usar: integrado directamente en njs, es fácil de configurar y usar gracias a una API intuitiva y una implementación sencilla. También le ayuda a simplificar la gestión de datos y el intercambio entre procesos de trabajo.
- Ligero y eficiente: se integra perfectamente con NGINX, aprovechando su modelo de E/S sin bloqueo y controlado por eventos. Este método reduce el uso de memoria y mejora las capacidades de procesamiento simultáneo, lo que permite a NGINX manejar de manera eficiente una gran cantidad de conexiones simultáneas.
- Escalabilidad: con la capacidad de NGINX de escalar horizontalmente en múltiples procesos de trabajo, puede compartir y sincronizar datos entre estos procesos sin la necesidad de complejos mecanismos de comunicación entre procesos. La configuración del tiempo de vida (TTL) le permite administrar registros en entradas de diccionario compartido y eliminar entradas inactivas de la zona. El parámetro de desalojo elimina el par clave-valor más antiguo para dejar espacio para nuevas entradas.
Rotación SSL usando diccionario compartido
Uno de los casos de uso más eficaces de los diccionarios compartidos es la rotación SSL/TLS. Cuando se utilizan , los certificados o claves SSL/TLS se pueden actualizar sin reiniciar NGINX. Además, proporciona una API similar a REST para gestionar certificados en NGINX. js_shared_dict_zone
A continuación se muestra un archivo de configuración NGINX de ejemplo que utiliza las directivas y para configurar un servidor HTTPS. Un controlador de JavaScript que lee un certificado o clave SSL/TLS de un archivo. js_set
ssl_certificate
js_set
Este fragmento de configuración utiliza un diccionario compartido para almacenar certificados y claves como caché en la memoria compartida. Si no hay ninguna clave, el certificado o la clave se leen del disco y se colocan en la memoria caché.
También puede exponer una ubicación para borrar manualmente el caché. Una vez que se actualizan los archivos en el disco (como actualizaciones de certificados y claves), el diccionario compartido lee estas actualizaciones desde el disco. Este ajuste permite la rotación de certificados/claves sin 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;
}
...
}
Aquí hay una implementación de JavaScript que utiliza certificados y claves 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
}
Puede invalidar el caché enviando una solicitud para que NGINX cargue el certificado o la clave SSL/TLS desde el disco durante el siguiente protocolo de enlace SSL/TLS. Además, puede utilizarlo para obtener un certificado SSL/TLS o una clave de la solicitud mientras persiste y actualiza el caché. /clear
js_content
El código completo de este ejemplo se puede encontrar en el repositorio de GitHub de njs .
empieza inmediatamente
La función de diccionario compartido es una potente herramienta de programación de aplicaciones que ofrece importantes ventajas en cuanto a simplicidad y escalabilidad. Con las funciones, puede descubrir nuevas oportunidades de crecimiento y manejar de manera eficiente las crecientes demandas de tráfico. js_shared_dict_zone
¿Listo para acelerar su implementación de NGINX? Puede actualizar su implementación de NGINX para desbloquear nuevos casos de uso. Para obtener más información sobre esta función, consulte nuestra documentación . Además, puede ver un ejemplo completo de la funcionalidad de diccionario compartido en el proyecto njs-acme lanzado recientemente , que permite que el tiempo de ejecución del módulo njs funcione con proveedores ACME. js_shared_dict_zone
js_shared_dict_zone
Si está interesado en la versión de código abierto de NGINX o tiene alguna pregunta, puede agregar Xiao N Assistant en WeChat (ID de WeChat: nginxoss) para unirse al grupo oficial de WeChat de NGINX para obtener más información, hacer preguntas y recibir comentarios sobre NGINX. versión de código abierto.
La única comunidad china oficial de NGINX, toda en nginx.org.cn
Más información técnica relacionada con NGINX, preguntas y respuestas interactivas, series de cursos y recursos para eventos: Sitio web oficial de la comunidad de código abierto | Cuenta oficial de WeChat
Un programador nacido en los años 90 desarrolló un software de portabilidad de vídeo y ganó más de 7 millones en menos de un año. ¡El final fue muy duro! Los estudiantes de secundaria crean su propio lenguaje de programación de código abierto como una ceremonia de mayoría de edad: comentarios agudos de los internautas: debido al fraude desenfrenado, confiando en RustDesk, el servicio doméstico Taobao (taobao.com) suspendió los servicios domésticos y reinició el trabajo de optimización de la versión web Java 17 es la versión Java LTS más utilizada. Cuota de mercado de Windows 10. Alcanzando el 70%, Windows 11 continúa disminuyendo. Open Source Daily | Google apoya a Hongmeng para hacerse cargo de los teléfonos Android de código abierto respaldados por Docker; Electric cierra la plataforma abierta Apple lanza el chip M4 Google elimina el kernel universal de Android (ACK) Soporte para la arquitectura RISC-V Yunfeng renunció a Alibaba y planea producir juegos independientes en la plataforma Windows en el futuro