Apache Tomcat 完全ガイド:導入・運用・セキュリティと性能チューニング、Jakarta移行対応
はじめに — Tomcatとは何か
Apache Tomcat(以下Tomcat)は、Apache Software Foundation が提供するオープンソースのサーブレットコンテナ/ウェブアプリケーションサーバです。Java Servlet や JavaServer Pages(JSP)の仕様に準拠し、Javaで書かれたWebアプリケーション(WARファイル)を実行するためのランタイムを提供します。フルスペックのJava EE(Jakarta EE)アプリケーションサーバ(例:WildFly、GlassFish)と比べると、Tomcat は主にWeb層(サーブレット/JSP)にフォーカスした軽量な実装です。
歴史と位置づけ
Tomcat はオープンソースコミュニティで活発に開発されており、サーブレット/JSPのリファレンス実装的な役割を果たしてきました。近年は「javax.*」パッケージから「jakarta.*」への名称空間移行(Jakarta EE 9 以降)に合わせてバージョン分岐が行われ、Tomcat 9 系列が従来の javax ベースを、Tomcat 10 以降が jakarta 名前空間を扱うなど、互換性を意識した移行が進んでいます。
主要コンポーネント(アーキテクチャの概要)
- Catalina — Tomcat のコアのサーブレットコンテナ。サーブレットのライフサイクル管理、リクエストのディスパッチ、コンテキスト管理などを行います。
- Jasper — JSP エンジン。JSP をサーブレットに変換しコンパイルして実行します。
- Coyote — HTTP コネクタ実装。HTTP/1.1 や HTTP/2 の受け口として働き、リクエストを Catalina に渡します。
- Tomcat Native(APR) — OpenSSL 連携や高速なソケット処理などを行うネイティブライブラリ(optional)で、高性能化や HTTP/2、ALPN を必要とする場合に利用されます。
- Tribes — クラスタリング(セッションレプリケーション)用のメカニズム。
主な機能と特徴
- Servlet/JSP の実行:Servlet API、JSP 仕様の実装。
- 複数のコネクタ(BIO/NIO/NIO2/APR)をサポートし、非同期処理やHTTP/2に対応。
- クラスローディングやバーチャルホスト、コンテキストごとの設定をサポート。
- Manager・Host Manager アプリケーションによるデプロイ管理、JMX による監視と管理。
- 拡張性:Valve(フィルタのような処理)やRealm(認証・認可プラグイン)を用いたカスタマイズが可能。
Tomcat とフル機能のアプリケーションサーバの違い
Tomcat は「サーブレットコンテナ」としての役割に特化しています。一方で Java EE(現 Jakarta EE)のトランザクション管理(JTA)、EJB、JMS、JCA などの仕様をフルに提供するサーバと比べると機能は限定的です。そのため、トランザクションやメッセージング等が大量に必要なシステムでは、Tomcat 単体では補完が必要になります(外部プロダクトやライブラリの導入で補うことが一般的)。
主要な設定ファイルとデプロイ方法
- server.xml — サーバ全体の構成(Connector、Engine、Host など)。
- web.xml — サーバ全体のデフォルトweb設定、またはアプリケーション毎のデプロイ時に使われる記述。
- context.xml — アプリケーションコンテキスト固有の設定(データソースやリソースリンクなど)。
- tomcat-users.xml — 管理者やManagerアプリにアクセスするためのユーザ定義(運用では外部認証を推奨)。
デプロイは WAR ファイルを webapps ディレクトリに配置する、あるいは Manager アプリや自動デプロイ(autoDeploy)で行います。運用では自動デプロイをオフにし、CI/CD(例:Jenkins、GitHub Actions)から安全にデプロイすることが一般的です。
性能とチューニングのポイント
- JVM チューニング(ヒープサイズ、GC ポリシー) — Webアプリの特性に合わせて調整。
- コネクタ設定(maxThreads、acceptCount、connectionTimeout) — 同時接続とスレッド数のバランス。
- コネクタ種類の選択(NIO/NIO2/APR) — 高負荷でのスループットや HTTP/2 を考慮。
- 静的コンテンツの分離 — Nginx や CDN を前段に置き、Tomcat はアプリ処理に専念させる。
- データソース(コネクションプール)最適化 — maxActive/maxIdle 等の設定。
負荷試験(JMeter、Gatling 等)とプロファイリング(YourKit、VisualVM、Flight Recorder)を組み合わせ、ボトルネックを継続的に解消することが重要です。
セキュリティのベストプラクティス
- 常に最新の Tomcat と JVM に更新する(セキュリティフィックスの適用)。
- 不要な管理アプリ(例: manager、host-manager)を無効化またはアクセス制限する。
- AJP コネクタは不要なら無効化する(AJP に関する脆弱性や設定ミスは重大リスクに繋がる)。
- TLS を有効にし、強力な暗号スイートとプロトコルを採用する。証明書の管理を適切に行う。
- アプリケーション層のセキュリティ(入力検証、CSRF/ XSS 対策、セッション管理)を確実に実装する。
- OSレベルの権限分離(専用ユーザで実行)、ファイルアクセス権限の制御。
スケーリングとクラスタリング
スケールアウトはロードバランサ(HAProxy、Nginx、クラウドLB)を前段に置き、複数 Tomcat インスタンスで水平分散するのが一般的です。セッション管理については:
- ロードバランサでのセッションのスティッキー化(sticky session)
- Tomcat のクラスタ機能によるセッションレプリケーション(Tribes、DeltaManager 等)
- 外部セッションストア(Redis、Memcached)を利用する手法
運用上はレプリケーションのオーバーヘッドやデータ整合性も考慮し、設計時にトレードオフを評価します。
開発者向け注意点(Jakarta への移行)
最近の大きな変更点として、Jakarta EE によるパッケージ名の変更(javax.* → jakarta.*)があります。Tomcat 10 以降は jakarta 名前空間に準拠するため、既存アプリケーションを Tomcat 9 等から Tomcat 10 にそのまま移行すると互換性の問題が発生します。移行にはソースや依存の置換(変換ツールの使用やライブラリのアップデート)が必要です。
運用・監視
- JMX を用いたメトリクス収集(スレッド数、メモリ、コネクションなど)。
- アクセスログ、GCログ、標準出力のログを一元管理(ELK/EFK、Prometheus+Grafana 等)。
- アラートの設定(レスポンスタイム悪化、異常エラー率、スレッド枯渇など)。
- バージョン管理された構成(Infrastructure as Code、コンテナ化)による再現可能なデプロイ。
代表的なユースケース
- 中小〜大規模の Web アプリケーション(Spring MVC、Spring Boot の従来展開など)。
- マイクロサービスでは、軽量コンテナとして組み合わせて利用されることもある(ただし Spring Boot 等の組み込みサーバ利用が一般的)。
- 学習用・プロトタイプ・オンプレ運用環境など、手軽に導入できる Web コンテナが必要な場面。
まとめ
Tomcat は、Java ベースの Web アプリケーションを実行するための成熟したサーブレットコンテナであり、軽量性、柔軟な設定、広範なコミュニティサポートが特徴です。フル機能のアプリケーションサーバと比べてシンプルで導入コストが低い一方、トランザクションや高度なエンタープライズ機能が必要な場合は別途補完が必要です。運用時は、バージョン間の互換性(特に Jakarta 移行)、セキュリティ設定、性能チューニングと監視をしっかり行うことで、安定かつ安全な運用が可能になります。
参考文献
- Apache Tomcat — 公式サイト
- Apache Tomcat 9 ドキュメント
- Apache Tomcat 10 ドキュメント(Jakarta 名前空間)
- Apache Tomcat — Wikipedia(概要と歴史)
- CVE データベース — Tomcat に関連する脆弱性一覧


