(0)目次&概説
(1) 記事の目的
(1-1) 目的
(1-2) 前提条件
(2) Tomcatの概要
(2-1) Tomcatとは?
(2-2) Tomcatアーキテクチャ概観
(3) Tomcatアーキテクチャ詳細
(3-1) 外接:Connector
(3-1-1) Connectorの概要
(3-1-2) Connectorの動作の仕組み
(3-1-3) Connectorの設定方法
(3-1-4) Connectorの各意味の定義
(3-1-5) AJPコネクタについて
(3-2) レイヤー1:Server
(3-3) レイヤー2:Service
(3-4) レイヤー3:Engine
(3-4-1) Engineの概要
(3-4-2) Engineの動作の仕組み
(3-4-3) Engineの各意味の定義
(3-5) レイヤー4:Host
(3-5-1) Hostの概要
(3-5-2) Hostの動作の仕組み
(3-5-3) Hostの各意味の定義
(3-6) レイヤー5:Context
(3-6-1) Contextの概要
(3-6-2) Contextの動作の仕組み
(3-7) レイヤー5:Valve
(3-7-1) Valveの概要
(1) 記事の目的
(1-1) 目的
Tomcatの全体アーキテクチャの概要と、各コンポーネントの概要を理解すること。今回はCentOS7にインストールされたTomcatを利用して理解を深めていきます。
(2) Tomcatの概要
(2-1) Tomcatとは?
・OSSのWebサーバ兼サーブレットコンテナで、Javaプログラムを実行するためのHTTPウェブサーバの役割を果たします。
・Java Servlet、JSP、Java EL、ウェブソケットなど多くのJava EE仕様を実装しています。
・Tomcatは”Pure Java”であるため(※特定OSや環境に依存しないJava標準仕様やAPIのみで作成)プラットフォームに依存せずに動作します。
(2-2) Tomcatアーキテクチャ概観
クライアントからWebサイトにRequestを送り、Responseがクライアントに返却されるまでの大まかな流れは下記の通りです。
(表)EndToEndの流れ
① | クライアント ⇒ Connector | HTTPリクエストが送信される(デフォルトは8080ポート宛て) |
② | Connector ⇒ Engine | Connectorがリクエストを受取り、Engineに連携する |
③ | Engine ⇒ Host | リクエストを解析して、適切なHostにディスパッチを行う |
④ | Host | Host(+Context)にてリクエストを処理 |
⑤ | Host ⇒ Engine | レスポンスをEngineに返却 |
⑥ | Engine ⇒ Connector | レスポンスをConnectorに返却 |
⑦ | Connector ⇒ Client | レスポンスをClientに返却 |
(図221)
(3) Tomcatアーキテクチャ詳細
(3-1) 外接:Connector
(3-1-1) Connectorの概要
(図311)
・各コネクタはTomcatがリクエストをリッスン(アクセス待ち待機)するポートと対応付いています(複数コネクタで同じポートはNG)。
・TomcatはデフォルトでHTTPコネクタを持っており、8080ポートからリクエストを待ち受けています。
・この理由からTomcatでホストするアプリのURLはデフォルトで「:8080」が含まれています。
(3-1-2) Connectorの動作の仕組み
③レスポンス結果(動的ウェブの処理結果画面)をポートに返却
(図312)①主な役割
(3-1-3) Connectorの設定方法
①server.xmlファイルを開く
cd $CATALINA_HOME/conf/ vi server.xml
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
(3-1-4) Connectorの各設定の意味
(表)
port | 8080 | リッスンするポートの番号です。 |
protocol | HTTP/1.1 | コネクタはHTTP/1.1の通信をサポートしています |
connectionTimeout | 20000 | 接続タイムアウトの指定で、アプリケーションのセッションは5時間33分20秒の間、操作されない場合に終了します。 |
redirectPort | 8443 | リクエストのうちSSL転送を要求するものは8443ポートへリダイレクトされます。 |
(3-1-5) AJPコネクタについて
・もしWebサーバと併用で使わない場合(TomcatをWebサーバ兼アプリサーバとして使う場合)や、Tomcat自体の処理速度に問題がない場合はコメントアウトも可能です(※現代のTomcatは十分に速い)
・コメントアウトする場合は「$CATALINA_HOME」配下のconfディレクトリ内のserver.xmlの該当行をコメントアウトします。
(例)コメントアウト例
<!-- Define an AJP 1.3 Connector on port 8009 --> <!-- <Connector protocol="AJP/1.3" address="::1" port="8009" redirectPort="8443" /> -->
(図315)
(3-2) レイヤー1:Server
Server要素(Element)自体はコンテナではない(Valve設定などが直接紐づく訳ではない)が、もっと大きな粒度でCatalinaのサーブレットコンテナそのもの及びその全体特性を表します(Tomcat自体のインスタンスに相当)
(表)Server要素の主要属性の説明
port | ・シャットダウンポートのコマンドを待ち受けるためのTCP/IPポート番号です。デフォルトでは「8005」に設定されています。 ・このような「シャットダウンポート」を設ける理由として「OSに依存しない、スクリプト可能な方法で」Tomcatのインスタンスを止めるためです。 ・Tomcatは汎用性を狙っており、もしシャットダウンポートを閉じてしまうと、OS特有のコードが必要となる可能性があります(少なくともWindowsとLinuxではやり方が異なってくる)。 |
shutdown | ・shutdown属性ではTomcatを停止するために受け取るべきコマンド引数文字列。 ・この文字列はTCP/IP経由でシャットダウンポートに送られます。 |
(例)
<Server port="8005" shutdown="SHUTDOWN"> <!-- 中略 --> </Server>
(図321)
(3-3) レイヤー2:Service
・Tomcatのデフォルトでは「Catalina」サービスがあり、HTTPコネクタとAJPコネクタをCatalinaエンジンと結びつけています。
(例)
<Service name="Catalina"> <!-- 中略 --> </Service>
(図331)
(3-4) レイヤー3:Engine
(3-4-1) Engineの概要
・別の言い方では、各リクエストの「エントリーポイント」(処理の開始地点)とも言えます。
・エンジンは一つ以上のHostと紐づく必要があり、Tomcatはデフォルトで「Catalina」エンジンを持っています(HTTPコネクタからの処理を対応)。
・エンジンはConnectorから受け取ったリクエストを解析(Httpヘッダの解析)して各Hostに処理をディスパッチし、結果を適切なコネクタにレスポンスとして返却します。
<Engine name="Catalina" defaultHost="localhost"> <!-- 中略 --> </Engine>
(図341)
(3-4-2) Engineの動作の仕組み
①Connectorから受け取ったリクエストを解析し(HTTPヘッダのHost情報を確認し)、適切なHostに割り振ります。
②HostからのレスポンスをConnectorに返却します。
(図342)エンジンの概要図
(3-4-3) Engineの各意味の定義
(表)Engineの各項目の意味
defaultHost | ・設定ファイルに存在しないホスト名を指定したリクエストが来た場合に処理を担当するデフォルトのホスト名を指定します。 ・ここで指定したホスト名は内側のHost要素のいずれかの名前とマッチする必要があります。 |
jvmRoute | ・負荷分散でSession Affinity(≒Sticky Session)をする際に利用します。 ・Sticky Sessionとは同一ユーザから来る全てのHTTPリクエストを同一のアプリケーションのインスタンスに紐づける技術です。 |
(3-5) レイヤー4:Host
(3-5-1) Hostの概要
・デフォルトで「localhost」は登録されており、Windowsでのhostsファイルを編集せずとも利用可能になっています。
C:\Windows\System32\drivers\etc\hosts
(3-5-2) Hostの動作の仕組み
DNSサーバに「IPアドレス」と「ドメイン」の紐づけを実施した状態で、ブラウザからリクエストを受けると、HTTPヘッダーの中にある「Host: XXXX.com」のようなレコードを見て、どのHostにリクエストを振り分けるか?を判断しています。
(図351)
(3-5-3) Hostの各意味の定義
(表)Hostの各項目の意味
属性 | 設定概要 | 設定値 |
appBase | ・アプリケーションが存在するベースのディレクトリ情報を保持しており、この情報を使って各アプリケーションを認識しています。 ・「ROOT」は空の文字列が割り当てられており、それは「localhost」のベースディレクトリが「$CATALINA_HOME\webapps\ROOT\」である事、URLが「http://localhost:8080/」である事を意味しています。 |
(例) $CATALINA_HOME\webapps\ROOT\ →http://localhost:8080/ $CATALINA_HOME\webapps\webapps\rainbow\ |
unpackWARs | ・appBaseで指定したディレクトリにWARファイルを配置した際に、それをTomcatで自動的にフォルダに展開するかどうか?の設定です。 ・Trueに指定した場合は自動で解凍を行います。 ・Falseにすると実行時にWarファイルを直接実行(=実行時に解凍も同時に行う)するため処理が遅くなる |
(例) 「true」または「false」 |
autoDeploy | ・Tomcatが起動時に、appBaseで指定したディレクトリにアプリケーションを投下すると、自動でデプロイされる | (例) 「true」または「false」 |
(3-6) レイヤー5:Context
(3-6-1) Contextの概要
・各ウェブアプリケーションはWARファイル形式か、必要なコンテンツ(html等)を含んだディレクトリになります。
・Catalina(コンテナ)はHTTPリクエストのURI情報とpath情報を比較して、どのContextを実行するかを決定します。
・実行するContextが決まると、/WEB-INF/web.xmlの内容を見て、どのサーブレットにリクエストを処理させるか?を判断します。
(3-6-2) Contextの動作の仕組み
(3-7) レイヤー5:Valve
(3-7-1) Valveの概要
(図371)