なぜAPサーバーをWebサーバーとして利用しないのか

# はじめに

よく聞く話として、「Web３層構造に分けよう」というものがある。Webサーバー、APサーバー、データベースだったと思う。そこで、こんな疑問が生じた。「APサーバーでもHTTPリクエストの処理ができるなら、なんでWebサーバーが必要になるんだ？」と。調べた。


# 目次

1. Webサーバーとは？
2. APサーバーとは？
3. WebサーバーとAPサーバーを分けるもう１つの理由

# Webサーバーとは？

まずWebサーバーとして、ApacheとNginxの２つが挙げられることが多い。この２つについて理解する。次の記事を読んでみて欲しい。

　１. [ApacheとNginxについて比較](https://qiita.com/kamihork/items/49e2a363da7d840a4149)
　２. [Nginxのアーキテクチャを理解する](https://qiita.com/kamihork/items/296ee689a8d48c2bebcd)

1つ目の記事では、Apacheがマルチプロセスのプロセス駆動アーキテクチャであること、Nginxがシングルスレッドモデルのイベント駆動アーキテクチャであることがわかる。

２つ目の記事では、その仕組みについて図を通して利用されている。

ここで、スレッドとプロセスってなんだったっけ？となる場合、次の記事を参考にしてみて欲しい。

　３. [【図解】CPUのコアとスレッドとプロセスの違い・関係性、同時マルチスレッディング、コンテキストスイッチについて](https://milestone-of-se.nesuke.com/sv-basic/architecture/cpu/)

ここで大事なのは、

>
CPUコアとは実際に命令を行う部品のことで、SMT登場前においては
>
『CPUコア数＝同時に実行できる命令の数』
>
でした。
>
実行中のプログラムは『プロセス』と呼ばれ、プロセスは 1 つ以上の『スレッド』を持ちます。このスレッドが CPU コアに命令を与えますので、 CPU コア数 ＝ 同時実行できるスレッド数 でした。

Apacheは、マルチプロセスのプロセス駆動アーキテクチャーであるから、**HTTPリクエストとプロセスが1対1で対応する。結果、プロセス数の上限以上のリクエストを同時に処理することができなくなる。**

Nginxは、そもそもがシングルスレッドモデルのイベント駆動アーキテクチャーであるから、**プロセスが増えない。**その結果、C10K問題を回避することができるというもの。

ノンブロッキングIOに関する個人的に分かりやすかった資料。

４.[Apacheコミッターが見た、 Apache vs nginx](https://openstandia.jp/pdf/140228_osc_seminar_ssof8.pdf)
５.[Nginxが早い理由について調べた（基礎）](https://blog.framinal.life/entry/2015/09/13/195121)

ここまでで重要なこととしては、**プロセスやスレッドの管理がHTTPリクエストを捌く上で肝心である。**ということです。

本題のAPサーバーについて、入っていきます。

# APサーバーとは？

Apache TomcatやNode、Puma、Unicornなどの**HTTPリクエストから動的コンテンツを生成し、レスポンスとして返す機能を持ったサーバーです。**

Web３層構造の各層の説明の参考
　６. [ミドルウェア(Web、AP、DB)について知ろう](https://thinkit.co.jp/article/11837)

先ほどの記事で、APサーバーがどんなことをするのかは知ってもらえたかと思います。ここで気になるのが、「Apache TomcatやNodeなどでもHTTPリクエストの処理はできたのに、なぜWebサーバーが必要になるんだ？」というところです。答えは次の記事に載っています。Nodeのついての例となっていますが、後からApache Tomcatの方にも触れていこうと思ってます。

APサーバーをWebサーバーのように利用しない理由
　７. [いまさら聞けないNode.js](https://knowledge.sakura.ad.jp/24148/)

読んでもらうとわかることとしては、「C10K問題が解決できるのであれば使える可能性がある。しかし、そのためには多くの課題がある。」ということです。

個人的に、重要だと思っているのは、
>
リソースを回収してくれない
>>
マルチプロセス方式では、リクエストの処理が終わった時点で（＝プロセスが終了した時点で）使っていたリソース（メモリーやファイルなど）が自動的に解放されるので、リソースの解放についてプログラマーがあまり意識する必要はありません。
>>
一方、Node.jsでは自動的に解放されないので、明示的に解放しておかないと使われないリソースがどんどん溜まってリソースが枯渇し、新しいリクエストを処理できなくなります。
>>
これもシングルプロセスがゆえの問題です。

というところです。いわゆる、**メモリーリーク**というやつですね。

## APサーバーとプロセス数

先ほどまでのところで、NodeがWebサーバーとして適していないことは少し理解してもらえたかもしれません。しかし、Tomcatについては触れていなかったので、ここで触れます。

APサーバーをWebサーバーとして使わないもう１つの理由としては、コネクションの上限があると思います。Tomcatの例を載せます。

　８. [【真夏の夜のミステリー】Tomcatを殺したのは誰だ？ (1/3)](https://www.atmarkit.co.jp/ait/articles/0708/27/news098.html)

ここからわかることとしては、APサーバーにはデフォルトで接続の上限が決められているということです。Nodeも同様です。

　９. [NodeJSでの同時接続数について](https://teratail.com/questions/57229)
１０. [server.maxConnections](https://nodejs.org/api/all.html#net_server_maxconnections)

**Webサーバーに対しては、不特定多数から多くの接続をされることがあります。その際にAPサーバーでリクエストを捌くと不十分な場合が多いということなんですね。**

# WebサーバーとAPサーバーを分けるもう１つの理由

セキュリティも理由としてあるそうです。

１１. [WebサーバーとAPサーバの分離について](https://ja.stackoverflow.com/questions/18417/webサーバーとapサーバの分離について)
１２. [公開Webサーバ](https://www.ipa.go.jp/files/000025497.pdf)

# おわりに

Webサーバーを用意しなければいけない理由がわかっていませんでした。調べてみた結果、さらに深めるきっかけやキーワードが増えたので、もっと色々なことを知ることができると面白そうですね。

# おまけ

おもしろそうな記事：
１. [2015年Webサーバアーキテクチャ序論](https://blog.yuuk.io/entry/2015-webserver-architecture)
２. [NGINXのパフォーマンスをスレッドプールで9倍にする](https://fa-works.com/blog/thread-pools-boost-performance-9x)
３. [Node.jsでのJavaScriptメモリリークを発見するための簡単ガイド](https://postd.cc/simple-guide-to-finding-a-javascript-memory-leak-in-node-js/)

Nginxの補足：[Nginxの仕組みについて入門](https://blog.mosuke.tech/entry/2016/06/04/180122/)

SMTについて：[【図解】ハイパースレッディング(SMT)の仕組み～メリットとデメリット、悪影響や脆弱性などの問題について～](https://milestone-of-se.nesuke.com/sv-basic/architecture/hyper-threading-smt/)

メモリーリークの補足：[メモリリーク (memory leak)](https://wa3.i-3-i.info/word16066.html)