はじめに
「webサーバー」「アプリケーションサーバー」という用語について、ページによって指しているものが異なっていたりして、「あれ、私の認識って間違っているの?」というような不安に駆られました。
そこで、本記事では、これら用語がどういった内容を指して使われているのか、目についた範囲でまとめました。
webサーバーとapplicationサーバー の基本的な説明
まずは、最もオーソドックスだと思われる定義を記載します。
webサーバー
webにおける様々な操作は、httpリクエストを介して行われます。このhttpリクエストを受け付け、clientにレスポンスを返すサーバーをwebサーバーと呼びます[1]。webサーバーを構築するために、サーバーにはwebサーバーソフトウェア (ミドルウェア) をインストールします。静的なコンテンツならば、webサーバーのみで配信ができます[2]。
webサーバーソフトウェアの代表例として、以下の2つが挙げられます。
- Apache Http Server (以降、誤解がない場合は、Apacheと記載する)
- Nginx
これらの違いは、以下のqiita記事を参照してください[3]。
アプリケーションサーバー
アプリケーションサーバーは、ビジネスロジックを有し、動的処理を実現するサーバーないしそのミドルウェアを指します[2,4]。
アプリケーションサーバー単体でも、HTTPリクエストを処理することは可能な場合もありますが、様々な事情・制約により([5]を参照)、webサーバー(ソフトウェア) で最初に処理を受け、その後に必要に応じてアプリケーションサーバー(ソフトウェア)に、という流れが一般的です。
(備考:利用言語ごとのアプリケーションサーバーの構築方法については、末尾の「参考」に記しました。)
webサーバーとアプリケーションサーバーの指すものの違い
前述のように、根本的には、Nginxの公式サイト[2]の記述するように、
- webサーバーは、HTTPリクエストを受け付け、静的コンテンツの配信が可能
- applicationサーバーは、動的な処理を実行するソフトウェアやそれを有する環境
というように解釈できます。
ただ、人によっては解釈に幅があります。以下にこれらの用語がどういう内容を示す場合があるのか、記します。
用語の利用として、どこまでが許容でどこからが間違えなのかは個々人の判断ですが、少なくともweb記事ではこれらの解釈が見られました、という話です。
理解のため、以下にwebサーバーとアプリケーションサーバーの図を記載しました。
上側は、1つのマシンが両方の機能を兼ねている場合 (もしくは、アプリケーションサーバー単体でどうにかする場合)を指します。
下側は、所謂web3層構造[6] に従って、2つを分離した場合です。
こちらの図と見つつ、以降の話を進めていきます。
webサーバー
以下の4つの事例が見られました。
注) 末尾のアルファベットは、アプリケーションサーバーの図内の(A)-(E) に対応します
- 静的なリクエストを配信するための専用サーバーもしくは構築に必要なミドルウェア自体を指す場合 (D)
- ApacheやNginxのインストールされたマシン内でこれらの担う担当範囲を指す場合 (B, D)
- ApacheやNginxがインストールされた、サーバー環境をさす場合 (A, D)
- webでの処理に関連するサーバー全体のざっくりとした総称 (A, D, E)
アプリケーションサーバー
以下の3つの事例が見られました。
- 動的なリクエストを配信するための専用サーバーもしくは構築に必要なミドルウェア自体を指す場合 (E)
- アプリケーションサーバーソフトウェアのインストールするマシンの中で、後者の担当範囲を指す場合 (C, E)
- アプリケーションの動くマシン全体を指す場合 (A, E)
3のことを、特にwebアプリケーションサーバーと呼んでいる場合もいるし、webアプリケーションサーバー = アプリケーションサーバーとみなしている場合もありました。
備考:言語ごとのアプリケーションサーバー
以下では、各言語においてアプリケーションサーバーがどのような環境で成り立つのか調べました。
Javaの場合
web上で動く、JavaアプリケーションをJava Servlet (以下、サーブレット) と呼ぶ。
似たような言葉で、Java Appletがあるが、これはクライアント側のブラウザで動くJavaアプリケーションを指す。ただし、JavaAppletは、Java11から廃止されている[7]。
サーブレットはそれ単体では動かず、それを動かすための規約を設定したミドルウェアが必要であり、これをサーブレットコンテナ (ウェブコンテナ) と呼ぶ。サーブレットコンテナには、tomcat, jetty, nettyなどが存在している[8]。
Javaの場合、このサーブレットコンテナ (e.g. tomcat) とサーブレット (e.g. javaプログラム) を合わせたものが、アプリケーションサーバーだと考えられます。
Node.jsの場合
Node.jsとは、「Chrome の V8 JavaScript エンジン で動作する JavaScript 環境」「Node.js はスケーラブルなネットワークアプリケーションを構築するために設計された非同期型のイベント駆動の JavaScript 環境」です[9]。
すなわち、Node.js本体でアプリケーションサーバーになるというよりかは、Node.jsおよびその環境で動くJavascript (最近ではTypescriptからの変換も多いですが) が、アプリケーションサーバーだと考えられます。
PHPの場合
PHPの場合は、アプリケーションサーバー用のソフトウェアは不要で、Apacheやnginxがあればよいとのこと[10]。
最後に
俺はこういう意味でつかっている、などありましたら、ご意見ください。
参考文献
[1] Jonathan Rasmusson 「初めての自動テスト」 O'Reilly Japan
[2] https://www.nginx.com/resources/glossary/application-server-vs-web-server/
[3] https://qiita.com/kamihork/items/49e2a363da7d840a4149
[4] https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%90
[5] https://qiita.com/tanayasu1228/items/11e22a18dbfa796745b5
[6] https://qiita.com/mk185/items/e914683410fd4ecaf0af
[7] https://xtech.nikkei.com/atcl/nxt/column/18/00294/051900003/
[8] https://techacademy.jp/magazine/17688
[9] https://nodejs.org/ja/
[10] https://www.sejuku.net/blog/96713