サーバーの話じゃなくてコンテンツな話だけど、ウェブサイトへのアクセスについて、分かりづらいかなぁと感じる事があったので、ちょっと調べながらメモってみた。
たとえば、でかい画像とか動画なんかはサーバーへの負荷とかデータの転送量をだいぶ食うので、別のサーバーに分散させて置いてたとします。
・htmlテキストを置いているのをサーバーA
・画像や動画のバイナリデータを置いているのをサーバーB
htmlテキストの書き方の例を出すと、サーバーAのhtmlにimg srcタグなんかで、サーバーBのバイナリのURLを書いたりとかしますね。
とすると、サーバーAにアクセスしたら、サーバーBのアクセスログにもログは残るというのはイメージできると思いますが、そのアクセス元にはサーバーAのIPアドレスが残るんじゃないかなって思ってたら、それは間違いです。
サーバーAにもサーバーBにも同じアクセス元が残るので、実際にログを見てみると。
サーバーA
119.241.***.*** - - [04/Aug/2014:00:47:17 +0900] "GET / HTTP/1.1" 200 118 "-" "Firefox"
サーバーB
119.241.***.*** - - [04/Aug/2014:00:47:18 +0900] "GET /jpeg.jpg HTTP/1.1" 200 1299069 "http://www.hogehoge.net/" "Firefox"
と、こんな風になりまして、アクセス元は同じで、ウェブサイトを見に来た人のIPアドレスがログに残ります(普通は)。サーバーAのIPというかドメインがどうなるかというと、サーバーBのアクセスログにはリファラーとして記録されます。
なので、ウェブサイトからの呼び出しのアクセスだけを許したいだとか、直リンクとかを防ぎたい場合はリファラーでアクセス制限をする必要がある。
例を出すと、サーバーBのバイナリデータを置いているディレクトリか、その上の階層に拒否のための.htacessなんかを配置する。
SetEnvIf Referer "^http://www\.hogehoge\.net" ref_ok order deny,allow deny from all allow from env=ref_ok
あるある的な、間違えるかもしれない例として、サーバーBに、サーバーAのIPアドレスだけ許可する設定をしても意味がないということです、ミドルウェアなんかはそういう設定の仕方は多いけど。
この辺をちゃんとしていないと、せっかく負荷分散しても、クローラーとかもガンガン来るし、余計なアクセスが起こってしまって、それがまたサーバーへの無駄な負荷になってしまうので気を付けよう。
以上のことを踏まえると、なにもサーバーサイドで負荷分散していなくても、htmlテキストの書き方とか、画像や動画のバイナリデータの分散のやりかたで、コンテンツ側だけでも十分に負荷分散は可能だという事だ。
最近はPHPとかのプラグインがキャッシュを作って、アクセスを軽くさせるものが多いようだけど、サーバーが積んでるメモリ量とか、メモリを使っている容量を把握して、うまくキャッシュのセットアップしないと、余計に重たくなったりしちゃうかもしれない。
SSDなら関係ないけど。
だから、HDDの共用サーバーとかだとそういうプラグインで負荷分散するのではなくて、バイナリデータを別のサーバーに置く方が効果は高いかなぁと思う。
あと、ちょっと別の話になるけど、他に可能性の問題としてどういう事があるかというと、サーバーAにサーバーBのバイナリを読み込みをするリンクが記述されていた場合は問答無用でブラウザは読み込んでしまうという事で。
ウェブアクセスもチェックしているウィルススキャンを入れとかないと、それが悪性のファイルだったりするとウィルスやスパイウェアに感染してしまうわけだね。
そんな感じです。