無需重啟 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.pswp.cn/web/12482.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/12482.shtml
英文地址,請注明出處:http://en.pswp.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項目…