header image
 

(Flashのテスト用に)低速に振舞うWebサーバを建てる

とある日のこと。納品するコンテンツの作成で困ったことが発生。
帯域が厳しい環境も考慮して欲しい、と要求が来まして、
具体的には厳しい帯域とは56kモデムの接続環境を指すんですが、
その「厳しい帯域」のシミュレーション(と環境構築)が・・・困難!

Flashは読み込み時に何パーセント読み込まれたかを表示する「プリローダ」を
組み込んで、待ってもらう際に進捗がわかるように作るのが定番ですが、
その動作の検証も低速な環境がないため、あまりうまくいっていなかったのです。
そんな事もあり、ちょっとがんばって低速で応答するHTTPサーバを建てる事に。

社内LANは速すぎるし、かといってすぐ利用できる低速なIP環境(SLIP等)も無いときた。
遅いデバイスといえばまず思い浮かんだのはフロッピーでした。
コンテンツをフロッピーにコピーした上で、そのファイルを開けばいいじゃないか、と。
が、これはあっさり却下に。
フロッピーからのデータは非同期で送られてこないので、
ファイルを開く関数をコールすると、何時までたっても返ってこないではないか。
ファイルの中身が全部読み込まれてから、ようやく返ってきた。これじゃあ駄目だ。
データのストリームが少しずつ送られてくる状況が必要なのに。

SLIPやPLIPも考えたけど
(そういやAmiga3000にEthernetカードが無いので、PLIPでLinuxに繋いでから
 インターネットに出て行ったんだっけなーと、遠い目)、
やっぱ面倒。
物理的に2台のマシンをあんまり長くも無いケーブルで繋ぐ必要があるのはちょっと・・・。

ググったところ、Sloppyという、ある程度低速に振舞う、
Javaで書かれたクライアントサイド(?)のProxyらしきものも見つかったのですが、
手軽感が沸かずパス。

その後もうろうろと思いをさまよわせたあげく、
結局ふと思い出したACME Laboratoriesのthttpdの導入に決定。

  • やりたいこと: 低速に応答するWebサーバを建てる
  • 目的: 納品コンテンツのQAテスト用。回線が細い環境での閲覧に支障がないかの検証(帯域 ≒ 36kbps)
  • 使用するソフトウェア: ACME Laboratoriesthttpd

今回はデバッグ用途なので、

  • 既存の環境に影響を与えない
  • 導入、削除が簡単
  • 軽量
  • 限られた資源で慎ましやかに動く

という条件で検討し、結局thttpdをテストサーバに追加導入することにした。
thttpdには、設定ファイル「thttpd.throttle」で、ファイルの拡張子毎に使用する帯域を設定できるというとても便利な機能がある。
今回のコンテンツでは、.HTML/.XML/.MP3/.SWFの4種類を使うので、これらに対して使用帯域の上限を設定した。

テストサーバはRedHat系の『Trustix Secure Linux』という聞き慣れないディストリビューションだが、
テスト担当者が他のマシンでも同一の環境を構築できるよう、SPECファイルを書き、必要なファイルをSRPMにまとめた。
# ちなみに、TrustixはXレスのコンパクトなサーバ用ディストリビューションで、
# 無料版でも、swupというツールによって常に最新のソフトウェアに自動アップグレードできるのが特徴。

thttpdのおかげで、当初もくろんでいた目的はあっさり実現できたが、
もうひとつ困った問題が出てきた。
部のLAN内の全てのマシンはproxyを通してテストサーバと通信しているのだが、
proxyがかなり強力なため、一度アクセスしたコンテンツに再度アクセスしても、proxyがキャッシュの中身を返してきてしまうのだ。
つまり、2回目からは一瞬で読み込みが完了してしまう。ブラウザのリロードボタンを押しても全く効果がない。
おまけに、部内はNATを使っているので、あるテスト担当者がアクセスしたコンテンツにアクセスすると、一瞬で読み込みが完了…。
うーん。これでは話にならない。

しょうがないので、thttpdのソースにパッチを当てて、
proxyにキャッシュを一切しないよう指示してみた。
これで一件落着。

RPMのSPECファイルとSRPM:
thttpd.spec
thttpd.src.rpm

Trustixでは、

HTTPDサーバが利用するユーザ名/グループ名 => httpd/httpd
init.dの場所 => /etc/rc.d/init.d/

となっていた。
他のディストリビューションでRPMをビルドする場合は、
この部分を使用しているディストリビューションの対応するそれに(もし違えば)書き換えればいいと思う。


以下、個人用メモ。

thttpdの配布物に含まれるデフォルトのSPECファイルからビルドすると

http://example.com/~user/

というような、チルダ以下にユーザー名を付加すると/home/user/public_html
にマッピングされる仕組みが有効にならないので、設定ファイルにパッチを当てる。

+TILDE_MAP_2追加。
http://www.acme.com/software/thttpd/options.html#TILDE_MAP_2

+デフォルトキャラクタセットはなんとなくeuc-jpに。
+thttpd.throttleをソースファイルリストに追加。
+キャッシュ無効化オプション(nocache)が指定されたときに、HTTPヘッダに

Cache-Control: no-cache,no-store,must-revalidate

を出力するようソースにパッチを当てた。
*CGIはデフォルトで無効だが、そのままに。

# TILDE_MAP_2を定義したのに、http://example.com/~user/ にアクセスしても、404エラーになってしまい途方に暮れたが、
# /etc/thttpd.confのchrootオプションを切ったら無事にアクセスできるようになった。
# よく考えてみたらchrootしたら、ユーザのホームには当然アクセスできないよな。
# 深く反省。
# 45分のロス。

~ by dseg on 2pm 03/22/08.

Flash, Flex, Uncategorized

One Response to “(Flashのテスト用に)低速に振舞うWebサーバを建てる”

  1. [...] リーが。 thttpdには、設定ファイル「thttpd.throttle」で、ファイルの拡張子毎に使用する帯域を設定できるというとても便利な機能がある。(Flashのテスト用に)低速に振舞うWebサーバを建てる [...]

Leave a Reply