HTTP keep-alive


TCP、Webサーバ、HTTPの観点から、アクティビティの保持とは何かを理解し、HTTPのアクティビティの保持通信を行うクライアントの観点から注意すべき事項を理解しましょう.
keep-aliveは?
これは、サーバとクライアントがどのように接続されているかを意味します.
keep-aliveプロパティ(たとえば、「どれだけの接続を保持するか」)は、2つの場所で管理されます.オペレーティングシステムカーネルによって管理されるTCP keep-aliveと、Webサーバによって管理されるWebサーバkeep-alive.
HTTPなどのWebサーバの一般的な通信は、Webサーバのkeep-aliveプロパティに従います.一方、Rabbit MQ、Active MQ、およびThrift RPCのようなTCP通信は、TCP keep−alive属性に従う.
サーバがTCP keep-aliveのプロパティとWebサーバのkeep-aliveのプロパティに従うかどうかを知る必要があります.
TCP keep-aliveとWebサーバkeep-aliveの違いを見てみましょう.
1. TCP keep-alive
TCP keep-aliveを使用する場合は、オペレーティングシステムカーネルによって管理されます.
OSカーネル管理のkeep-aliveオプションは次のとおりです.
> sysctl -a | grep keepalive

net.ipv4.tcp_keepalive_timeout = 10
net.ipv4.tcp_keepalive_probes = 20
net.ipv4.tcp_keepalive_intvl = 30
接続が完了してから10秒待ちます.次に、コネクタがアクティブであることを確認してください.まだ生きている場合は、接続を維持してくださいが、応答がなければ、30秒後に再び生きているかどうかを検証してください.最大20回まで生存できることを検証します(probes).
TCPレベルのkeep-aliveオプションは、非接続を効果的に削除できます.クライアントからサーバへの接続終了(FIN)要求を出さずに、自分で接続を削除した場合、サーバはそれを認識できません.そのため、接続がアクティブなままであるという問題がサーバに発生する可能性があります.
2.Webサーバkeep-alive
Webサーバを使用している場合は、Webサーバが独自に管理する「アクティビティの保持」オプションを使用できます.Webサーバのkeep-aliveを使用する場合、TCP keep-aliveのプロパティは無視されます.
ブロック構造では、Apacheサーバなどの要求ごとにスレッドが割り当てられ、サーバの最大スレッド(max clients)は接続されたソケットごとに増加します.
Nginxのような非ブロッキング構造では、そうではありません.
Nginxベースのkeep-aliveオプションは次のとおりです.
keepalive_time = 10s // 한 번 맺어진 연결을 10초간 유지
keepalive_max = 10 // 한 번 맺어진 연결을 통해 최대 10번의 요청 가능
ではHTTP keep-aliveは?
HTTPはWebサーバ通信であるため、TCPの「アクティブ保持」属性ではなく、Webサーバの「アクティブ保持」属性に従う.
HTTPは通常、各要求に対して接続なしで新しい接続を作成する.頻繁にリクエストを発行すると、接続を再確立するたびに非効率になります.
HTTPはkeep-aliveヘッダを提供していますこのタイトルを使用してkeep-aliveを使用するかどうかを選択します.
HTTP 1.0では、操作を実行するにはkeep-aliveオプションをタイトルに追加する必要があります.
Connection: Keep-alive // 연결 유지
Connection: close // 연결 종료
HTTP 1.1から、デフォルトはkeep-aliveに設定されます.Keep-aliveオプションは、特別な設定なしで使用できます.
この操作は、サーバ側のWebサーバでkeep-alive設定が有効になっている場合にのみ実行されます.サーバ側のWebサーバがkeep-aliveオプションを有効にしていない場合は、機能しません.
HTTPクライアントの注意事項
HTTPクライアントには、いくつか注意すべき事項があります.
サーバー側がコネクタを閉じているが、クライアントから削除されずに再使用しようとしている場合、問題が発生する可能性があります.
これをhalf-closed connectionと呼びます.
Apache HTTPクライアントを使用すると、NotHttpResponseExceptionを受信できます.
Nettyを使用する場合は、PremationCloseExceptionを使用できます.
この問題を解決するには、クライアントがサーバに設定されたkeepalive timeではなく、接続されたevict time(lifect time)を設定する必要があります.
Apache HTTPクライアント接続プールを使用する場合は、「デバイス接続」オプションで制御できます.