原作者:F5のマキシム・イヴァニツキー
元のリンク: NGINX オープンソース バージョンを再起動せずに SSL/TLS 証明書のローテーションを実現できます
転載元:NGINXオープンソースコミュニティ
NGINX の唯一の公式中国語コミュニティ (すべてnginx.org.cn )
高性能 Web サーバーの世界では、軽量で効率的なアーキテクチャにより大量のトラフィックを処理できるNGINXが人気の選択肢です。 NGINX JavaScript モジュール (njs)に共有辞書機能を導入することで、NGINX のパフォーマンスが次のレベルに引き上げられました。
この記事では、njs 共有辞書の機能と利点を検討し、再起動せずに SSL/TLS 証明書をローテーションするように NGINX オープン ソースを設定する方法を示します。
共有辞書の概要とその利点
新しいディレクティブにより、NGINX オープンソース ユーザーは共有メモリ領域を有効にしてワーカー プロセス間で効率的にデータを交換できるようになります。これらの共有メモリ領域は、キーと値の辞書として機能し、リアルタイムでアクセスおよび変更できる動的構成設定を保存します。 js_shared_dict_zone
共有辞書の主な利点は次のとおりです。
- 最小限のオーバーヘッドと使いやすさ – njs に直接組み込まれており、直感的な API とシンプルな実装のおかげで、設定と使用が簡単です。また、ワーカー プロセス間のデータ管理と共有を簡素化するのにも役立ちます。
- 軽量かつ効率的 – イベント駆動型のノンブロッキング I/O モデルを活用して、NGINX とシームレスに統合します。この方法により、メモリ使用量が削減され、同時処理能力が向上し、NGINX が多数の同時接続を効率的に処理できるようになります。
- スケーラビリティ – 複数のワーカー プロセスにわたって水平方向に拡張できる NGINX の機能により、複雑なプロセス間通信メカニズムを必要とせずに、これらのプロセス間でデータを共有および同期できます。有効期限 (TTL) 設定を使用すると、共有辞書エントリ内のレコードを管理し、ゾーンから非アクティブなエントリを削除できます。 evict パラメーターは、新しいエントリのためのスペースを確保するために、最も古いキーと値のペアを削除します。
共有辞書を使用したSSLローテーション
共有辞書の最も効果的な使用例の 1 つは、SSL/TLS ローテーションです。使用すると、NGINX を再起動せずに SSL/TLS 証明書またはキーを更新できます。さらに、NGINX で証明書を管理するための REST のような API も提供します。 js_shared_dict_zone
以下は、およびディレクティブを使用して HTTPS サーバーをセットアップするNGINX 構成ファイルの例です。ファイルから SSL/TLS 証明書またはキーを読み取るJavaScript ハンドラー。 js_set
ssl_certificate
js_set
この構成スニペットは、共有辞書を使用して、証明書とキーをキャッシュとして共有メモリに保存します。キーがない場合は、証明書またはキーがディスクから読み取られてキャッシュに配置されます。
場所を公開してキャッシュを手動でクリアすることもできます。ディスク上のファイルが更新されると (証明書やキーの更新など)、共有辞書はこれらの更新をディスクから読み取ります。この調整により、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;
}
...
}
以下は、循環 SSL/TLS 証明書とキーを使用した JavaScript の実装です。 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
}
リクエストを送信してキャッシュを無効にすると、NGINX は次回の SSL/TLS ハンドシェイク中にディスクから SSL/TLS 証明書またはキーをロードします。さらに、キャッシュを保持および更新しながら、リクエストから SSL/TLS 証明書またはキーを取得するために使用できます。 /clear
js_content
この例の完全なコードは、 njs GitHub リポジトリにあります。
すぐに始める
共有辞書機能は、シンプルさとスケーラビリティにおいて大きな利点を提供する強力なアプリケーション プログラマビリティ ツールです。機能を使用すると、新たな成長の機会を発見し、増大するトラフィック需要に効率的に対処できます。 js_shared_dict_zone
NGINX の導入をスピードアップする準備はできていますか? NGINX デプロイメントをアップグレードして、新しいユースケースを活用できます。この機能の詳細については、ドキュメントを参照してください。さらに、最近立ち上げられたnjs-acme プロジェクトで共有辞書機能の完全な例を確認できます。これにより、njs モジュール ランタイムが ACME プロバイダーと連携できるようになります。 js_shared_dict_zone
js_shared_dict_zone
NGINX オープン ソース バージョンに興味がある場合、またはご質問がある場合は、WeChat に Xiao N Assistant (WeChat ID: nginxoss) を追加して NGINX 公式 WeChat グループに参加し、詳細を確認したり、質問したり、NGINX に関するフィードバックを取得してください。オープンソースバージョン。
NGINX の唯一の公式中国語コミュニティ (すべて nginx.org.cn )
NGINX 関連のその他の技術情報、インタラクティブな Q&A、一連のコース、およびイベント リソース: オープンソース コミュニティ公式 Web サイト | WeChat 公式アカウント
1990 年代生まれのプログラマーがビデオ移植ソフトウェアを開発し、1 年足らずで 700 万以上の利益を上げました。結末は非常に罰的でした。 高校生が成人式にオープンソースプログラミング言語を自作―ネチズンの鋭いコメント: 詐欺横行でRustDesk依存、国内サービスの タオバオ(taobao.com)は国内サービスを一時停止、ウェブ版の最適化作業を再開 Java最も一般的に使用されている Java LTS バージョンは 17 、Windows 11 は減少し続ける Open Source Daily | Google がオープンソースの Rabbit R1 を支持、Microsoft の不安と野心; Electricがオープンプラットフォームを閉鎖 AppleがM4チップをリリース GoogleがAndroidユニバーサルカーネル(ACK)を削除 RISC-Vアーキテクチャのサポート Yunfengがアリババを辞任し、将来的にはWindowsプラットフォームで独立したゲームを制作する予定