こんにちは!インフラやネットワークの世界へようこそ。
Webブラウザでホームページを開くとき、画面にはたくさんの画像や文字、デザインを整えるためのファイルが同時に表示されますよね。普段、私たちはあまり意識していませんが、実はブラウザの裏側では、目にも留まらぬ速さでサーバーとたくさんの「会話(通信)」が行われています。
今回は、その通信の裏側でこっそり活躍している「HTTP/2コネクション再利用」と、パフォーマンスの鍵を握る「Keep-Aliveタイムアウト設定」について、一緒に紐解いていきましょう!
難しいネットワーク用語が出てきても、「なるほど、そういうことね!」と一歩ずつ理解できるように解説していきますので、どうぞリラックスして読み進めてくださいね。
—
1. 昔の通信は「毎回お使い」スタイルだった?
HTTP/2のお話をする前に、少しだけ昔話をさせてください。
昔のWebのルール(HTTP/1.1という仕組みです)では、ブラウザがサーバーにお願いごとをするとき、こんなお使いスタイルをとっていました。
1. 「おーい、サーバーさん!お話ししましょう!」と、専用の電話回線を繋ぐ(TCPコネクションの確立)。
2. 「画像を1枚ください!」とお願いして、もらう。
3. 「じゃあね!」と電話を切る。
4. 「次は文字のデータをください!」と、また新しく電話を繋ぐ。
……これ、なんだかすごく非効率だと思いませんか?
大きなビル(Webサイト)を建てるために、レンガを1個運ぶたびに、わざわざ新しいトラックを手配して往復しているようなものです。これでは、ページが表示されるまでに時間がかかってしまいますよね。
—
2. HTTP/2の「相乗り」と「コネクション再利用」
そこで登場したのが、現代の主役であるHTTP/2です。
HTTP/2は、郵便配達に例えると分かりやすいかもしれません。
昔の通信が「ハガキ1枚出すたびに、専用のバイクを走らせる」のに対し、HTTP/2は「大きくて頑丈な1台のトラックに、みんなの荷物をギュッと詰め込んで一緒に運ぶ」ような仕組みです。
これを技術的には「マルチプレクシング(多重化)」と呼びます。そして、一度繋いだトラック(コネクション)を、次に新しいお願いをするときも使い回すことを「コネクション再利用(Connection Reuse)」と言います。
一度繋いだ太いパイプラインを使えば、新しい電話をかけ直す手間(これをネットワークの世界では「TCPやTLSのハンドシェイクのオーバーヘッド」と呼びます)がゼロになります。結果として、Webページがパッと一瞬で表示されるようになるわけです。
—
3. でも、トラックはずっと走り続けていいの?(Keep-Aliveの正体)
「じゃあ、一度繋いだトラックは、ずっとずーーっと使い回しちゃえばいいんだね!」と思ったそこのあなた。実は、そう単純にいかないのがインフラの奥深いところです。
サーバー側からすると、誰も使っていないのに「いつ来るかわからない荷物」を待つために、ずっと専用道路のレーンを空けておくのは、駐車場のスペースが無駄になってしまうようなもの。サーバーのメモリやCPUリソースが圧迫されてしまいます。
そこで登場するのが、「Keep-Alive(キープ・アライブ)」という設定です。
これは、いわば「お互いの無事を確認するタイムリミット付きの約束」。
- 「最後に荷物をやり取りしてから、もし○秒間何も会話がなかったら、このトラックはいったん解散(コネクションを切断)しましょうね」
という制限時間を決めておく設定になります。この時間を「Keep-Aliveタイムアウト」と呼びます。
—
4. 現場で差がつく!Keep-Alive設定の最適化
では、このタイムアウトの時間は、どれくらいに設定するのが正解なのでしょうか?
実務でよく使われるWebサーバー(Nginxなど)の設定を覗いてみましょう。
Nginxでの設定例
http {
# クライアント(ブラウザ)とのコネクションを維持する時間(秒)
# ここを短くしすぎるとすぐに切断され、長くしすぎるとサーバー資源を圧迫します
keepalive_timeout 65;
# 1つのKeep-Aliveコネクション上で許可する最大リクエスト数
# 大量の画像があるページでも、この回数以内であればコネクションを使い回せます
keepalive_requests 100;
}
パラメーターの調整ポイント
- タイムアウトが短すぎる場合 (`keepalive_timeout 5;` など):
ユーザーがページを読んでいる最中にすぐ回線が切れてしまいます。次のアクション(別のリンクをクリックするなど)を起こしたときに、またゼロからコネクションを繋ぎ直さなければならず、結果としてサイトが重く感じられてしまいます。
- タイムアウトが長すぎる場合 (`keepalive_timeout 300;` など):
アクセスが少ない深夜帯でも、誰も使っていない古い回線をサーバーがずっと保持し続けます。結果として同時接続数が増えすぎてしまい、サーバーがパンク(リソース枯渇)する原因になります。
一般的なWebサイトであれば、「60秒〜75秒前後」に設定するのがバランスの良い黄金比と言われています。ユーザーが記事を読み終えて次のページに移動するまでの「ちょっとした間」を優しく包み込みつつ、不要になった資源はしっかりお片付けできる絶妙なラインです。
—
まとめ:見えない配管に気を配るエンジニアへ
HTTP/2のコネクション再利用とKeep-Aliveの最適化、いかがでしたでしょうか?
派手なデザインやプログラミングのコードに隠れがちですが、こうした「通信の土台」をどうチューニングするかによって、ユーザーが体感するスピードや、サーバーの電気代(コスト)まで大きく変わってきます。
「なんとなく動いているからいいや」ではなく、「このトラックは今、効率よく走っているかな?」と、パケットやコネクションの足音に少しだけ耳を澄ませてみる。そんな視点を持つことができれば、あなたはもう立派なインフラ・ネットワーク・エンジニアへの第一歩を踏み出していますよ!
それでは、また次回の技術散歩でお会いしましょう。快適なネットワークライフを!
コメント