読者です 読者をやめる 読者になる 読者になる

炊きたてのご飯が食べたい

定時に帰れるっていいね。自宅勤務できるっていいね。子どもと炊きたてのご飯が食べられる。アクトインディでは積極的にエンジニアを募集中です。

WordPress(Page Speed対応) - KeepAlive を有効にする


難易度

★★★大変

概要

Webページをブラウザで表示するためには、サーバーに置いてあるhtmlソースや画像といった情報を、閲覧しているPCに一度ダウンロードする必要があります。普通にページを見ているだけでは意識しませんが、htmlの構成は、CSSファイルや画像情報など、パスを辿っていかないと情報が取得できない部分が沢山あり、ブラウザが各種情報をダウンロードする処理では、

  • まずはhtmlのソースちょうだい。
  • あのCSSちょうだい。
  • あの画像情報ちょうだい。

といったように、全てのファイルに対して、1個1個、ちょうだいというリクエストをし、ファイル1個のダウンロードに1つのコネクションが発生します。

ダウンロードを行うためには、「コネクションの確立」→「データ通信」→「コネクションの開放」の3つのステップを踏まなければいけません。

  • 情報をリクエストし、ファイルの送受信が行える環境を整える「コネクションの確立」
  • 実際にデータの送受信を行う「データ通信」
  • やり取りが終わった後の後片付け「コネクションの開放」
Key:雑学事典さんはコネクションの説明を電話を例にされていました。 「相手を呼び出し電話回線を確保する」→「通話を行う」→「受話器を置いて回線を開放する」 これをそっくりTCPのコネクション型通信に置き換えると次のようになります。 「コネクションの確立」→「データ通信」→「コネクションの開放」 コネクションについて分かりやすい説明がありますので、知りたい方はどうぞ。 コネクションとは? link http://www.7key.jp/nw/tcpip/tcp/connection.html
  • 画像ファイル1個に、1コネクション。
  • 画像ファイル10個に、10コネクション。

画像をダウンロードするたびに、一回電話を切って、また同じ相手に電話をかけて、また切って、またかけて…なんてことはとても無駄なことですよね。

KeepAliveは、そんな無駄を省くために開発された技術です。

KeepAliveを有効にすることで、一度、コネクションを確立したら、条件が満たされるまでコネクションを保持し、複数のファイルに対してリクエストを実行できるように設定することができます。

相手に伝えたい用件が10個あって、1個の要件を伝え終わったら電話を切るのではなく、10個全て要件を伝え終わってから電話を切る。効率化の手法です。

それでは、KeepAliveをOnにする方法を説明します。KeepAliveを有効にする場合は、いくつか注意点がありますので、有効にする前に、一度注意点を読んでください。

KeepAliveの設定方法

まずは、現在、KeepAliveの設定が有効になっているかを確認します。確認方法の手順を参考に、確認をします。既に有効になっていたら、編集する必要はありません。

Apachehttpd.confを編集します。

[bash][root@ip-******* ~]# vi httpd.conf KeepAlive Off で検索 KeepAlive On に変更 変更後、Apacheを再起動[/bash]

以上で、KeepAliveの設定が有効になります。

KeepAliveは、「コネクションを切断するまでに受け付けるリクエストの数(MaxKeepAliveRequests)」「切断するまでの待ち時間(KeepAliveTimeout)」を指定する必要があります。

  • MaxKeepAliveRequests 100 (100個のリクエストを受け付けたらコネクションを切る)
  • KeepAliveTimeout 15(15秒間はコネクションを維持する)

Webサービスの内容によって、設定を適宜調整してください。

注意点

「KeepAliveTimeout 15」は15秒間はコネクションを維持する設定です。リクエストのやり取りが1秒で終了しても、TCPコネクションは指定した時間が経過するまで開放されないので、14秒が無駄になります。どのような問題に繋がるかというと、本来なら開放されているコネクションが開放されないことになるので、KeepAliveがOffの時に比べて、Apacheで指定しているMaxClientsの値を超えやすくなります。KeepAliveをOnにすれば、表示が速くなる反面、多くのトラフィックをさばくのに適さなくなるので、高速化だけの観点ではなく、コネクション数増加によるApacheのMaxClients越えの注意が必要です。

KeepAliveをOnにする場合は、少なくとも、サイトの接続コネクション数を定点観測できる環境を整えてから、設定を有効にするかどうかを検討するようにしましょう。

手順としては、まず、大前提として、KeepAliveをonに設定して、ページの表示が速くなるか確認してください。高速化されるなら、様子を見ながらコネクションの確認を行います。Muninなどの監視ツールを使用して、プロセス数を確認。Apacheで指定しているMaxClientsの値を超えている瞬間がないか、余裕があるかを確認します。

確認方法

Chromeを開き、NetworkのHeadersを確認すれば確認できると思っていたのですが、できませんでした。仕方がないので、wgetにオプションを付けてダウンロード時のヘッダーを確認します。

[bash][root@ip-******* ~]# wget --server-response http://example.com/[/bash]

実行して、Connectionの欄を確認します。「Connection: KeepAlive」となっていれば、KeepAliveは有効になっており、「Connection: close」となっていれば、KeepAliveが無効になっています。

参考サイト

KeepAliveについて考える link http://nosa.cocolog-nifty.com/sanonosa/2004/06/keepalive.html

KeepAlive の On Off について考える link http://techno-st.net/2009/04/03/keepalive-on-off.html

間違いだらけのWEBサーバ KeepAlive link http://d.hatena.ne.jp/uratch/20100710/1278739858