无需重启 NGINX 开源版即可实现 SSL/TLS 证书轮换

 原文作者:Maxim Ivanitskiy of F5

原文链接:无需重启 NGINX 开源版即可实现 SSL/TLS 证书轮换

转载来源:NGINX 开源社区


NGINX 唯一中文官方社区 ,尽在 nginx.org.cn

在高性能 Web 服务器领域,NGINX 是一个广受欢迎的选择,因为其轻便高效的架构支持它处理大量流量。通过在 NGINX JavaScript 模块(njs)中引入共享字典(shared dictionary)功能,NGINX 的性能更上一层楼。

在本文中,我们将探讨 njs 共享字典的功能和优势,并展示如何设置 NGINX 开源版,以无需重启即可轮换 SSL/TLS 证书。

共享字典简介及其优势

新 js_shared_dict_zone 指令允许 NGINX 开源版用户启用共享内存区,在 worker 进程之间高效交换数据。 这些共享内存区充当键值字典,存储着可实时访问和修改的动态配置设置。

共享字典的主要优势包括:

  • 开销极少且易于使用 – 直接内置在 njs 中,得益于直观的 API 和简单的实现,可轻松配置和使用。它还能够帮助您简化 worker 进程之间的数据管理和共享。

  • 轻量高效 – 与 NGINX 无缝集成,利用其事件驱动型非阻塞 I/O 模型。这种方法减少了内存占用,并提高了并发处理能力,支持 NGINX 高效处理大量并发连接。

  • 可扩展性 – 借助 NGINX 跨多个 worker 进程的横向扩展能力,您可以在这些进程之间共享和同步数据,而无需复杂的进程间通信机制。通过 time-to-live (TTL) 设置,您可以管理共享字典条目中的记录,将不活动的条目从区域中删除。evict 参数会删除最早的键值对,为新条目腾出空间。

使用共享字典进行 SSL 轮换

共享字典最有效的用例之一是 SSL/TLS 轮换。使用 js_shared_dict_zone 时,无需重启 NGINX 就可更新 SSL/TLS 证书或密钥。此外,它还提供了一个类似 REST 的 API,可用于管理 NGINX 上的证书。

下面是一个 NGINX 配置文件示例,该配置文件使用 js_set 和 ssl_certificate 指令来设置 HTTPS 服务器。 JavaScript 处理程序使用 js_set 从文件中读取 SSL/TLS 证书或密钥。

此配置片段使用共享字典将证书和密钥作为缓存存储在共享内存中。如果没有密钥,则会从磁盘中读取证书或密钥,并将其放入缓存。

您还可以暴露一个位置,以便手动清除缓存。一旦磁盘上的文件更新(如证书和密钥更新),共享字典就会从磁盘中读取这些更新。该调整允许在不重启 NGINX 进程的情况下轮换证书/密钥。

http {...js_shared_dict_zone zone=kv:1m;server {…# Sets an njs function for the variable. Returns a value of cert/keyjs_set $dynamic_ssl_cert main.js_cert;js_set $dynamic_ssl_key main.js_key;# use variable's datassl_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;}...}

下面是使用 js_shared_dict_zone 轮换 SSL/TLS 证书和密钥的 JavaScript 实现:

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
}

可通过发送 /clear 请求让缓存失效,这样 NGINX 在下一次 SSL/TLS 握手时就会从磁盘加载 SSL/TLS 证书或密钥。此外,您还可以使用 js_content 从请求中获取 SSL/TLS 证书或密钥,同时持久化和更新缓存。

本例的完整代码可在 njs GitHub 代码库中找到。

立即开始

共享字典功能是一款强大的应用可编程性工具,在简化和可扩展性方面具有显著优势。利用 js_shared_dict_zone 的功能,您可以发掘新的增长机遇,并高效处理不断增长的流量需求。

准备好使用 js_shared_dict_zone 来加速 NGINX 部署了吗?您可以使用 js_shared_dict_zone 升级 NGINX 部署,解锁新的用例。有关此功能的更多信息,请参阅我们的文档。此外,您还可以在最近推出的 njs-acme 项目(支持 njs 模块运行时与 ACME 提供程序协同工作)中看到共享字典功能的完整示例。

如果您对 NGINX 开源版感兴趣或有任何问题,欢迎微信添加小 N 助手(微信号:nginxoss)加入 NGINX 官方微信群,以了解更多信息、提出问题并获得有关 NGINX 开源版的反馈。


NGINX 唯一中文官方社区 ,尽在 nginx.org.cn

更多 NGINX 相关的技术干货、互动问答、系列课程、活动资源: 开源社区官网 | 微信公众号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/12482.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Django使用

一、根目录下安装 pip install django 二、创建djiango项目 django-admin startproject 项目名称 三、创建app python manage.py startapp app名称 四、启动 python manage.py runserver 五、编写URL与视图关系,相对路径 1、manage.py(见资源绑定…

mysql 8 创建用户并赋予改用户指定数据库权限

一、使用客户端工具登录mysql 二、创建用户 -- 低版本数据库 create user 用户名% identified by 密码; -- 高版本数据库 create user 用户名% identified with mysql_native_password by 密码; -- 示例1: create user test% identified with mysql_native_passwor…

apt和apt-get有什么区别

2024年5月15日,周三上午 apt 和 apt-get 都是 Debian 及其衍生版(如 Ubuntu)中用于软件包管理的工具,但它们之间存在一些差异。 功能和目的: apt 是 apt-get 的改进版本,提供了更简洁和更直观的命令选项。…

多元化、高辨识显示丨基于G32A1445的汽车尾灯解决方案

由刹车灯、倒车灯、转向灯、雾灯等组成的汽车尾灯,既能在光线低暗时发出照明信息,也可向周围环境传递车辆的行驶状态与意图信号,对于行车安全起着至关重要的作用。与传统尾灯相比,贯穿式汽车尾灯更加醒目、美观、安全,…

CSS2(一):CSS选择器

文章目录 1、CSS基础1.1 CSS简介1.2 CSS编写位置1.2.1 行内样式1.2.2 内部样式1.2.3 外部样式1.2.4 样式优先级 1.2.5 CSS代码风格 2、CSS选择器2.1、基本选择器2.1.1 通配选择器2.1.2 元素选择器2.1.3 类选择器2.1.4 ID选择器2.1.5 总结 2.2、CSS复合选择器2.2.1 交集选择器2.…

海外媒体宣发:新加坡.马来西亚如何在海外媒体投放新闻通稿-大舍传媒

导言 随着全球化的进程加速,海外市场对于企业的发展越来越重要。而在海外媒体上宣传企业的新闻通稿,成为了拓展海外市场和提升企业知名度的重要手段之一。本文将介绍大舍传媒对于如何在海外媒体上投放新闻通稿的经验和策略。 准备工作:了解…

Hive 特殊的数据类型 Array、Map、Struct

Array 数组类型,存储数据类型一致的列表数据。 我们可以使用 array 方法来创建一个数组,如下所示: select array(1,2,3,4,5);如果其中的数据类型不一致,那么它会转换成统一的数据类型(前提是能够进行转换&#xff0…

力扣HOT100 - 322. 零钱兑换

解题思路&#xff1a; 动态规划 class Solution {public int coinChange(int[] coins, int amount) {int[] dp new int[amount 1];Arrays.fill(dp, amount 1);dp[0] 0;for (int i 1; i < amount; i) {for (int j 0; j < coins.length; j) {if (coins[j] < i) …

word内容wxml转化html标签对照表

1. 标签 w:document document 文档w:bodybody文档的主体w:sectPrsection——w:pp/div段落w:rspan行内元素w:ttext文本w:tbltable表格w:trtr表格行w:tctd单元格w:brbr换行w:hyperlinka超链接w:roundrectdiv/canvas块w:pictimg图片w:inlinespan行元素w:oMathmath公式w:subsub下标…

宠物管理系统带万字文档

文章目录 宠物管理系统一、项目演示二、项目介绍三、19000字论文参考四、部分功能截图五、部分代码展示六、底部获取项目源码和万字论文参考&#xff08;9.9&#xffe5;带走&#xff09; 宠物管理系统 一、项目演示 宠物管理系统 二、项目介绍 基于springbootvue的前后端分离…

如何让Linux系统崩溃?

如何使 Linux 系统崩溃 警告 下面的代码行是 Bash shell 的一个简短而甜蜜的 fork 炸弹。分叉炸弹之所以有效&#xff0c;是因为它能够产生无限数量的进程。最终&#xff0c;Linux无法处理所有这些&#xff0c;并且会崩溃。 fork 炸弹的一大优点是你不需要 root 权限即可执行它…

Vu2之使用provide与inject调用方法案例

Vu2之使用provide与inject调用方法案例 文章目录 Vu2之使用provide与inject调用方法案例1. 祖先组件使用provide提供方法2. 后代组件使用inject注入并调用方法 在Vue 2中&#xff0c;provide和inject是用于在组件之间传递数据的一种高级技术。虽然它们通常用于传递数据&#xf…

【scikit-learn001】逻辑回归(Logistic Regression)ML模型实战及经验总结(更新中)

1.一直以来想写下基于scikit-learn训练AI算法的系列文章&#xff0c;作为较火的机器学习框架&#xff0c;也是日常项目开发中常用的一款工具&#xff0c;最近刚好挤时间梳理、总结下这块儿的知识体系。 2.熟悉、梳理、总结下scikit-learn框架逻辑回归&#xff08;Logistic Regr…

新串口通道打通纪实

在计算机系统中&#xff0c;串口是“古老”的通信方式&#xff0c;和它同时代的“并口”通信方式已经消失了。但它仍然顽强的存活着&#xff0c;主要原因是在开发和调试底层软件时还经常用到串口。 正因为有这样的需求&#xff0c;幽兰代码本是支持串口的&#xff0c;而且有两种…

vue中父子组件如何相互调用方法

Vue 中父子组件如何相互调用方法 在 Vue 中&#xff0c;父子组件可以通过以下方法相互调用方法&#xff1a; 父组件调用子组件方法 通过 props: 父组件向子组件传递一个 prop&#xff0c;该 prop 是一个函数&#xff0c;子组件可以调用它来触发父组件的方法。通过 refs: 父组…

【现代C++】概念的使用

现代C&#xff08;特别是C20及以后的版本&#xff09;引入了概念&#xff08;Concepts&#xff09;&#xff0c;这是一种指定模板参数必须满足的约束的方式。概念使得模板代码更清晰&#xff0c;更容易理解和使用&#xff0c;并且能在编译时提供更好的错误信息。以下是C概念的关…

UStaticMesh几何数据相关(UE5.2)

UStaticMesh相关类图 UStaticMesh的数据构成 UStaticMesh的FStaticMeshSourceModel UStaticMesh的Mesh几何元数据来自于FStaticMeshSourceModel&#xff0c; 一级Lod就存在一个FStaticMeshSourceModel. FStaticMeshSourceModel几何数据大致包含以下几类: Vertex(点), VertexI…

【scikit-learn005】支持向量机(Support Vector Machines, SVM)ML模型实战及经验总结(更新中)

1.一直以来想写下基于scikit-learn训练AI算法的系列文章&#xff0c;作为较火的机器学习框架&#xff0c;也是日常项目开发中常用的一款工具&#xff0c;最近刚好挤时间梳理、总结下这块儿的知识体系。 2.熟悉、梳理、总结下scikit-learn框架支持向量机&#xff08;Support Vec…

Maven(项目管理和LINUX)

目录 一、整合IDEA 二、POM模型 三、依赖和继承关系 依赖&#xff08;Dependency&#xff09; 依赖的基本结构 依赖传递性 依赖管理 继承&#xff08;Inheritance&#xff09; 继承的基本结构 继承的特性 四、插件的使用 五、私服的使用 一、整合IDEA 在Maven项目…