◀ 2.

Apache Tomcat 入門 — Servlet コンテナのバージョン / 構成 / Spring Boot との関係

▶

Apache Tomcatを調べるときは、対応するServlet仕様・Java・アプリの名前空間を先に合わせます。この親ページの下にある子ページから、インストール・起動停止・エラー・設定確認など必要な手順を選んでください。

Tomcat本体とインスタンス固有設定、setenvの優先順

目的別に子ページから選ぶ

設定変更の前に、対象インスタンス・起動ユーザー・起動方法を記録します。下の例は独立した説明用で、すべてを足せば安全な本番環境が完成するわけではありません。参考: Managerのロール分離、JMXの保護設定、Contextの命名規則、公式移行ツール。

この記事の要点
  • Apache Tomcat は Java Servlet / JSP を動かすオープンソース Web コンテナ
  • バージョンと Servlet 仕様の対応: Tomcat 8.5 (Servlet 3.1、終了) / 9 (4.0) / 10.0 (5.0、終了) / 10.1 (6.0) / 11 (6.1)
  • Tomcat 10 以降は javax.* → jakarta.* へパッケージ変更(既存アプリの大きな移行ポイント)
  • ディレクトリ: bin/(起動スクリプト)conf/(server.xml/web.xml)webapps/(WAR 配置)logs/
  • Connector: HTTP/1.1 (8080) / AJP (8009) / HTTPS (8443)
  • デプロイは WAR を webapps/ に置く / Manager App で GUI 操作 / CATALINA_OPTS で JVM チューニング

Apache Tomcat とは

Apache Tomcat は Apache Software Foundation が開発するオープンソースの Java Servlet コンテナ。Java の Web 標準仕様(Servlet / JSP / WebSocket / Expression Language)を実装した Web サーバーで、Java の Web アプリケーション (WAR ファイル) を動かす定番ミドルウェアです。

「アプリケーションサーバー」のような Java EE 全機能 (EJB, JMS, JTA) は持たず、Web 層に特化した軽量実装。OSS で無償、商用利用も自由です。

バージョンと Servlet 仕様

TomcatServlet 仕様必要 Javaパッケージ状況
Tomcat 7Servlet 3.0Java 6+javax.servletサポート終了
Tomcat 8.5Servlet 3.1Java 7+javax.servlet2024-03 EOL
Tomcat 9Servlet 4.0Java 8+javax.servletサポート対象。既存javax.servlet系との対応を確認
Tomcat 10.0Servlet 5.0 (Jakarta EE 9)Java 8+jakarta.servlet2022-10-31サポート終了
Tomcat 10.1Servlet 6.0 (Jakarta EE 10)Java 11+jakarta.servletサポート対象。アプリとJavaの対応を確認
Tomcat 11Servlet 6.1 (Jakarta EE 11)Java 17+jakarta.servletサポート対象。Servlet 6.1/Java 17以降

javax → jakarta 問題

Tomcat 9 までは javax.servlet.*、Tomcat 10 以降は jakarta.servlet.* に名前空間が変わりました。Servlet等の変更対象APIを使うアプリは移行が必要です。 すべてのjavaxパッケージを機械的にjakartaへ置き換えるのではなく、依存ライブラリ・設定・対象仕様も照合します。変換ツールだけでアプリ全体の互換性が保証されるわけではありません。

// Tomcat 9 まで
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

// Tomcat 10 以降
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

2026年10月確認時点では9.0/10.1/11.0が公式のサポート対象です。アプリの仕様とJavaに適合する系列の修正版を選び、番号が大きいだけで互換と判断しません。最新の対応/終了状況は公式バージョン表を確認してください。

インストールとディレクトリ構造

次は10.1.34を固定した過去の記録で、現在のダウンロード手順ではありません。 公式の対象系列から修正版と検証用署名/ハッシュを確認します。起動・停止コマンドは稼働系へ影響するため、調査だけの目的では実行しないでください。

# Linux
wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.34/bin/apache-tomcat-10.1.34.tar.gz
tar xzf apache-tomcat-10.1.34.tar.gz
cd apache-tomcat-10.1.34/

# 起動
bin/startup.sh

# 停止
bin/shutdown.sh

# ログ確認
tail -f logs/catalina.out
ディレクトリ役割
bin/startup.sh / shutdown.sh / catalina.sh など起動スクリプト
conf/server.xml / web.xml / context.xml / tomcat-users.xml
webapps/WAR配置先。自動配備/展開はHostの設定と起動/稼働中の条件による
logs/catalina.out / localhost_access_log / catalina.YYYY-MM-DD.log
lib/Tomcat 共通ライブラリ (JDBC ドライバなどを置く)
temp/一時ファイル
work/JSP コンパイル結果

server.xml の主要設定

下は説明用の旧設定です。changeme/changeitを実運用で使わず、AJPや管理用の待受を必要なく有効にしないでください。redirectPortだけではHTTPSは有効にならず、TLS証明書とConnectorの設定が必要です。ポート番号は例で、現在の待受を表しません。

<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">

  <Service name="Catalina">

    <!-- HTTP コネクタ -->
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               maxThreads="200"
               redirectPort="8443" />

    <!-- AJP コネクタ (Apache HTTP Server と連携時) -->
    <Connector port="8009" protocol="AJP/1.3"
               address="127.0.0.1"
               secretRequired="true"
               secret="changeme"
               redirectPort="8443" />

    <!-- HTTPS コネクタ -->
    <Connector port="8443" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
               SSLEnabled="true" maxThreads="200">
      <SSLHostConfig>
        <Certificate certificateKeystoreFile="conf/keystore.jks"
                     certificateKeystorePassword="changeit"
                     type="RSA" />
      </SSLHostConfig>
    </Connector>

    <Engine name="Catalina" defaultHost="localhost">
      <Host name="localhost" appBase="webapps"
            unpackWARs="true" autoDeploy="true" />
    </Engine>
  </Service>
</Server>

デプロイ方法

下のManager/curlは保守比較用で、そのまま実行しないでください。 admin/adminpassの固定資格情報、GUIとscriptロールの兼用を推奨しません。公式はCSRF保護のため両ロールを同じ利用者へ与えないことを推奨します。CLIの引数/履歴にも秘密を残さず、管理経路はアクセス制限と適切な暗号化を設計します。deploy/undeployはアプリを変更・削除する操作です。tomcat7:deployも現在の全系列へそのまま使えるとは扱いません。

  1. WAR ファイルを webapps/ に配置 → 自動展開(autoDeploy=true)
  2. Manager App から GUI でアップロード → http://localhost:8080/manager/html
  3. Maven / Gradle プラグイン → mvn tomcat7:deploy
  4. コンテキスト名を設定 → 通常の自動配備ではWAR/XMLのファイル名からパスを決める。アプリ内META-INF/context.xmlのPathで任意に変更する手順ではない
# Manager App を使う場合、conf/tomcat-users.xml に
# <user username="admin" password="adminpass"
#       roles="manager-gui,manager-script"/>

# CLI から WAR デプロイ
curl -u admin:adminpass -T myapp.war \
    "http://localhost:8080/manager/text/deploy?path=/myapp&update=true"

# アンデプロイ
curl -u admin:adminpass \
    "http://localhost:8080/manager/text/undeploy?path=/myapp"

Tomcat vs Spring Boot Embedded

Spring Bootは対象バージョンが対応するサーバーを埋め込み (Embedded)で利用できます。対応するTomcat/Jetty等はBootの版と依存構成で確認し、java -jar app.jar で起動する単独サーバーとして動かせます。

方式メリットデメリット
Tomcat (Standalone)1 つの Tomcat に複数アプリ同居可。運用ノウハウ豊富環境構築が必要。Tomcat 設定とアプリ設定が分離
Spring Boot EmbeddedJAR 1 つで完結。Docker と相性良いサーバー = アプリ = 1 対 1。Tomcat 共有不可

JVM オプション (CATALINA_OPTS)

次の旧例を実環境へコピーしないでください。 特にJMXのauthenticate=false/ssl=falseは認証・暗号化を無効にする設定で、管理ポートをそのまま外部公開してはいけません。監視が不要なら有効化せず、必要なら接続元制限・認証・TLS・権限を別途設計します。catによる既存setenv.shの上書きや、既存CATALINA_OPTSの消去も避けます。固定の2GB/4GBは推奨値ではなく、メモリ上限と計測に合わせます。ヒープダンプは秘密値や大容量データを含み得るため保存権限/容量/取扱いが必要です。

# bin/setenv.sh を作成(環境別チューニング推奨方法)
cat > bin/setenv.sh <<'EOF'
export CATALINA_OPTS="-Xms2g -Xmx4g \
    -XX:+UseG1GC \
    -XX:MaxGCPauseMillis=200 \
    -Djava.awt.headless=true \
    -Dfile.encoding=UTF-8 \
    -Duser.timezone=Asia/Tokyo \
    -XX:+HeapDumpOnOutOfMemoryError \
    -XX:HeapDumpPath=/var/log/tomcat/heapdump.hprof"
EOF
chmod +x bin/setenv.sh

# JMX 有効化(監視用)
export CATALINA_OPTS="$CATALINA_OPTS \
    -Dcom.sun.management.jmxremote \
    -Dcom.sun.management.jmxremote.port=9010 \
    -Dcom.sun.management.jmxremote.authenticate=false \
    -Dcom.sun.management.jmxremote.ssl=false"

FAQ

Q: Tomcat 9 から 10 へ移行する手順は
A: Apache Tomcat Migration Tool for Jakarta EEを使う場合も、公式の変換対象と対象系列を確認し、変換後の依存関係・設定・アプリ動作を検証します。全javaxパッケージや全標準APIを一律に変換すれば完了、という意味ではありません。

Q: Apache HTTP Server (httpd) と連携する必要はあるか
A: 必須ではありません。Tomcat 単独で HTTPS も提供できます。静的ファイル配信パフォーマンス / 大規模で複雑な VirtualHost が必要な場合のみ httpd + AJP / mod_jk を検討してください。

Q: メモリ不足で OutOfMemoryError が出る
A: まず例外の詳細、ヒープ/メタスペース/ネイティブメモリとプロセス・コンテナの上限を確認します。無条件に-Xmxを増やさず、必要なら-XX:+HeapDumpOnOutOfMemoryError でヒープダンプを取って Eclipse MAT で解析。WAR のリロードで PermGen / Metaspace が膨らむケースも要注意。

子ページ
  1. tomcatインストール(CentOS)
  2. WARファイルのAutoDeploy設定
  3. tomcatの起動/停止(Linux, Mac)
  4. JRE(JVM)のJavaのバージョン確認方法
  5. エラー一覧
  6. CATALINA_HOMEの確認方法(Linux, Mac)
  7. 管理画面の開き方
  8. tomcatの起動確認方法
  9. tomcatの起動/停止ログとcatalina.log/catalina.outの違い
  10. CentOSにおけるポート開放方法
  11. Javaのバージョン変更方法(Mac編)
同階層のページ
  1. Apache HTTP Server
  2. Apache Tomcat
  3. Nginx

最近更新/作成されたページ