2014-06-27

Rails】2000万円で売れたエロサイト(秒間1000PV)をサーバー2台でさばいた方法

こんにちは都内に住む文系大学生です。以前にこんな記事を書きました。

文系大学生夏休みエロサイトを作った、そのまとめ(結構長文)

http://anond.hatelabo.jp/20130924220221


作成から数ヶ月が経過し、1日のPV数が1日70万を超え、売上は月80万を超えておりました。

記事自動生成しておりましたので、特に手間ひまをかけることのなく不労所得でした。

ところで私のスペックは下記のとおりです。

大学生、まして文系であれば時間も有る、金も有る、そうなればすることと言ったらセックスです。

ほぼ毎日デリヘルを呼んだり、ピンサロ女の子を店外デートに誘いセックスをしておりました。

私が好きなピンサロ川崎五反田にあります個人的にはソープよりもピンサロ派なのです。

まぁこはいいです。


そんな生活を過ごしておりますと、とある企業様より「そのサイトを買いたいので、ご希望金額を提示してくれ」とのメールを受信しました。

私は悩みました、月に80万の収入を捨てるのは惜しい、栄枯盛衰という言葉があるようにいつまでこのバブリーな生活が続くか分からない、と。

しかし二晩寝ずに考えた末、売ることに決めました、私はマンションが欲しかったのです。大学生マンションを持ってるとデリヘル嬢に自慢したかったのです。

そこで2年で回収できると見込み、私は2000万円を提示しました。即日、先方よりOKが出ました。

そしてそのお金マンション中古ですが。。。)を一括購入し、今に至ります。あの不動産屋の驚いた顔が忘れられません。


さて月日が流れ、売却先の業者様より「新しくエロサイトを作りたいのだが、利益折半で一緒にどう?」とお誘いのメールを頂きました。

文系なんてのは暇でやることが無いので、私は即日OK!しました。

そして先日完成したので、下記にアップします。

エロ動画

http://av-erodouga.com/

Xvideos動画から変わったところ

前に作ったものブラッシュアップしたことといえば、

です。

あのCookpadでも使われているVarnishで大量のアクセスを捌く

さて今回はどのように秒間1000リクエストを2台のサーバーでさばいているか説明します。

他の情報って、サイトを作る!ということにばかり焦点があたっており、大量のアクセスを捌く方法までは紹介していないのがほとんどです。

特に男性の方々はご存知のように、エロサイトってのは夜にアクセスが集中します。夜にオナニーをするからですね。

今回のサイトではVarnishというリバースプロキシソフトを使い、それを実現しております。他にはNginxSquidなどが挙げられますが、設定を柔軟に行える点、リバースプロキシに重きをおいている点、およびVarnishが高速な点を重視し、採択しています

また優秀なエンジニアがいることで有名なCookpadでも採用されている実績があります


リバースプロキシについて、知らない方もいらっしゃることかと思いますので、簡単に説明します。


通常Railsウェブサービスを立ち上げた場合ユーザーがそのウェブサービスアクセスをすると、サーバーの中ではまずApacheなどのウェブサーバーソフトウェアユーザーからHTTPリクエストが回されます

ウェブサーバーソフトウェアはその都度予め用意しているミドルウェアRails場合PassengerUnicorn)を通して、Railsに「こんなデータをくれ!」とお願いを出します。

Railsはこれまたその都度データベースアクセスし、データを読み込み、Apacheデータを返します。

ApacheHTTPレスポンスとして、そのHTMLを含むデータユーザーに渡しブラウザに表示するわけです。

誤解を恐れずに申し上げると、Railsは遅いです。「遅くない!プンスカ!」と憤慨される方もいらっしゃると思うのですが、相対的に見ると遅いです。

※参考

16の言語と57のフレームワークを比較したベンチマークが凄い | A-Listers

じゃあどうすればいいかというと、なるべくRailsに処理をさせなければよいのです。そこで出てくるのが、Varnishの一機能であるキャッシュです。

どういうことかというと、今回のエロサイト場合ユーザーに見せる情報というのはユーザーによって異なっているわけでもなく、時間が変わってもそうそ情報量は変化するわけでもありません。

その場合、一度アクセスされたURLに関しては一定時間ためておけば良い、ということになります。これがキャッシュです。

システムは学ぶより、まずはソース、下記を御覧ください。エロ動画侍のvarnishの設定ファイルです。必要な箇所にコメントを挿入しました。

面白いのは、設定ファイルのはずなのに非常にプログラミングらしい、という点だと思います。人によるかもしれませんが、ApacheとかNginxなどの設定ファイルより僕はこのほうが見やすくて好きです。

C言語とかも挿入できるようでして、それを使ってmemcachedからキャッシュを引っこ抜いたりも出来ます。私はそこまでしてません。

backend default {
     # ウェブサーバー情報
    .host = "127.0.0.1";
    .port = "33333";
}

sub detect_device {
    # 端末によってキャッシュを変更している。PC場合はそれ用のキャッシュスマホならそれ用のキャッシュを保持している。
    set req.http.X-Device = "pc";

    if(req.http.User-Agent ~ "iP(hone|od)" || req.http.User-Agent ~ "Android" || req.http.User-Agent ~ "Symbian")
    {
            set req.http.X-Device = "mobile";
    }

    if(req.http.User-Agent ~ "^PalmSource")
    {
            set req.http.X-Device = "mobile";
    }

    if(req.http.User-Agent ~ "Build/FROYO" || req.http.User-Agent ~ "XOOM" )
    {
            set req.http.X-Device = "pc";
    }
}

sub vcl_recv {
    call detect_device;

    # キャッシュしたくないURLを選択している。
    if(req.url ~ "/eroine" || req.url ~ "/admin" || req.url ~ "/ranking_counter" || req.url ~ "/actresses/[0-9]+//"){
        return(pipe);
    }
    # graceful mode
    set req.grace = 30m;
    return(lookup);
}

 sub vcl_pipe {
     return (pipe);
 }

 sub vcl_pass {
     return (pass);
 }

 sub vcl_hash {
     hash_data(req.url);
     if (req.http.host) {
         hash_data(req.http.host);
     } else {
         hash_data(server.ip);
     }
     if (req.http.X-Device) {
         hash_data(req.http.X-Device);
     }

     return (hash);
 }

 sub vcl_hit {
     return (deliver);
 }

 sub vcl_miss {
     return (fetch);
 }

 sub vcl_fetch {
     # キャッシュ有効時間を設定している。
     set beresp.ttl = 10m;
     set beresp.grace = 30m;
     return (deliver);
 }

 sub vcl_deliver {
     return (deliver);
 }

 sub vcl_error {
     set obj.http.Content-Type = "text/html; charset=utf-8";
     set obj.http.Retry-After = "5";
     return (deliver);
 }

 sub vcl_init {
        return (ok);
 }

 sub vcl_fini {
        return (ok);
 }

補足説明をしておくと、キャッシュには有効時間があります。上記では10分で設定しており、その有効時間が切れると格納されているキャッシュを破棄し、Apacheなどのウェブサーバーソフトウェアコールしにいきます

ここで瞬間的なアクセス量が多いサイトには1つの問題が生じますキャッシュ有効時間が切れた時、新たにキャッシュが作られるまでの間、大量のリクエストウェブサーバーソフトウェアに届くことになります問題になることはそこまでは多くないのですが、あまりよろしくない。

これをThundering Herd問題といいますが、Varnishでは新たにキャッシュが作られるまでVarnishに待ちを作ります。一度キャッシュが作られてから、貯まったリクエストを一気に処理するわけです。

ただこれでもVarnishの負荷が高まり、あまりよろしくない。そこでgraceful modeという方法を使います

どういうことかというと、キャッシュ有効時間が切れた場合でも、新たにキャッシュが作られるまでは古いキャッシュアクセスさせます。それがgraceful modeです。巨大ウェブサービスを考えている方は是非検討してみてください。


エロサイトを本気で考えている方は、もちろんアプリケーションの表側を作ることも大事ですが、是非それを処理するサーバーのことも考えてみるといいかもです。エロ男性全員を対象としているので、思った以上にものすごいアクセスが来ます

と散々エロサイト作成について勧めてまいりましたが、エロサイト少子高齢化社会を更に促進させたり、ティッシュの大量消費による森林伐採にも微力ながら影響を与える、そんな現実も知って下さい。

文系大学生でした。


※ちなみに個人事業主から株式会社へとグレードアップしました。おおよそ年収700万円が登記するかしないかの境です。700万円を超えると、登記したほうが税金上お得です。

参考サイト

第11回 [キャリアアップ編③]varnishを使おう:使える!サーバ運用の実践テクニック|gihyo.jp … 技術評論社

素人速報

トラックバック - http://anond.hatelabo.jp/20140627190244

記事への反応(ブックマークコメント)

アーカイブ ヘルプ
ログイン ユーザー登録
ようこそ ゲスト さん