WEBサービスのサーバー構成とプログラミング
プログラムを書いて、日々WEBサービスの開発に取り組んでいると、特にプログラミングを始めたころは、「あれ?サーバーってどんな構成になるんだっけ?」と思う人も多いのではないでしょうか。
サーバー構成を意識しないでプログラムを書いていると、「あれ?保存したはずの画像が表示されない・・・」ということも起こる可能性があります。 それでは、どのようなWEBサーバー構成があって、何に気をつけなければいけないのかについて考えていきましょう。
どんなサーバー構成があるの?
WEBサービスを構成するサーバーにはさまざまなスタイルがありますが、まず一番シンプルな構成は、WEBサーバー(1台)・DBサーバー(1台)という構成ではないでしょうか。
ユーザーがWEBサービスにアクセスをすると、WEBサーバー1台でリクエストを処理し、DBへのアクセス・ユーザーへのレスポンスを返します。
社内のみで利用されるなど、利用範囲が限定されるサービスではこのような最小構成を取ることもありますが、アクセス過多になり、サーバーがダウンすると、サービスが継続できなくなるため、通常はこのような構成を取ることはあまりありません。
しかし、プログラミング初心者の方がイメージしているのはこのような構成が意外に多いものです。
この構成だとプログラムが作りやすいというメリットもあります。
次の例は、WEBサーバーを複数台用意し、ユーザーが初めにアクセスするのは、WEBサーバーではなく、ロードバランサーと呼ばれる負荷分散装置を通して間接的にWEBサーバーにアクセスするパターンです。
ロードバランサーは、アクセスしてきたユーザーをそれぞれのWEBサーバーにリクエストを振り分け、WEBサーバーに処理が集中しないようにするための装置です。
自分で用意するとなると、装置だけでも数百万円になるものもありますが、クラウド・VPSサーバーなどのインフラサービスでは、月数千円程度で使えるものも用意されています。
ハードウェアの購入・設置を自分(自社)で行うことを「オンプレミス」と言いますが、近年では、クラウドサービスを行なっている外部事業者のハードウェアを月額で利用する方法が主流となってきています。
WEBサービスへのアクセスが増えた場合には、WEBサーバーを増やす(スケールアウト)ことも行いやすく、公に公開するタイプのWEBサービスでは、このような構成が多く利用されています。
データベースへの負荷が多くなってきた際には、データベースサーバーの性能を上げる「スケールアップ」と呼ばれる方法が用いられます。データベースへのアクセスを分割する方法もありますが、データの整合性を保つ方法を考えていく必要があり、容易には選択しづらいというのが現状です。
サーバー構成によるプログラミングの注意点とは?
複数のWEBサーバー構成にした場合に問題になるのは、ユーザーからアップロードされた「画像」などのリソースの扱いです。
1つのWEBサーバーでは問題になりませんが、複数台のWEBサーバー構成にすると、WEBサーバーに画像などのリソースを保存すると、他のWEBサーバーにアクセスしているユーザーはリソースを利用できなくなってしまいます。
画像ファイルを保存するためのストレージサーバー
画像ファイルなどの共有リソースを保存するためのサーバーが「ストレージサーバー」ですが、もしWEBサーバーに画像などのリソースを保存してしまうと、互いのサーバーの画像ファイルを読みに行くことになりますが、通常WEBサーバー同士は分離されているためアクセスすることはできないようになっています。
このような場合はWEBサーバーとリソースを保存する「ストレージサーバー」の2つを用意し、画像などは全てストレージサーバーに保存するようにします。
このようにすることで、どのWEBサーバーからも画像ファイルにアクセスすることができるようになります。
実際にWEBサービスを開発し始めると思わぬ盲点となってしまう部分でもありますので、プログラマにもサーバー構成を意識したプログラミングが求められます。
WEBサーバーはサービス規模が大きくなるにつれてどんどん増えていくものですので、この構成であればWEBサーバーが増えてきたとしてもそれぞれのWEBサーバーから画像を読み込むことができるようになります。
他にも、ログインをした時のセッション情報等は、WEBサーバー側で持つことになりますが、アクセス毎に違うWEBサーバーにアクセスを振り分けられてしまっては、セッション情報を利用することが困難になってしまいます。
これを回避するためにはロードバランサー側で「セッション維持」設定を行うことが必要になってきます。
一度アクセスを割り振ったユーザーには継続的に同じサーバーにアクセスを行うようにすることで、セッション情報にアクセスをすることができるようになります。