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

ゆーすけべー日記

はてなBlogってどーなの!?

YourAVHost その後

去年の12月26日未明にリリースし、年末の下半身に衝撃をもたらしたらしいという YourAVHost 。 現在はてなブックマークしたユーザー数はエロサイトとして驚異的な「738Users」。 1月6日には動ナビという日本最大の裏ポータルサイトにも取り上げられ、ピーク時にはサイト内合計で 12万PV / 1day 。 友達にも何故か「おめでとう」という電話が深夜にかかってきて、サイトを作ったことを褒めてもらいました。

そんなYourAVHost、公開してから地味にいくつかの新機能の実装、アクセス対策、また広告の変更などを行ってきました。ようやくアクセスが落ち着いた段階なのでこのようなYourAVHostの変更点や俺が学んだことなどを簡単に紹介していきたいと思います。

12万PV / 1day のアクセス

ある程度予想はしていましたが、さすがにエロサイトなので、これほどのアクセスが来るとは思ってもいませんでした(というか今考えたらエロサイトだからアクセスが来たとも言えるかもしれませんね)。 これは完全に後述する俺のWebサーバー周りの設定サボリが原因なのですが、 サーバー止まりまくりです。リリースした初日、次の日とはてなブックマーク経由のユーザーが押し寄せ、 apache のプロセスが立ち上がりまくって、3G 積んでいるメモリを圧迫。 そのまま Swap を食いつぶしてフリーズするという事態が多々起こりました。 また、動ナビに取り上げられた日には先ほど述べた通り、12万PV / 1day のアクセス。 メモリを食いつぶす以前に、apache の MaxClients で設定している 256 を上回り瞬間的に処理しきれない状態が続きました。

Google Analytics のグラフ
YourAVHost

そもそも、10万PV / 1day レベルのアクセスというのはそれほど多いわけではなく、普通に運用している方であれば簡単にさばくことができるものだと思います。 完全に俺がやっているコンテンツをサーブする仕方がまずかったようで、今思うとお恥ずかしいばかりです。 Webサーバーの構成は、静的コンテンツを扱いまたリバースプロキシの役割も負う apache2 と、 今回作ったYourAVHostのページなどダイナミックなコンテンツを扱う mod_perl を読み込んだ apache1.3 と2つのWebサーバーを物理的に1台のサーバーでまかなうという具合で成り立っています。これを踏まえて、大きな問題は以下の2つでした。

  • 1.YourAVHostのページ内に含まれる画像を全て mod_perl の apache でサーブしていた
  • 2.そこで画像を全て static なコンテンツを扱う apache2 でサーブさせようとしたが、キャッシュの設定、具体的には mod_expire の設定を何もしていなかった

1 の全てを mod_perl でサーブするというのはあまりにも致命的なやり方でした。 mod_perl 環境では、apache のプロセス上にコンパイル済みの Perl プログラムが常駐することになり、プロセスひとつに付きメモリ使用量が top コマンドで 50M 前後、いやそれ以上になることがあります。 YourAVHost には画像がたくさんありますから、それらを読み込むたびに 50M のプロセスが動くことを考えるとすぐにサーバー全体のメモリを食いつぶしてしまうことは明白です。 さすがにこれはないなと、自分で気づき、すぐさまスタティックなコンテンツを扱うホストを立て、 mod_perl を組み込んでいない apache 2 の方で画像をサーブするようにしました( サーバーを変えずとも httpd.conf で設定し mod_perl を組み込まずサーブする方法もあると思います )。 これで圧倒的にページ全体の読み込み速度が速くなりました。

ところが、動ナビに取り上げられた日は、apache2 の MaxClients である 256 のアクセスを同時にさばくことができなくなりました。KeepAlive の設定なども確かなはずです。 そこで次の日 IRC の #catalyst-ja な方々にアドバイスをいただきました。 とりあえずサイトのパフォーマンスを計測してくれる YSlow という聞いたことはあるが使ったことのない、Firefox の アドオンを勧められて入れてみました→YSlow :: Firefox Add-ons。 で、だからといって今だサイトの評価は最低の「F」ランクなのですが、 問題2 のコンテンツのキャッシュについて問題ありだと言うことを気づかせてくれました。 具体的にはmiyagawaさんに言われたのですが、静的コンテンツをサーブする apache2 に mod_expire を導入して設定するということです。 その結果、YourAVHost で扱うような画像は変更されることがありませんから、それをそれぞれの HTTPレスポンスヘッダに Expires を付加するという形で「1週間は変更されないよ」という風にブラウザ側に教えてあげることができます。するとブラウザは一度読み込んだ画像に対して、expire していなければサーバー側に問い合わせることがなくなり、apache2 へのアクセスはかなり軽減されるようになります。 この設定をするだけで、負荷は大きく減り、次の日も同じくらいのアクセスがあったのですが、問題無くさばくことができました。 catalyst-ja の皆様、へっぽこな質問に答えていただきありがとうございます。

ということでまとめると、

  • mod_perl で処理する必要の無い静的コンテンツは mod_perl で扱うな
  • 静的コンテンツには mod_expire で Expires ヘッダーをつけてキャッシングさせよ

となります。 いやぁ、ほんとに俺のやり方が単にまずかっただけですが、 まさに経験をもってこれら設定の仕方と効果を感じることができて、とても勉強になりました。

新機能

次にYourAVHostの地味な新機能を2つ紹介します。 まずサイトを AutoPagerize に対応させました。

AutoPagerizeはページ分割されたWebサイトを自動的に下に継ぎ足して表示するスクリプト。FirefoxのGreaseMonkey上で動作する。

AutoPagerizeとは - はてなダイアリーより

これによりAutoPagerizeをインストールし、Onにしていると、 トップページから2ページ目に行くためにいちいちクリックしていなくてはいけないところ、 次のページが自動的に継ぎ足される形になります。これで、どんどんとエロファイルを見ていくことができるようになりましたね!

もうひとつの新機能、と呼ぶまでもないかもしれませんが、サイトの更新を知らせる Twitterボット を作りました。こちらです。

とある人から熱烈なリクエストがあったので。サイト自体がRSSを出力しているから、Plagger::Plugin::Publish::Twitterが使えてあっさりできました。 follow していれば、YourAVHostの最新情報がいつでも手に入るよ!

広告を全面的DMMに、自作APIでコンテンツマッチ

これは、自分にとっては大きなことで、実装も結構パワー使いました。 YourAVHost の広告というか、サイト上での導線について個人的に意見を持っていて、 実際に自分もある程度実践していることがあります。 YourAVHost経由で、YourFileHost にて見たエロ動画が気に入って、 好きになった女優さんがいたら、次は高画質なのを見たくなるだろう。 それでその女優さんが出ている気になる高画質のビデオがすぐ見れるとなったら、お金払ってもいいよね、 というものです。 その高画質なビデオの供給先となりうるのが、今回扱うことにした DMM.Adult です。 いろいろと徘徊して判明したのですが、YourAVHost で登場する女優さんたちに関するビデオがほとんど DMM.Adult にはあります。Amazon もDVDの品揃えはかなりいいのですが、DMM.Adult の場合は月額ブロードバンドもしくは単品ブロードバンドにより、DVDの到着を待たずにすぐに見ることができるという利点があります。

DMM.Adult にはそれぞれ女優さんのページ、そして各作品のページが存在します。これをいかに、YourAVHost のエントリーとマッチングさせて表示させるかが、上記した導線を実現するかの鍵になってきます。 YourAVHost のエントリーに紐づいている女優さんの出演しているビデオの広告がそのエントリーの隣に表示されればいいわけです。ところが、DMM は Amazon のように API を提供していないので、コンテンツを探して、その情報を持ってくるということがそのままではできません。 そこで、APIを自作することにしました。今ではサイトと統合されてうまく表示されています。ビデオに対するレビューなどもちゃんとそれっぽい感じに見せています。

YourAVHost

ではどうやってこの情報をとってきて API としたか。 よい子は真似しないでください。スクレイピングするクローラーを書いて、それを長い時間動かし、データを DB にぶちこんだのです。公開はしていませんが、WWW::DMM::Adult という Perl のモジュールを作りました。 以下のような形で、検索し、WWW::DMM::Adult::Item オブジェクトを取得することができます。

use WWW::DMM::Adult;
use Encode;
use utf8;
my $dmm   = WWW::DMM::Adult->new;
my $result = $dmm->search("柚木ティナ", { num => 3 });
my @items = @{$result->{items}};
foreach my $item (@items) {
    print Encode::encode( "utf-8", $item->title ) . "\n";
}

このモジュールと Wikipedia にあるAV女優一覧を使えばAPIで使用するデータを取得することができます。 まとめると

  • マッチングさせたい対象の辞書(AV女優一覧)を持っている
  • 検索してアイテムを返すページがある(DMM.Adultの検索ページ)
  • アイテムごとのページが構造化されている(DMM.Adultの各ビデオページ)

場合にAPIは自作して作ることができる場合があります。

ここで大きな問題は、この情報を自サイトに組み込んで掲載していいかということです。 それに関しては俺が怒られるかどうか?ということで体当たりで実証しています。というのは半分冗談の半分本気です。実際にはまだ怒られてはいません。 が、これがOKな場合もあると考えていて、例えば自作APIで持ってきた情報によりユーザーの購買行為に結び付く時には DMM.Adult 側にも利益があるわけで、Win-Winなわけです。 とはいえ、サイトには著作権があります。真似しないようにしましょう。 気が向いたら YourFileHost だけじゃなくて DMM.Adult の作品も見たらいいと思うよ!とアサマシならぬエロアサマシ。

その他

そのほかの動きとして、YourFileHost がクッキーを読むようになって、動画を複数見ていると登録しろと言われるようになりました。これは、捨てアドというか適当なメールアドレスで登録してもOKみたいです。 また、ブラウザの設定をかえることによって、登録の画面を出さない方法もあります。

まぁ、このくらいでしょうかね。ということで、YourAVHost からいろいろなことを学びました。 これからも YourAVHost をよろしくね!あ、要望があったら教えてください。できる範囲で対応したいと思います。