一億人のアクセスに耐えるサイトを作る

新規事業の為にウェブサイトを作って宣伝を始めました。ですが、突然何らかの理由で大量のアクセスがあり、あっという間にサーバーが止まってしまう。そんなこともあり得ないことではありません。

せっかくの沢山の人が見にきてくれてるのに、サーバーがダウンしてしまったら機会損失です。DellとかApple Storeのショッピングサイトがダウンしたら、1日に何億円もの損失があると思います。我々もサーバーを絶対にダウンさせたくないですね。

事業をやるからには、なるべく機会損失を避けなければいけません。1日中長蛇の列ができるラーメン屋があったとしても、1日一億人が訪れることはないでしょう。しかしウェブサイトではあり得るのです。

ですが、そのような事を心配して高価なサーバーをデータセンターに置いてもらい、初めから高いコストをかけることはするべきではありません。アクセスが多くなるまでは金をかけないようにしたい。これからそのような方法を語ります。

同じシステムが最初は小さく後で大きくできる柔軟性を持つ。それをスケーラビリティーと言います。

初期投資は少ないことが大事

ウェブサイトを新しく作るということは、新規事業を始める場合が多いと思います。新規事業を始める時には経費は、とことん安い方が良い。なるべく始めは0円で済ませる努力をします。

新規事業がうまくいく可能性は100%ではありません。せっかく資金を用意しても、その資金が簡単に溶けて無くなってしまいます。それでは新規事業の開始になかなか踏み切れませんね。

もし初期投資が0円だったら、うまくいかないと判断した時点で撤退を決意しやすく、次のアイデアに行くことができます。この身軽さが新規事業を起こしやすい秘訣だと思っています。

まあ実際には0円は無理なので、今回はさくらレンタルサーバーの月500円くらいのでスタートするとします。

サーバーに負担をかけない技術を使う

ウェブサイトの製作には様々な技術があり、目的が重複するものがあります。多くのウェブデザイナーは、流行の技術を使ってウェブサイトを作ろうとしますが、重複する目的のものを同時に使ってたりします。

CSSもテンプレートもデータベースも、データとデザインを分離する為に使う事ができるので、どれか一つだけでも目的は達すると思います。

ウェブサイトを作る技術は、見た目を良くする、製作の効率をよくするなどの目的もありますが、今回はサーバーに負担をかけない技術を優先します。

初期段階

最初はお金のかからない方法のみを使います。共有サーバーで月額何百円で済むようなサーバーにします。

ページ数が少ないならBootstrapを使う

会社概要、事業内容、トップページ、お問い合わせ等のようなページしか必要ないならば、静的なHTMLのみでウェブサイトを作るべきです。

動的なページと静的なページは、サーバーの作業負担に大きく違いがあります。医者が問診と検査をして患者に診断結果を伝える作業と、チラシ配りの作業くらいに違います。情報を多くの人に渡せる量は圧倒的に後者が多いのです。

WordPressのようなCMSが必要となるのは、ページ数が多くなるウェブサイトになる場合と、複数のスタッフでウェブサイトを運用をする場合だけに思います。

BootstrapはCSSとAjaxを使ったフレームワークで、見栄えの良いウェブサイトを効率よく作れる良いものだと思います。なるべくHTMLファイルのみのページがサーバーの負担は極力減らせますが、PHPならばヘッダーやフッター等の共通部分をインクルードで共有できますので、複雑な事をさせないならば、PHPを使って良いと思います。

WordPress使う場合

ページ数が多くなることが想定される場合と、複数のスタッフでサイトの運用をするのならば、WordPressのようなCMSを使うのは仕方ないと思います。

しかし、WordPressはサーバーが重くなりがちなので、気をつけないといけません。CMSを使う時点で、様々な対策もしなければならないと心得るべきです。

・プラグインを減らす

WordPressのプラグインは具体的に何やっているかというと、記事などHTMLデータの文字列操作をしています。その文字列操作の前に、別のサーバーとの通信を行ったりします。その処理が複雑になればなるほど、サーバーの負担が増えます。その上で、プラグインが数が増えれば、その倍数でサーバー負担が増えるのです。

まあ余計なプラグインを入れないようにしましょうという事です。

・キャッシュプラグインを使う

WP Super Cache等のWordPressのプラグインが何をしているかというと、おおよそ閲覧者のブラウザーキャッシュを積極的に使わせたり、コンテンツの更新をする端末には逆にブラウザーキャッシュを使わせなかったりすることをしています。

ブラウザーのリクエストに対して、サーバーは何もせず大分怠けさせてくれという事です。入れた方が良いと思います。

・ニュースやブログなどはSNSを使う

FacebookやTwitterにお知らせなどを投稿して、その一覧をウェブページに埋め込めばサーバーの負担は一切ありません。
Webページの中で表示されていても、閲覧している端末のブラウザーとSNSのサーバーが通信しているだけです。

FacebookやTwitterのサーバーは、世界最高の強固さを持つサーバーですので安心してください。

・PHP7.1のモジュール版が使えるサーバーを選ぶ

前のバージョンと比べてPHP7.1は、ものすごく早くなっています。古いPHPのバージョンでないと動かないプラグインは捨てて、対応済みのものだけを使いましょう。

次の段階

アクセスがある程度多くなると、少々費用をかけてもよくなるはずです。
良い理由でアクセスが多いならば、当然売り上げも上がっているはずですからケチらずにいきましょう。

・Amazon S3に画像を移す

画像だけをAmazon S3に置くようにします。ページの中で画像をいくら使おうと、ウェブサイトのサーバーにはまったく負担がかかりません。
画像のダウンロードは、閲覧している端末のブラウザーと、Amazonのサーバーが通信しているだけになります。

Amazon S3は天下のAmazon Web Servicesですから落ちません。

・ランク上のサーバーに引っ越して自由にチューニング

専用サーバーなどに引っ越して、Apacheやmysqlのチューンナップできるようにします。それと、遅い場合の原因を見つけやすくする為にも、共有ではなく専用サーバーが良いと多います。

・Apacheのチューニング

MinSpareServers , MaxSpareServers , ServerLimit , MaxClients , MaxRequestsPerChild等を調整します。初期値ではまったく速度を優先させていません。オープンソース系のソフトウエアの初期設定の特徴に感じるのは、速度よりも多くの環境での安定性を優先しているように思えます。
とにかくいじってナンボです。

闇雲に数値を大きくしてはいけません。MaxClientsなどは小さくする事で、前のリクエストの処理が終わるまで、次のリクエストを待たせるという動きをします。数値が大きすぎると、同時に仕事を受けすぎてメモリを消費し、閲覧者のブラウザーからのリクエストを処理できなくなります。

ここあたりは、本当に詳しい人とexcelと電卓を使って、メモリサイズなどを超えないようにして値を決めるような調整をしなければいけません。うまくいく設定値を見つければ、目を疑うような速度を出します。

・Apacheのmod_cacheを使う

とにかく画像や文章のデータを、サーバーのメモリ内に置いておき、アクセスの遅いディスクへのアクセスをさせないようにします。その代わりに、メモリが多いサーバーである事が前提です。

・Mysqlをチューニング

my.cnfをいじってチューンをします。コネクションの数、バッファーの量、クエリーキャッシュも有効に設定します。Apacheと一緒で、メモリを上手にギリギリまで利用するような設定が理想です。
その時は詳しい人に相談するか、説明サイトを見て行いましょう。

・Nginxをフロントエンドにする

あと1台サーバーを用意して、ロシアのウェブサーバーNginxを使ってプロキシーキャッシュを行わせます。これはよく行われる方法です。

ですが、フロントエンドの数を増やして負荷分散することは、非常に難易度が高いです。自信がない方はCDNサービスの利用をお勧めします。

・Amazon CloudFrontを使う

Nginxを使ってプロキシーキャッシュでは頼りなくなったら、誰でも使えるCDNサービスのCloudFrontを使いましょう。天下のAmazon Web Servicesが自社サーバーの代わりに働いてくれるわけですから、相当働きます。

最後はAkamaiに相談

世界最大のCDNサービスであるAkamaiに頼まなければならないほどサーバーへのアクセスが多かったら、もうその事業は大成功のはずです。

Akamaiは大きな会社でないと話も聞いてくれないのではないかと思います。費用も相当かかるのではとも想像します。ですが、Akamaiが必要なくらいのウエブサイトであれば、ガッポガッポ稼いでいて、そんな心配しないでいいはずだと勝手に思っております。

画像を多く使いましょう

今までの話を全てやってきてるならば、ウェブページに画像を多く使っても構いません。

ネットの通信速度は上がっていきますし、早いうちに5Gもやってきます。画像を使うことは、必ずしも遅いとも言えなくなっています。それに、画像はあらゆる箇所でキャッシュが効きやすい。

画像を使わずCSSを多用して見栄えの良いデザインにすると、一見データ量が少ないので負担がないように感じますが、実際は端末のブラウザーがレンダリングをして画像を作っているので、端末のメモリとCPUパワーはかなり使います。

Apple社のウェブサイトのように、画像しかないようなページでも遅く感じないのは、そのような理由だと思います。

最後に

今までの話の骨子は、とにかくサーバー仕事を少なくするということです。ウェブサーバーはコンテンツの管理だけをさせます。代わりに周りの設備に配信の仕事を任せる、という考え方です。

今回、一億人のアクセスに耐えるサイトを作る、という話をさせていただきました。実際に私はまだそのような経験はありませんが、いずれ経験したいですね。