ApacheとTomcatの違いとなぜ連携させる必要があるのか
掲載日:2021年1月1日
INFOMARTION > ApacheとTomcatの違いとなぜ連携させる必要があるのか
概要
私が新人時代に先輩に聞いたり、ネットで調べてもいまいち納得できる答えが見つからなかった、ApacheとTomcatの違いとなぜ連携させる必要があるのかについて記載したいと思います。ApacheはWebサーバ(静的処理を実行)でTomcatはサーブレットコンテナ(動的処理を実行)だからと言われることもありますが(私も新人時代に先輩にいわれましたが)、Tomcatも良く調べるとWebサーバの機能があります。じゃあ、Tomcatだけで良いじゃんと思ってしまうと思います。そうすると、結局なぜ「ApacheとTomcatはなんで連携させる必要があるか」の疑問に戻ってしまいます。そんな方のためにも、ApacheとTomcatの違いとなぜ連携させる必要があるかについて説明したいと思います。
目次
1. ApacheとTomcatを連携させる理由
最初に結論を述べさせていただくと、役割の専門性の違いです。ApacheはWebサーバの機能に特化していて、TomcatはJavaを使った動的処理に特化しています。
専門性の違いと書いた理由としては、Tomcat自体にもWebサーバとしての機能が備わっているためです。少し極論になってしまいますが、ApacheとTomcatを連携させているシステムがあったとして、ほぼ同じシステムをApacheだけ、Tomcatだけで実現することも不可能では無いと思っています。
1-1. 専門性の違いとは
役割の専門性の違いを考える上で、いきなりApacheとTomcatで比較するため、理解が難しくなっているように感じています。TomcatとDBサーバで考えると分かりやすいと思います。 極論になってしまいますが、DBサーバを立てなくてもTomcatだけでアプリを作成することは可能です。例えばxmlやpropertyにユーザ情報を管理して、その情報を元にログイン認証するアプリを作成出来ると思います。 しかし、実際は一般的なWebシステムを見ると、ユーザ情報はDBで管理して、TomcatからDBサーバへデータ参照しているシステムがほとんどだと思います。 なぜかと考えると、その方が効率良くアプリ開発ができるからです。
たまに、ApacheとTomcatの連携に関して「メリット」「デメリット」を説明している人もいますが、これはメリット、デメリットの話ではないです。TomcatとDBサーバを連携させる「メリット」「デメリット」を聞かれても役割がそもそも違うと答えると思います。ApacheとTomcatも同様でそもそも役割が違います。
1-2. Apacheとは
役割が違うということを記載しましたが、ではApacheとTomcatの役割とは何なのかについて説明したいと思います。
改めてですが、Apacheとは正式名称は「Apache HTTP Server」です。ApacheはWebサーバですが、端的に役割を説明すると、リクエストを解析する役割です。
具体的には以下となります。
- 特定IPアドレスの場合フィルタ(リクエストを許可/拒否)する
- 特定URLの場合リダイレクトさせる
- 特定URLの拒否
- SSL化による通信の暗号化
- リクエストに応じて特定のサーバへ処理を振り分ける
上記は一例で他にももっと機能はありますが、要はユーザから受け付けたリクエストをどうやってさばくかがApache(Webサーバ)としての役割となります。
具体的にリクエストを元にどのようなレスポンスを作るかはTomcatの仕事となります。勘違いしないで欲しいポイントとしては、Apacheではレスポンスを作ってはいけないということではありません。TomcatがDBサーバと連携していても、Tomcat側で簡単なデータ(メッセージ一覧など)を保持するのと同様に、Apacheでも簡単なレスポンスであれば動的なページを実装するのも問題ありません。要は何が一番効率よく処理ができて、綺麗に管理できるかがポイントです。
1-3. Tomcatとは
Tomcatの正式名称は「Apache Tomcat」です。Tomcatはサーブレットコンテナですが、端的に役割を説明すると、リクエストを元に動的処理をする役割です。
具体的には以下となります。
- リクエスト情報を元にデータを登録する
- リクエスト情報を元に動的ページを作成しレスポンスを作成する
- リクエスト情報を元にユーザを判定し、ユーザごとに異なるレスポンスを作成する
基本的に固定ページでないページをユーザへ返す場合はTomcatの仕事となります。
こちらも勘違いしないで欲しいポイントとしては、Tomcatに静的ページ(htmlなど)を置いてはいけないということではありません。htmlを全てTomcat側で管理する設計思想となっているチームであれば静的ページですがTomcatへ置いても問題ありません。こちらの場合も、要は何が一番効率よく処理ができて、綺麗に管理できるかがポイントです。
2. Apacheの機能
Apacheの機能についていくつか紹介したいと思います。Apacheはモジュール(処理がパッケージ化されたファイル)がたくさん用意されています。モジュールを読み込んで、必要な設定値を記載するとその機能を使うことができます。どのようなモジュールがあるか記載したいと思います。
2-1. リクエストの同時並行処理をする機能
「mpm_prefork_module」というモジュールが該当のモジュールとなります。他にも機能はほとんど同じですが「mpm_worker_module」「mpm_event_module」などもあります。
以下の様な値を設定します。
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 250
MaxConnectionsPerChild 0
</IfModule>
この様に記載すると、サーバ起動時は「5」プロセス立ち上げ同時に「5」並行処理が可能となり、リクエストが大量に来た際は「250」まで並行処理が可能となります。
2-2. リクエストURLの書き換え
「rewrite_module」というモジュールが該当のモジュールとなります。
以下の様な値を設定します。
<IfModule rewrite_module>
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>
この様に記載すると、httpでリクエストが来た場合、httpsでリクエストをし直すようにユーザへ返します。
2-3. IPアドレスによるアクセス制御
こちらはモジュールと少し異なりますが、IPアドレスによるアクセス制御となります。
以下の様に記載すると「1.0.16.0/20」「1.0.64.0/18」「1.1.64.0/18」以外のIPからアクセスできなくなります。
<Directory />
order deny,allow
deny from all
allow from 1.0.16.0/20
allow from 1.0.64.0/18
allow from 1.1.64.0/18
</Directory>
3. Tomcatの機能
Tomcatの機能について説明したいと思います。
3-1. Javaを使った動的にWebページを返す機能
Tomcatの専門性は「Javaを使った動的にWebページを返す機能」につきると思います。一般的にJavaの処理は全て自分で作らず、色々な団体が作っているJavaのライブラリ(Apacheで言うモジュール)と連携して使用します。
- ユーザのリクエストパラメータを元に動的にレスポンスを生成する
- ログファイルを特定フォーマットで出力する
- エクセルファイルを作成、編集する
- zipファイルがパスワード付きか判定する
上記の様な複雑な処理をライブラリを入れて、ライブラリを呼び出すだけで実現することが可能です。Tomcatの役割はこういった複雑な処理を簡単に実装できることだと思います。
4. 考察
ApacheとTomcatの違いは、「役割の専門性の違い」であると説明させていただきましたが、Apache(Apache HTTP Server)もTomcat(Apache Tomcat)も同じApacheソフトウェア財団が作成しています。「ApacheはC言語」「TomcatはJava」で書かれていて言語が違うのも理由かもしれませんが、1つにまとめないのは役割が違うからではないかと思います。
Tomcatのホームページ(http://tomcat.apache.org/)を見ると結構、Webサーバとしての機能も充実していました。
- SSL/TLS(通信の暗号化機能)
- SSI(HTMLの中に別のHTMLを埋め込む機能)
- Rewrite(URLの書き換え機能) などなど
ApacheはWebサーバとして高性能だが、使わない機能も多いので、ApacheがなくてもTomcatだけで独立して動かせるようにApacheソフトウェア財団がしているのかもしれません。しかし、やはり細かいリクエストの制御が必要な場合はApacheを入れてあげた方が良いのではないかと思います。
5. まとめ
ApacheとTomcatの違いとなぜ連携させる必要があるのかについて記載させていただきました。
TomcatがWebサーバとしての機能が充実しているため、この疑問の答えが分かり辛くなっている様に思いました。あくまでもTomcatのWebサーバとしての機能はメインではない(Webサーバとしての専門性には特化していない)ということを念頭にApacheとTomcatの連携について考えてみると良いと思います。
最後までご覧いただきありがとうございました。