【nginxの】パフォーマンス解析--SNI nginxのソース分析法[nginxの】SNI機能のnginxを使用して

コンセプト

我々はすでにSNI、SNIとどのようにユーザーを設定することです知っています。

使用される方法の【nginxの】nginxのSNI機能

 

問題

設定ファイルは、各SSL TLSリンクのために見つけることができる観察することで、nginxのは、正しい証明書を見つけるために、/ダイナミクス(負荷)を見つけるでしょう。

さて、このプロセスでは、との事情のSNIの設定がない場合、それのパフォーマンスの間にどのような類似点と相違点?

ソースのnginxの関連部分の分析を通じて、我々はこの質問への答えを与えるだろう。

(私はあなたが直接、後に「結論」の項を参照して変えることができ、ソースコードを気にしないでください。)

 [20191023 @ classic_tong]

真実と地図

 

分析

図に示すように。

1つのモジュール

nginxのはngx_openssl_module、TLSのプロセスを完了するために(ここではHTTPのみを分析し、独自のアナロジーをストリーム)は、2つのモジュールを使用し、

ngx_http_ssl_module。前者のコアモジュールです。後者はHTTPモジュールです。

コアモジュールは、OpenSSLの初期化を含むロードするngx_ssl_initマスタ・プロセス()関数、完全なグローバルプロセス、呼び出されます。

HTTP HTTPモジュールフレームがプロセスによって完了され、それは、接続の構成相と解像度相に分けることができます。

 

2構成フェーズ

赤いボックス内の図「プロセス2。」この段階は、プログレッシブ処理プロファイルの段階です。この段階では、SSLサーバの設定時間をマージし、

http_ssl_moduleは、関数がSNIを設定されているかどうかを判断します。

 

ノーならば、あなたは()関数は、すべての証明書内の証明書チェーンをロードngx_ssl_certificate呼び出します。

、それはメモリに読み込まれ、それをグローバルコンフィギュレーション・ファイルctx構造体に格納されます。ctx構造体は、グローバルな文脈でのopenssl APIであり、それがパラメータとして渡されます

APIのOpenSSLに、OpenSSLの接続を処理するときに、証明書チェーンCTXコピー(SSL_newインタフェースによって)構造に接続するであろう、あります

OpenSSLは、TLSレベルに接続されているスコープ構造を接続します。

 

あなたがSNIを設定した場合、http_ssl_moduleは、証明書チェーンをロードしませんが、多変量解析の設定は、操作のための準備ができて、スタンバイをコンパイル。

これと同時に、のOpenSSL SSL_CTX_set_cert_cbによって()コールバック関数ngx_http_ssl_certificateを設定する()関数が存在するであろう、機能が意志

SSLハンドシェイクに入る前に、ユーザーに証明書情報を修正する機会を与えます。コールバックは、中)(SSL_do_handshakeで行われます。

#男SSL_CTX_set_cert_cbの
cert_cbは()であるアプリケーション定義のコールバック。それはされた証明書は、クライアントまたはサーバによって使用される前に呼び出さ。
コールバックは、渡されたSSL構造を検査することができ設定または任意の適切な証明書をクリアします。

  [20191023 @ classic_tong]

要求フェーズ3

図赤い箱「プロセスIII」

「機能がSNIを有効になっている場合、」要求フェーズでは、nginxのによって知覚されるものではありません。SNIすべてのロジックは)(テキストコールバックのフロントngx_http_ssl_certificateを設定します

完成しました。ただ通常のサービス論理処理とnginxのSSLモジュールフレームが完成されます。

コールバック関数では、アプリケーションは最初の中間記憶のような構造を要求します。次に、証明書チェーンは、OpenSSLのBIOインターフェイスをロードすることによって完了し、に連結されています

opensslのの構造を接続します。すると、ちょうど適用要求がリリースされます(サイドプールを構築し、ここで、このプールは、オペレーティングシステム、アプリケーションからのメモリです)。

チェーンリンク証明書の終わりがリリースされる予定の後に一緒に多重化機能ngx_ssl_load_certificate()の構成段階でこのプロセスは、全体のプロセスは、グローバルコンテキストctxに参加しませんでした。

新しいリンクは、次の証明書チェーンいったん再ロードされます。

 

4 OpenSSLの

SNIおよびSNIのない2つのプロセスがキーがコンテキストctxかどうかで、次のような違いAPI呼び出しシーケンスを見つけるだろうが観察されました。

SSL_use_certificate()関数を使用する場合SSL_CTX_use_certificate()関数を使用して、SNIありませSNIありません。

、文書を探すの違いを比較します。

#男SSL_CTX_use_certificate 
ザ・SSL_CTX_ *のクラスの関数のはSSL_CTXのに証明書と鍵をロードするオブジェクト CTX。情報がされて渡された
SSLにオブジェクトを作成し、SSL から SSL_new(とCTX 3 CTXに適用された変更は、そのようにコピーして)に既存のSSLオブジェクトを伝播しません。 SSL_は * クラスの機能は、特定のSSLに証明書と鍵をロードするオブジェクト特定
の情報はされ(SSL_clear場合、保持3されていると呼ばれるため 、このSSLのオブジェクト

側は我々の分析の結果を確認してから、興味を持ってここではそれらを繰り返さないで、完全なマニュアルを読むことができます。

 

実験5

今までのすべての分析はブラックボックスとしてのOpenSSLますnginxのに基づいています。厳しいOpenSSLは、複数の負荷を防ぐために特に最適化を行って排除しません

可能な証明書チェーン。分析を確認するために、SNI構成した後、複数の要求は、同じ証明書を使用するために、以下の実験を行います。観察を通じてGDB、コールバック関数を入力して、リロードするかどうかを毎回

証明書チェーン。

616          であれば(ngx_strncmp(cert->データ、" データ:"はsizeof" データ:") - 1)== 0 ){ 
(GDB)N 
627              であれば(ngx_get_full_name(プール、(ngx_str_t *)&ngx_cycle-> conf_prefix、 CERT)
(GDB)
634              バイオ= BIO_new_file((CHAR *)cert->データ、" R " ); 
(GDB)
635              であれば(バイオ== NULL){ 
(GDB)
643          X509 = PEM_read_bio_X509_AUX(バイオ、NULL、NULL、 NULL); 
(GDB)BT0   ngx_ssl_load_certificate(プール= 0x55825f636240、ERR = 0x7ffd32750868、CERT = 0x7ffd32750900、鎖= 0x7ffd32750870 SRC /時)イベント /ngx_event_openssl.c:643 1   0x000055825ed31d79   ngx_ssl_connection_certificate(C = 0x55825f64c0c0、プール= 0x55825f636240、CERT = 0x7ffd32750900、キー= 0x7ffd32750910、パスワード= 0x55825f0df860 <empty_passwords。29651 >のsrc /時)イベント /ngx_event_openssl.c:546 2  0x000055825ee378ef  ngx_stream_ssl_certificate(ssl_conn = 0x55825f632c70、引数= 0x55825f63def0:SRC /ストリーム/ ngx_stream_ssl_module.cで)530 3   0x00007efed0277b3c   tls_post_process_client_hello()から /opt/openssl/lib/libssl.so。1.1 4   0x00007efed026d362   state_machine()から /opt/openssl/lib/libssl.so。1.1 5   0x00007efed0265991   SSL_do_handshake()から /opt/openssl/lib/libssl.so。1.1 6   0x000055825ed33f27  ngx_ssl_handshake(C = 0x55825f64c0c0)SRC / AT イベント /ngx_event_openssl.c:1683 7   0x000055825ed34671   ngx_ssl_handshake_handler(EV = 0x55825f66dec0 SRC /時)イベント /ngx_event_openssl.c:1992 8   0x000055825ed2dae8   ngx_epoll_process_events(サイクル= 0x55825f62d4a0、タイマ= 60000、フラグ= 1)SRC / AT イベント /modules/ngx_epoll_module.c:957 9   0x000055825ed185cf   ngx_process_events_and_timers(サイクル=0x55825f62d4a0)SRC / AT イベント /ngx_event.c:242 10  0x000055825ed2a4d4   ngx_worker_process_cycle(サイクル= 0x55825f62d4a0、データ= 0x0の SRC / OS / UNIX / ngx_process_cycle.cで):759 11  0x000055825ed26305   ngx_spawn_process(サイクル= 0x55825f62d4a0、PROC = 0x55825ed2a3d4 <ngx_worker_process_cycle>、データ= 0x0の、名前= 0x55825ee6e4fb  " ワーカープロセス"、復活= - 3)SRC / OS / UNIX / ngx_process.cにおいて:199 12 0x000055825ed29018   ngx_start_worker_processes(サイクル= 0x55825f62d4a0、N = 1、タイプ= - 3)SRC / OS / UNIX / ngx_process_cycle.cにおいて:359 13  0x000055825ed284fb   ngx_master_process_cycle(サイクル= 0x55825f62d4a0)SRC / OS / UNIX / ngx_process_cycle.cで:131 14  0x000055825ecdf1d9  における主(ARGC = 1、ARGV = 0x7ffd327511a8 SRC /コア/ nginx.cで):382 
(GDB)

(後に見やすい、コールスタックのままにしておきます。)

実験を通じて、各証明書は、機能が最適化されていない限り、そうでない場合は、ディスクIO操作の各リンクの各証明書が行われるのAPI BIO_new_fileリロードによって行われます。

 

結論

SNI機能を設定した後、nginxのTLSリンク要求処理は、性能の損失になります。各リンクレベルの粒度喪失。

メモリ割り当てを解放すると、証明書チェーンローディングディスクIOのグループ上のすべての証明書:各SSL / TLSの追加リンクが発生します。

 

改善

私は、元の要求にもOSのアプリケーションのメモリに対処するために必要とされている場合ので、アプリケーションのメモリは、無視することができると思います。もっと重要なこと、ディスクIOがあります。

第1の実施形態は、すべての証明書は、この方式は、コードをトリミングを必要としない、メモリ・ファイル・システム内に配置されてもよいです。

第二のオプション、証明書がまだ我々 、動的に選択されるが、別のセットの決意の場合に限りているがngx_http_ssl_certificateを()、書き換え

事前にロードすることができ、IOは、ランタイムを削除しました。制限の導入は、次のとおりです。1つの候補セットをリアルタイムに変更することはできません、コレクション要素2の証明書の数が上限値を設定する必要があります。

 [20191023 @ classic_tong] 

おすすめ

転載: www.cnblogs.com/hugetong/p/11728032.html