はじめに
よく聞く話として、「Web3層構造に分けよう」というものがある。Webサーバー、APサーバー、データベースだったと思う。そこで、こんな疑問が生じた。「APサーバーでもHTTPリクエストの処理ができるなら、なんでWebサーバーが必要になるんだ?」と。調べた。
目次
- Webサーバーとは?
- APサーバーとは?
- WebサーバーとAPサーバーを分けるもう1つの理由
Webサーバーとは?
まずWebサーバーとして、ApacheとNginxの2つが挙げられることが多い。この2つについて理解する。次の記事を読んでみて欲しい。
1. ApacheとNginxについて比較
2. Nginxのアーキテクチャを理解する
1つ目の記事では、Apacheがマルチプロセスのプロセス駆動アーキテクチャであること、Nginxがシングルスレッドモデルのイベント駆動アーキテクチャであることがわかる。
2つ目の記事では、その仕組みについて図を通して利用されている。
ここで、スレッドとプロセスってなんだったっけ?となる場合、次の記事を参考にしてみて欲しい。
3. 【図解】CPUのコアとスレッドとプロセスの違い・関係性、同時マルチスレッディング、コンテキストスイッチについて
ここで大事なのは、
CPUコアとは実際に命令を行う部品のことで、SMT登場前においては
『CPUコア数=同時に実行できる命令の数』
でした。
実行中のプログラムは『プロセス』と呼ばれ、プロセスは 1 つ以上の『スレッド』を持ちます。このスレッドが CPU コアに命令を与えますので、 CPU コア数 = 同時実行できるスレッド数 でした。
Apacheは、マルチプロセスのプロセス駆動アーキテクチャーであるから、HTTPリクエストとプロセスが1対1で対応する。結果、プロセス数の上限以上のリクエストを同時に処理することができなくなる。
Nginxは、そもそもがシングルスレッドモデルのイベント駆動アーキテクチャーであるから、**プロセスが増えない。**その結果、C10K問題を回避することができるというもの。
ノンブロッキングIOに関する個人的に分かりやすかった資料。
4.Apacheコミッターが見た、 Apache vs nginx
5.Nginxが早い理由について調べた(基礎)
ここまでで重要なこととしては、**プロセスやスレッドの管理がHTTPリクエストを捌く上で肝心である。**ということです。
本題のAPサーバーについて、入っていきます。
APサーバーとは?
Apache TomcatやNode、Puma、UnicornなどのHTTPリクエストから動的コンテンツを生成し、レスポンスとして返す機能を持ったサーバーです。
Web3層構造の各層の説明の参考
6. ミドルウェア(Web、AP、DB)について知ろう
先ほどの記事で、APサーバーがどんなことをするのかは知ってもらえたかと思います。ここで気になるのが、「Apache TomcatやNodeなどでもHTTPリクエストの処理はできたのに、なぜWebサーバーが必要になるんだ?」というところです。答えは次の記事に載っています。Nodeのついての例となっていますが、後からApache Tomcatの方にも触れていこうと思ってます。
APサーバーをWebサーバーのように利用しない理由
7. いまさら聞けないNode.js
読んでもらうとわかることとしては、「C10K問題が解決できるのであれば使える可能性がある。しかし、そのためには多くの課題がある。」ということです。
個人的に、重要だと思っているのは、
リソースを回収してくれない
マルチプロセス方式では、リクエストの処理が終わった時点で(=プロセスが終了した時点で)使っていたリソース(メモリーやファイルなど)が自動的に解放されるので、リソースの解放についてプログラマーがあまり意識する必要はありません。
一方、Node.jsでは自動的に解放されないので、明示的に解放しておかないと使われないリソースがどんどん溜まってリソースが枯渇し、新しいリクエストを処理できなくなります。
これもシングルプロセスがゆえの問題です。
というところです。いわゆる、メモリーリークというやつですね。
APサーバーとプロセス数
先ほどまでのところで、NodeがWebサーバーとして適していないことは少し理解してもらえたかもしれません。しかし、Tomcatについては触れていなかったので、ここで触れます。
APサーバーをWebサーバーとして使わないもう1つの理由としては、コネクションの上限があると思います。Tomcatの例を載せます。
8. 【真夏の夜のミステリー】Tomcatを殺したのは誰だ? (1/3)
ここからわかることとしては、APサーバーにはデフォルトで接続の上限が決められているということです。Nodeも同様です。
9. NodeJSでの同時接続数について
10. server.maxConnections
Webサーバーに対しては、不特定多数から多くの接続をされることがあります。その際にAPサーバーでリクエストを捌くと不十分な場合が多いということなんですね。
WebサーバーとAPサーバーを分けるもう1つの理由
セキュリティも理由としてあるそうです。
11. WebサーバーとAPサーバの分離について
12. 公開Webサーバ
おわりに
Webサーバーを用意しなければいけない理由がわかっていませんでした。調べてみた結果、さらに深めるきっかけやキーワードが増えたので、もっと色々なことを知ることができると面白そうですね。
おまけ
おもしろそうな記事:
1. 2015年Webサーバアーキテクチャ序論
2. NGINXのパフォーマンスをスレッドプールで9倍にする
3. Node.jsでのJavaScriptメモリリークを発見するための簡単ガイド
Nginxの補足:Nginxの仕組みについて入門
SMTについて:【図解】ハイパースレッディング(SMT)の仕組み~メリットとデメリット、悪影響や脆弱性などの問題について~
メモリーリークの補足:メモリリーク (memory leak)