webサーバーやapplicationサーバーの指すものが人によって違う件

# はじめに
「webサーバー」「アプリケーションサーバー」という用語について、ページによって指しているものが異なっていたりして、「あれ、私の認識って間違っているの？」というような不安に駆られました。
そこで、本記事では、これら用語がどういった内容を指して使われているのか、目についた範囲でまとめました。

# webサーバーとapplicationサーバー の基本的な説明
まずは、最もオーソドックスだと思われる定義を記載します。

## webサーバー
webにおける様々な操作は、httpリクエストを介して行われます。このhttpリクエストを受け付け、clientにレスポンスを返すサーバーをwebサーバーと呼びます[1]。webサーバーを構築するために、サーバーにはwebサーバーソフトウェア (ミドルウェア) をインストールします。静的なコンテンツならば、webサーバーのみで配信ができます[2]。
![スライド1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319666/e611f820-9e3d-6191-5a99-3e4d27a4eb5c.png)


webサーバーソフトウェアの代表例として、以下の2つが挙げられます。
- Apache Http Server (以降、誤解がない場合は、Apacheと記載する)
- Nginx

これらの違いは、以下のqiita記事を参照してください[3]。

https://qiita.com/kamihork/items/49e2a363da7d840a4149



## アプリケーションサーバー
アプリケーションサーバーは、ビジネスロジックを有し、動的処理を実現するサーバーないしそのミドルウェアを指します[2,4]。
アプリケーションサーバー単体でも、HTTPリクエストを処理することは可能な場合もありますが、様々な事情・制約により([5]を参照)、webサーバー(ソフトウェア) で最初に処理を受け、その後に必要に応じてアプリケーションサーバー(ソフトウェア)に、という流れが一般的です。

(備考：利用言語ごとのアプリケーションサーバーの構築方法については、末尾の「参考」に記しました。)


# webサーバーとアプリケーションサーバーの指すものの違い
前述のように、根本的には、Nginxの公式サイト[2]の記述するように、
- webサーバーは、HTTPリクエストを受け付け、静的コンテンツの配信が可能
- applicationサーバーは、動的な処理を実行するソフトウェアやそれを有する環境

というように解釈できます。
ただ、人によっては解釈に幅があります。以下にこれらの用語がどういう内容を示す場合があるのか、記します。
用語の利用として、どこまでが許容でどこからが間違えなのかは個々人の判断ですが、少なくともweb記事ではこれらの解釈が見られました、という話です。

理解のため、以下にwebサーバーとアプリケーションサーバーの図を記載しました。
上側は、1つのマシンが両方の機能を兼ねている場合 (もしくは、アプリケーションサーバー単体でどうにかする場合)を指します。
下側は、所謂web3層構造[6] に従って、2つを分離した場合です。
こちらの図と見つつ、以降の話を進めていきます。

![スライド2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319666/eb101e01-dbad-d22d-909e-9c84960b8b81.png)

## webサーバー
以下の4つの事例が見られました。
注) 末尾のアルファベットは、アプリケーションサーバーの図内の(A)-(E) に対応します

1. 静的なリクエストを配信するための専用サーバーもしくは構築に必要なミドルウェア自体を指す場合 (D)
2. ApacheやNginxのインストールされたマシン内でこれらの担う担当範囲を指す場合 (B, D)
3. ApacheやNginxがインストールされた、サーバー環境をさす場合 (A, D)
4. webでの処理に関連するサーバー全体のざっくりとした総称 (A, D, E)

## アプリケーションサーバー
以下の3つの事例が見られました。

1. 動的なリクエストを配信するための専用サーバーもしくは構築に必要なミドルウェア自体を指す場合 (E)
2. アプリケーションサーバーソフトウェアのインストールするマシンの中で、後者の担当範囲を指す場合 (C, E)
3. アプリケーションの動くマシン全体を指す場合 (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