前回からの続きです。
httpd.confに
を付与するとレスポンス内容は以下の通り、Etagが返却されなくなる。
Etagが返却されないので、次回以降のリクエストには「If-None-Match:」も
当然付与されなくなる。
FileETagの記載方法は以下のようなパターンが考えられます。
結局どのように設定すべきなのかということですが
動的ページについてはそもそもファイルではないのでいずれにせよEtagは返却されません。
なので関係ありません。
静的コンテンツについては負荷分散サーバーの振り分け論理によって替わってきます。
1)ラウンドロビン等、毎回異なるWWWサーバーへアクセスする可能性がある場合
FileETag None
か
FileETag MTime Size
とすべきです。
2)ソースIPアドレス等で一貫性のある振り分け論理の場合
基本的に同一ユーザは同一WWWサーバーに振り分けられるので、初期設定のままでかまわないはずです。
あと、もう少しだけmod_cacheを深追いしてみる という記事に、Firefox 1.5/2.0、IE7が以下のケースでどんなリクエストを送信するのか整理されていました。
このページ の記事全体がとてもためになります。
2月 24
実例から入ります。
http://xxxxxxxx/をリクエストします。
このURLへのアクセスは始めてです。
以前、書いた Firefoxのプラグイン Live HTTP Headers でHTTP通信のみをトレースしました。
———————————————————-
以下がリクエスト内容(初回アクセス)
———————————————————-
———————————————————-
以下がレスポンス内容(初回アクセス)
———————————————————-
そこでリロードして、再度リクエストを出しました。
———————————————————-
以下がリクエスト内容(2回目のアクセス)
———————————————————-
———————————————————-
以下がレスポンス内容(2回目のアクセス)
———————————————————-
ここで注目は
1)初回アクセスのレスポンス中の
2)2回目アクセスのリクエスト中の
3)2回目アクセスのレスポンス中の
です。
このEtagとはエンティティTAGのことで、apacheのマニュアルからから引用すると、
FileETag ディレクティブは ドキュメントがファイルに基づいたものであるときに、 ETag (エンティティタグ) 応答ヘッダフィールドを作成するときに使用する ファイルの属性を設定します。 (ETag の値はネットワークの帯域を節約するための キャッシュの管理で使われます。) Apache 1.3.22 以前では、ETag の値は 常にファイルの inode, サイズ、最終修正時刻 (mtime) から作成 されていました。FileETag ディレクティブにより、これらのどれを使うかを 選ぶことができます。
となります。
つまり、
※ここではIf-Modified-Sinceのことは省略しています。
WWWサーバーが一台であれば、コンテンツファイルは1個しかないので、「ファイルの実際の更新」=「Etagの変更というか変化」になるので問題ないのですが、負荷分散ルーター配下にWWWサーバーが複数台あって個別にファイルを配置している場合、まったく同じ内容のファイルを置いても、どうしてもinodeが異なるゆえに異なるEtagになってしまいます。
ファイルが変更されたと認識されて、 「304 Not Modified」ではなく、レスポンスコード200と実際のコンテンツが返却されてしまいます。
例えば、負荷分散ルーターの振り分け論理がラウンドロビンだったりすると、アクセスするたびに、別のEtagになってしまい、必要以上の負荷をネットワークに与えることになります。
これを解決するために
とか
等の対応策をとります。
さらに詳しい話はまた次回に。
2月 23
という記事に
によるアクセスログのバッファリングの記事がありました。試したことのないディレクティブだったので、実験してみました。
環境は
で、貧弱なサーバーです。
チェック方法
1回実行後に2回さらに実行して、後半2回の平均を取る
※CustomLog logs/access_log combined
※CustomLog “|/usr/local/sbin/cronolog /usr/local/apache2/logs/access_log.%Y-%m-%d” combined
※CustomLog “|/usr/local/sbin/cronolog /usr/local/apache2/logs/access_log.%Y-%m-%d” combined
やはり5-6%はあきらかに効果があるようです。
静的コンテンツ用のサーバーの場合は使える設定だと思います。
ちなみに
の場合は
なのでバッファリングした時と比べると1%くらいしか性能向上しませんでした。
2月 19
先日からの続きです。
以下は先日の記事からの引用です
==================================================
また、我々が開発するような動的ページを中心としてサイトの場合、一回の(一連の)リクエストは通常
数百ミリ秒~数秒を要する
通常は一連のリクエスト中の最初の一回
数ミリか数10ミリ秒以下の場合が多い
リクエスト数が多い(数10個以上)
の2種類から成り立ちます。
==================================================
というところからでした。
プログラムによる動的なhtmlの生成
一回の(一連の)リクエストの中で通常一件しか含まれません。その処理が済んだら、ユーザは暫くの間、その内容を読んでいるので、そもそもkeep-alive設定は必要ないわけです。
上記のhtmlから参照される静的コンテンツ(css,javascript,画像等)
こちらは上記とは逆に非常にkeep-aliveが有効なケースです。
この2種類の処理を同じ設定で対応するというところに矛盾があるわけです。
よって、以下の方法が一番良いというか、是非採用すべき方法だと思います。
最後にkeep-aliveに関する話題を挙げておきます。
2月 18
1つのWebページをブラウザが表示するにあたっては、メインのhtmlファイルに加えて、そのhtml上に記述された画像、css、javascript等のファイルをサーバーからダウンロードする必要があります。画像が多いページの場合、1個のhtmlに対して100も200も画像をダウンロードする必要があります。もしkeep-aliveを使用しないとそのすべてのリクエストについて、別々のTCP接続の開始・切断を行うことになってしまいます。keep-aliveを利用すると、通常一つのブラウザからのリクエストを一つのTCP接続で処理することができます。
TCP/IPのコネクションについては、以下のサイトにわかりやすく解説されています。
Apacheで、KeepAliveを有効とするか否かを決定するのが「KeepAlive」ディレクティブです。 KeepAliveの設定は「MaxKeepAliveRequests」ディレクティブと「KeepAliveTimeout」ディレクティブで指定します。
通常はONにすべきというのがほとんどの意見だと思います。
でも「sanonosaシステム管理コラム集」のような意見もあるようです。
ほんとうのところはどうなんでしょうか?
上記の記事ではIISのようですし、設定値が記述されていないので なんとも言えません。
はTCPコネクションを無駄遣いしてしまうことは間違いありません。
そもそもKeepAliveをONにすることはTCPコネクションを無駄遣いしないようにしているのですから本末転倒ということになってしまいます。
ブラウザからの一連の接続が終了したら出来る限り素早くTCPコネクションを切断することが望ましいわけです。しかし、MaxKeepAliveRequestsやKeepAliveTimeoutの設定は固定値であり、接続毎に動的に変更することは出来ません。
※「リクエスト間隔を考慮したウェブサーバのkeep-alive 時間の自動設定」という論文が日本ソフトウェア科学会第22 回大会(2005 年度)論文集に記載されています。興味のある方は読んでみて下さい。
対象のサイトに対するリクエストの平均的な要求値を算出して、
のがやはり正解かなと思います。
例えばユーザがインターネットに接続する帯域が細いと一回の(一連の)リクエストあたり空き時間は長くなります。
実際のサイトの計測は、Web DeveloperのNETオプションを利用すれば簡単に算出できます。
※これは一回あたりの実測ができるだけで、平均となるとアクセスログからなんらかのスクリプトを作成して算出する必要がありますが。
仮に、一回の(一連の)リクエストがファイル数で50個、全部で1秒以内で終了するとします。
にも関わらず、
とされていたとすると、そのTCPコネクションは15秒の間、無駄になってしまう訳です。
我々が開発するような動的ページを中心としてサイトの場合、一回の(一連の)リクエストは通常
数百ミリ秒~数秒を要する
通常は一連のリクエスト中の最初の一回
数ミリか数10ミリ秒以下の場合が多い
リクエスト数が多い(数10個以上)
の2種類から成り立ちます。
次回に続きます。
2月 17