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 移行)、セキュリティ設定、性能チューニングと監視をしっかり行うことで、安定かつ安全な運用が可能になります。

参考文献