Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

Tomcat

Tomcatのアーキテクチャ概要と各コンポーネントの役割について

投稿日:2020年6月28日 更新日:

(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の概要
・コネクタはクライアントとの通信の窓口を担当する部品です(「Coyote」と呼ばれる)。
・コネクタを設定する事でCatalina(Tomcatのサーブレットコンテナ)はリクエストを受けて、適切なウェブサイトに振り分けたり、生成された動的なコンテンツをコネクタ経由で返却したりと、ウェブサイトの論理的な入出力(リクエスト/レスポンス)を管理する事ができます。
・コネクタには複数の種類があり、HTTP通信を処理する「HTTPコネクタ」や、Tomcatと他Webサーバを接続する際に用いる「AJPコネクタ」(Apache Jserv Protocol)などがあります。

(図311)

・各コネクタはTomcatがリクエストをリッスン(アクセス待ち待機)するポートと対応付いています(複数コネクタで同じポートはNG)。
・TomcatはデフォルトでHTTPコネクタを持っており、8080ポートからリクエストを待ち受けています。
・この理由からTomcatでホストするアプリのURLはデフォルトで「:8080」が含まれています。

目次にもどる

(3-1-2) Connectorの動作の仕組み
コネクタのシステム観点での主な役割は次の3点です。
①特定ポートからのリクエストをリッスン(アクセス待ち待機)
②リクエストがあればエンジンに連携
③レスポンス結果(動的ウェブの処理結果画面)をポートに返却

(図312)①主な役割

各コネクタはTomcatがリクエストをリスン(アクセス待ち待機)するポートと対応付いています(複数コネクタで同じポートはNG)。アプリケーションの全てのリクエストは同一のConnectorのインスタンスを通過します。新規のリクエストはそれぞれ新規スレッドのインスタンス化を行い、リクエストが存続する間はコネクタ内にて存続します。
 
(3-1-3) Connectorの設定方法
Tomcatのコネクタ(Connector)をはめとするアーキテクチャ設定はserver.xmlというXMLファイルにて定義されています。

①server.xmlファイルを開く

cd $CATALINA_HOME/conf/
vi server.xml
(図313)①server.xmlを開く

②コネクタに関する設定を確認
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
(図311)②標準コネクタ(8080ポート)

目次にもどる

(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コネクタについて
・Tomcatには動的Webページのみを処理させて、静的なページは純Webサーバ(例:Apacheなど)に処理させる事で、処理効率を最大限に向上させるものです。
・もし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

・サービスは「サーバ」の中にある中間部品で、N個のコネクタを1つのエンジンに接続させる役割を持ちます。
・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の概要
・HostはTomcatがホストするアプリのドメイン名の集合です(例:www.rainbow-engine.com)
・ドメイン名が利用可能になるためには、DNSサーバ側でIPアドレスと紐づけを行う必要があります。
・デフォルトで「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\
→http://localhost:8080/rainbow/

unpackWARs ・appBaseで指定したディレクトリにWARファイルを配置した際に、それをTomcatで自動的にフォルダに展開するかどうか?の設定です。
・Trueに指定した場合は自動で解凍を行います。
・Falseにすると実行時にWarファイルを直接実行(=実行時に解凍も同時に行う)するため処理が遅くなる
(例)
「true」または「false」
autoDeploy ・Tomcatが起動時に、appBaseで指定したディレクトリにアプリケーションを投下すると、自動でデプロイされる (例)
「true」または「false」

目次にもどる

(3-6) レイヤー5:Context

(3-6-1) Contextの概要
・Context要素は仮想ホスト内でホストされている「ウェブアプリケーション」に対応しています。
・各ウェブアプリケーションはWARファイル形式か、必要なコンテンツ(html等)を含んだディレクトリになります。
・Catalina(コンテナ)はHTTPリクエストのURI情報とpath情報を比較して、どのContextを実行するかを決定します。
・実行するContextが決まると、/WEB-INF/web.xmlの内容を見て、どのサーブレットにリクエストを処理させるか?を判断します。
・「$CATALINA_HOME\webapps\」にある「ROOT、docs、examples、host-manager、manager」です。
 
(3-6-2) Contextの動作の仕組み
①Contextインスタンスの作成
Tomcatはアプリケーションのロード時に自動でこの「Conext」のインスタンスを作成します。
 
②web.xmlの反映
また設定の一環で「\WEB-INF\web.xml」にて定義された設定をアプリケーションに適用する役割を果たします。

目次にもどる

(3-7) レイヤー5:Valve

(3-7-1) Valveの概要
・リクエストがアプリケーションに到達する前にインターセプト(割り込み)し、リクエストに対して何か前処理を行う場合に利用する機能です。
・技術的にはJavaクラスのインスタンスを特定のCatalinaコンテナに紐づけており、そのクラスがリクエストの前処理を行っています。
・バルブ(Valve)の役割を担うクラスは以下2つのいずれかの条件を満たす必要があります。
①「org.apache.catalina.Valve」インターフェイスを実装する
②「org.apache.catalina.valves.ValveBase」クラスを継承する

 

(図371)

目次にもどる

Adsense審査用広告コード


Adsense審査用広告コード


-Tomcat

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

Tomcatの起動時のエラー「アドレスは既に使用中です」や「必要な幾つかのポートがすでに使用中です」の対処方法

<目次> (1) Tomcatの起動時のエラー「アドレスは既に使用中です」や「必要な幾つかのポートがすでに使用中です」の対処方法  (1-1) 発生状況  (1-2) 原因  (1-3) 対処方法 ( …

Tomcatのサービスが起動しない場合の想定原因と対処(Linux系OSの例)

<目次> (1) Tomcatのサービスが起動しない場合の想定原因と対処(Linux系OSの例)  (1-1) 発生状況・エラーメッセージ  (1-2) 原因  (1-3) 対処法 (1) Tomca …

TomcatにWARファイルをデプロイする方法

  <目次> (1) TomcatにWARファイルをデプロイする方法  (1-1) STEP1:WARファイルの準備  (1-2) STEP2:WARファイルをサーバ上に配備  (1-3) …

Tomcatでhttps接続を行う方法(自己証明書を使ってSSL化する方法)

<目次> (1) Tomcatでhttps接続を行う方法(自己証明書を使ってSSL化する方法)  (1-1) STEP1:鍵や証明書の作成  (1-2) STEP2:証明書の配備(任意)  (1-3) …

Tomcatのコネクションプールの設定手順

<目次> (1) Tomcatのコネクションプールの設定手順  (1-1) コネクションプールとは?  (1-2) コネクションプールの設定手順   (1-2-1) context.xmlの記述    …

  • English (United States)
  • 日本語
Top