サーバーとは何か?
英語の意味は、クライアント(客)に対してサービスを提供するのがサーバー(店)です。
プログラミングにおけるサーバーとは一つの役割をするコンピュータ(OS+ソフトウェア)のことを指します。
一つのコンピュータでWEB表示やDB機能を担う場合はサーバーは一つです。
〇〇サーバーと呼び名があるのは、負荷分散や運用効率化目的で各機能を切り出し、別々のコンピュータに役割を持たせているためです。
WEB3層構造(WEB3 architecture)
動的処理をするWEBサイトはWEB3層構造(3つのサーバー)を採用している場合が多いです。
通信の流れは以下のようになります。
クライアント(ブラウザ)
↓↑
WEBサーバー
↓↑
APサーバー
(↓↑)
DBサーバー
以下でそれぞれの役割についてまとめています。
WEBサーバー
↓:クライアントからの要求(リクエスト)をAPサーバーに伝える。
↑:ブラウザが理解できる静的HTMLを返す(レスポンス)。
APサーバー
↓:・WEBサーバーからのリクエストに沿って、DBにデータを要求する。
・ブラウザから受け取ったデータを元に処理する
↑: ・DBから受け取ったデータを、WEBサーバーに渡す。
・処理結果をWEBサーバーに渡す。
※データベースにアクセスする必要がない場合、AP⇔DB間の通信は発生しません。
DBサーバー
↓:APサーバーからのリクエストに沿ってデータを検出する。
↑:抽出したデータをAPサーバーに渡す。
開発時の各サーバーの組み合わせ例
あくまで一例ですが、各言語ごとのサーバーの組み合わせは以下のようになっています。
言語 | WEBサーバー | APサーバー | DBサーバー |
---|---|---|---|
Ruby | Apache, Nginx, | Puma, Unicorn, Sinatra, | MySQL, PostgresSQL, Redis, |
Java | ↑ | Tomcat | ↑ |
PHP | Apache | なし(Apacheが兼任) | ↑ |
Python | Apache, Nginx | Gunicorn | ↑ |
Python, Ruby, Go | Nginx unit | なし(Nginx unitが兼任) | ↑ |
APIサーバーとは何か?
上の3つのサーバーの他に「APIサーバー」と呼ばれるものも存在します。
APIとはアプリケーションの一部機能を外部に提供するものです。
例えば、仮想通貨の相場情報を公開しているcoindeskでは、bitcoinなど各通貨のリアルタイムの価格を第三者が取得できるようにしています。あるURLにアクセスするとそのデータがJSON形式で閲覧できます。
このように外部に提供するデータをAPIと呼び、APIのデータ供給機能(プログラム)を別サーバーで動かしている場合にそのサーバーのことをAPIサーバーと呼びます。
なお、外部APIサーバーを使用する場合は、自前のAPIサーバーは不要です。その場合、外部のAPIサーバーとの通信はAPサーバーが行う。
(補足)APIとライブラリとの違い
rubyやpythonなどのライブラリも、ひとまとまりの機能(プログラミング)という点では似ていますが、ライブラリはツールであり、APIのように結果を返すものではありません。
(補足)WebSocketとは何か?
開発でよく使う仕組みにWebSocket(WS)という通信規格があります。
WSを使うことで双方向通信ができるようになる。例えば、ソースコードを変更すると即座にWEBブラウザに変更内容が表示される仕組みがWSを利用したものです。
本番環境ではリアルタイムに変更を反映をする必要がないため、開発環境にのみWSを導入し、本番環境では使用しない場合が多いです。
WSの処理はAPサーバーで実施し、リアルタイムで更新した内容をWEBブラウザに渡します。
MVCとMVVMモデル
WEB3層構造と似ているが異なるアーキテクチャになっているものに、MVCとMVVMがあります。
MVCモデル
RubyのフレームワークであるRuby on Railsや、PHPのLaravelで使われているモデルです。
Model、View、Controllerの3つの役割でコーディングを分ける方法です。
- Model: 画面に表示や入力に関連しない処理(DB操作など)
- View: 画面に表示される内容
- Controller: ViewとModelを繋ぐ
MVVMモデル
Vue.jsやAnguler.jsで使われているモデルです。
Model, View, ViewModelの3つの役割に分かれています。
Model、ViewはMVCモデルと同じ、2つを結びつける機能としてView Modelを採用してます。
ViewModelを使うことで、裏側のデータ(Model)と画面の表示(View)をリアルタイムで繋げることができます。これをデータバインディングといいます。
データバインディングとは?
データバインディングしている場合、裏側のソースコード(Model)を変更すれば、その変更内容がViewにも反映されます。
双方向データバインディングの場合は、例えば、ユーザーがブラウザのテキストボックスに文字を入力すると、その内容を裏側のModelに反映することもできます。