CloudflareからのTLSレコードの動的サイズのパッチをNginxに固定します

Nginxを使用してTLSトラフィックを終了する場合、Cloudflareのパッチを使用してサーバーの応答時間を改善できます。 カットの下の詳細。







TLSおよびTCP



ご存知のように、インターネット上のデータはマルチレイヤープロトコルスタックを使用して送信されます。 ここで、TCPとTLSの相互作用に関心があります。 TCPの主な目標は、元の順序での信頼できるパケット配信です。 TLS(HTTPSサイト)を使用するサービスがある場合、すべての暗号化されたTLSデータはTCPを使用して送信されます。



TCPレベル:接続直後、サーバーはinitcwdパケットしか送信できません(古いシステムでは3パケット、新しいシステムでは10パケット)。 その後、サーバーはクライアントからの確認(ACK)を待機し、送信ウィンドウ内のパケット数が徐々に増加し、接続のスループットが増加します。



通常のHTTPトラフィックの場合、すべてが正常です。新しいパケットごとに、ブラウザーが使用できるデータが到着します。



TLSの問題



TLSを使用する場合、NginxはTLSレコードサイズのサイズを制御する特別なバッファー(サイズはssl_buffer_sizeディレクティブで指定されます)を使用します。 ブラウザ(クライアント)は、TLSレコードを完全に受信した後にのみデータを使用できます。 同時に、最大(およびNginxのデフォルト)ssl_buffer_sizeサイズは16kです。



パケット送信の初期ウィンドウ= 10であるため、約14kのトラフィックを取得できます。これは、 TLSレコード (16k)よりも少ないです。 これにより、有用なコンテンツの取得が遅れる可能性があります。



HTTP / 2を使用する場合は、http2_chunk_size設定(デフォルトでは8k)に注意する必要があります。これは、応答本文が分割される部分の最大サイズを設定します。 この場合、サーバーへの接続は1つのみ使用されるため、このTCP接続で同時に多くのリソースが転送され、遅延の可能性が高くなります。



何ができますか?



できる最も簡単なことは、 ssl_buffer_sizeを例えば8kまたは12kに減らすことです。 これは、Nginxの標準バージョンで実行できます。 ただし、大量のデータを送信すると、効率が低下します(オーバーヘッドが高くなります)。



理想的なssl_buffer_sizeは存在しないことがわかりました。



動的TLSレコードサイズ



ここで、Cloudflareのパッチセットが役立ちます。



これらのパッチを使用して、TLSレコードの動的サイズのサポートを取得します。



新しい接続では、レコードサイズは1パケットのサイズ以下に設定されます。特定の数のレコードを渡した後、サイズを3 TCPパケットに増やし、最大サイズ(16k)に増やすことができます。 接続がアイドル状態になると、プロセスが再び開始されます。 このプロセスのすべてのパラメーターは構成可能です。



パッチを適用する



新しい機能を取得するには、パッチを適用してNginxをビルドする必要があります。 OpenSSLを使用してNginxをビルドすることについては既に書いたので、パッチを適用するプロセスについて詳しく見ていきましょう。



パッチを適用するには、githubページにアクセスする必要があります



このページでは、各ファイルの個々のパッチを分離する必要があります。 パッチ自体の記録は次のように始まります。



diff --git a/src/event/ngx_event_openssl.cb/src/event/ngx_event_openssl.c
      
      





このエントリから、このパッチが何を指しているのかが明確になります(この場合はsrc / event / ngx_event_openssl.c )。

パッチテキストをファイル(たとえば、 openssl.c.patch )にコピーし、ソースファイルの横に配置します。



次のコマンドでパッチを適用します。



 patch ngx_event_openssl.c < openssl.c.patch
      
      





そのため、すべてのパッチファイルを調べます(合計で4つのファイルが必要です)。

さて、通常どおりNginxをコンパイルします(1.11.2を使用し、すべてがうまくいきました)。



Nginxを構成する



パッチにより、新しい設定が追加されます。 およそ次の値が得られます。



 #   ,  1  ssl_dyn_rec_size_lo 1369; #   , 3  ssl_dyn_rec_size_hi 4229; #        ssl_dyn_rec_threshold 20; #        ssl_dyn_rec_timeout 10; #  ,    ssl_buffer_size 16k;
      
      





詳細は、Cloudflareブログの元の記事に記載されています。



TLSレコードサイズの最適化の原理については、 本HPBNで読むことができます。

それは私にとっては、自宅でそれを実装している間、私たちはテストしています。 すでに設定の経験がある場合は、コメントで共有してください。



All Articles