質問: 初歩的な質問です。 改めてapacheとtomcat、所為Webアプリケーションとは?的なことを勉強してます。 今の私の理解としてapacheとtomcat(で連携している場合)は以下のように認識しています。 ・apacheがリクエストを受け、tomcatに処理を依頼する ・tomcatでサーブレットを実行 ・apacheが結果をクライアントに返す めちゃくちゃざっくりと書いてしまいましたがこんな感じでしょうか。 お客さん(クライアント)の注文をレジ(apache)が聞き、厨房(tomcat)が調理して、レジがお客さんに渡す。 みたいな認識・・・あれ、例えられてます? すいません、逸れましたがそんな風に概要を理解しているのを前提として質問です。 tomcatは動的コンテンツが含まれない限り不必要なのでしょうか。(静的コンテンツのみの場合とか) 基本的にwebアプリケーションは言語関係なくWebサーバとサーブレットコンテナが仕事をしているのでしょうか。 また、apacheとtomcatの連携などそのあたりの詳細があるような参考サイトなどご存知でしたら教えて頂けたらと思います。
回答: > > tomcatは動的コンテンツが含まれない限り不必要なのでしょうか。(静的コンテンツのみの場合とか) > > > 静的コンテンツのみの場合は普通Tomcatは使わないと思いますが、Tomcatを用いて静的コンテンツを配信することは、やりたければやってもいいです。 > > 基本的にwebアプリケーションは言語関係なくWebサーバとサーブレットコンテナが仕事をしているのでしょうか。 > > > この辺、ちょっとややこしいです。 まず、サーブレットコンテナを含む用語として「アプリケーションサーバー」というものがあります。アプリケーションサーバーとは、要はアプリケーションを動かす機能をもったサーバーのことで、Tomcat(サーブレットコンテナ)は、Javaによるサーブレットアプリケーションを動かす機能を持つサーバーなので、アプリケーションサーバーの一種と言えます。 しかし、この定義ですと、Apacheにもアプリケーションを動かす機能がある(mod_phpなどによりその機能を追加できる)ので、Apacheもアプリケーション・サーバーの一種という言い方が可能です。現に、最近はApache上でPHPを動かしながら、その前面にNginxを用いる構成も一般的なので、Nginx=Webサーバー、Apache=アプリケーションサーバーという役割分担になることも珍しくありません。Apacheがアプリケーション・サーバーだと言われると私は違和感がありますが、そのように説明している記事もあります。 しかも、多くのアプリケーションサーバーは、単体でWebサーバーとしての機能を持っています。 つまり、Webサーバーとアプリケーションサーバーは固定的なものではなく、使い方によって、同じソフトウェアがWebサーバーになったり、アプリケーションサーバーになったり、場合によってはキャッシュサーバーになるわけです。 ややこしいですか? 頭が混乱してきませんか? では、Tomcatを使うのはどういう場合か。それは、「Javaにより開発されたWebアプリケーションを動作させる場合」です。使おうと思えば静的コンテンツをTomcatで配信できますが、Tomcatは大きなソフトウェアであり、取り扱いもApacheに比べて難しいので、わざわざTomcatで静的コンテンツのみを配信する動機がありません。 次に、TomcatとApacheを組み合わせて使う場合が多い理由についてです。 Tomcatが遅いから、と思っている人が多く、私も以前はそう思っていましたが、Tomcatハンドブック 第2版 という本には「静的コンテンツにおいてもApacheよりもTomcatの方が速い」と書いてあります。この本、実にTomcat愛に満ちた本でして、TomcatをApacheと組み合わせて使うなんてとんでもないことだ。Tomcatは完全なソフトウェアであり、Apacheで補完する必要などない、という論調だったと記憶しています。 手元に本がありませんが、上に書いたことは、以下のブログ記事に紹介されているので読んでみてください。 Tomcatのウェブサーバが、Apache httpdよりも高速に動作するという事実 | ミネルヴァの梟は黄昏とともに飛び始める(山下 大介 公式ブログ) この記事でも引用されていますが、Tomcatの欠点として、以下が挙げられています。 * Tomcatには、Apache httpdほど豊富な支援ソフトウェアが存在していない * Tomcatを熟知している人材は、Apache httpdを熟知している人材よりも少ない * Tomcatが提供している機能は、Apache httpdが提供している機能よりも少ない * Tomcatは、Apache httpdと比較して起動/停止時間が長い 加えて、今まで出てきていないポイントとして、「Tomcatは80 / 443ポートで待ち受けできない」という問題があります。やろうと思えばTomcatをrootで動かせばできる(そういうサーバーは世の中にあります)のですが、セキュリティ的に危険すぎるので、Tomcatは8080ポート等で待ち受けさせておいて、別の手段で80 / 443ポートで待ち受けします。代表的な方法がApacheを使うものですが、iptablesを使う方法もあります。最近だと、Apacheの代わりにNginxを用いる場合が多いと思います。 まとめると以下の通りです。 * ApacheもTomcatも、Webサーバーとしての機能とアプリケーションサーバーとしての機能の両方を備える * Tomcatを使うのは、JavaによるWebアプリケーションを動かす場合に限られると言って良い * Tomcatによる静的コンテンツ配信が遅いというのは誤解も含んでいるが、現実には静的コンテンツ配信はApache(あるいはNginx)を用いる場合が多い * ApacheはTomcatに比べて周辺の支援ソフトウェアが豊富なので、プログラムを作らなくても拡張モジュールだけでできることが多い(のでApacheが重宝される) * Tomcat単体では80 / 443ポートで待ち受けできないので、Apacheを用いて80 / 443で待ち受けする場合が多い(他の方法でも可能なのでApacheが必須とまでは言えない) * 最近は「高速なWebサーバー」としてのApacheの地位はNginxに奪われている