awesome-hacks
Docs

Apache Tomcat とは何か

JavaのサーブレットコンテナであるTomcatの役割・仕組みと、Apache HTTP Serverとの違い・組み合わせ方をまとめた入門記事

最終更新:2026/06/15

TL;DR

  • Tomcat は Java の Web アプリ(Servlet / JSP)を動かすためのアプリケーションサーバー(サーブレットコンテナ)
  • Apache HTTP Server(通称 Apache)は静的ファイルを配信する Web サーバーで、Tomcat とは別物
  • 本番環境では「Apache HTTP Server → Tomcat」の順でリクエストを転送するリバースプロキシ構成がよく使われる

Tomcat とは

Apache Tomcat(アパッチ・トムキャット)は、Java で書かれた Web アプリケーションを動かすための サーブレットコンテナ(Servlet Container) である。

Apache Software Foundation が開発・管理しているオープンソースソフトウェアで、Java EE / Jakarta EE の仕様のうち以下を実装している。

仕様概要
ServletクライアントのHTTPリクエストを受け取り、Javaコードで処理するコンポーネント
JSP(JavaServer Pages)HTMLの中にJavaコードを埋め込んでHTMLを動的生成する仕組み
WebSocket双方向リアルタイム通信

Spring Boot などのフレームワークも内部的に Tomcat を組み込んでいることが多く(Embedded Tomcat)、意識しなくても使っていることがある。


Apache HTTP Server との違い

「Apache」という名前が同じため混同されやすいが、Apache HTTP Server と Apache Tomcat は全く別のソフトウェアである。

Apache HTTP ServerApache Tomcat
通称Apache, httpdTomcat
主な役割Webサーバー(静的ファイル配信)サーブレットコンテナ(Java アプリ実行)
処理できるものHTML, CSS, JS, 画像などの静的リソースServlet, JSP, Java アプリ
動的コンテンツPHP などを組み合わせれば可能Java アプリをネイティブに処理
ポート(デフォルト)80 / 4438080

なぜ Tomcat が必要か

Tomcat が担う役割は「Java アプリを HTTP リクエストと紐付けて実行する」ことである。

たとえば /api/users に GET リクエストが来たとき、Tomcat は対応する Java クラス(Servlet)のメソッドを呼び出し、その結果を HTTP レスポンスとして返す。この「HTTP ↔ Java クラス」の橋渡しをする仕組みがサーブレットコンテナの本質である。

クライアント
  ↓ HTTP リクエスト
Tomcat(サーブレットコンテナ)
  ↓ 対応するServletを呼び出す
Java アプリ(Servlet / Spring MVC など)
  ↓ レスポンスを返す
Tomcat
  ↓ HTTP レスポンス
クライアント

Apache HTTP Server + Tomcat のリバースプロキシ構成

本番環境では Apache HTTP Server を Tomcat の前段に置く構成がよく見られる。

インターネット
  ↓
Apache HTTP Server(ポート 80 / 443)
  ├── 静的ファイル(HTML, CSS, JS) → そのまま返す
  └── /api/* などの動的リクエスト → Tomcat(ポート 8080)へ転送
         ↓
       Tomcat(Java アプリ)

この構成を取る理由は以下の通りである。

  • SSL 終端:HTTPS の処理を Apache に任せ、Tomcat は HTTP だけ処理すればよくなる
  • 静的ファイルの高速配信:Apache は静的ファイルの配信が得意なため、画像や JS は Apache が直接返す
  • ロードバランシング:複数の Tomcat インスタンスにリクエストを分散できる
  • セキュリティ:Tomcat を外部に直接公開せず、Apache 経由のみに制限できる

Apache HTTP Server で Tomcat へ転送するには mod_proxy モジュールを使う。

# Apache HTTP Server の設定例(httpd.conf または VirtualHost 内)
ProxyPass        /api/ http://localhost:8080/api/
ProxyPassReverse /api/ http://localhost:8080/api/

Spring Boot との関係

Spring Boot は Embedded Tomcat(組み込みTomcat)をデフォルトで内蔵している。

そのため java -jar myapp.jar を実行するだけで Tomcat が起動し、別途 Tomcat をインストール・設定する必要がない。

# Spring Boot アプリの起動ログの例
Tomcat started on port(s): 8080 (http) with context path ''

一方、WAR ファイルとして外部の Tomcat にデプロイする従来の方式も存在する。クラウドネイティブな新規開発では Embedded Tomcat が主流だが、レガシーな社内システムでは外部 Tomcat へのデプロイも多い。

方式特徴
Embedded Tomcat(JAR)実行可能 JAR に Tomcat が内包。java -jar で起動。コンテナ環境に向いている
外部 Tomcat(WAR)Tomcat サーバーに WAR ファイルをデプロイ。既存インフラに合わせやすい

よくある落とし穴

ポート競合

Tomcat のデフォルトポートは 8080。ローカル開発環境で別のサービス(Node.js 等)も 8080 を使っていると起動に失敗する。conf/server.xml<Connector port="8080"> を変更して回避する。

Embedded Tomcat と外部 Tomcat の二重起動

Spring Boot WAR を外部 Tomcat にデプロイする際、SpringBootServletInitializer を継承しないままにすると正しく起動しない。また spring-boot-starter-tomcatprovided スコープにしないと Tomcat が二重に起動してしまう。

<!-- pom.xml:外部 Tomcat にデプロイする場合 -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-tomcat</artifactId>
  <scope>provided</scope>
</dependency>

セッション管理の注意点

複数の Tomcat インスタンス(クラスタ構成)ではセッションが共有されない。セッションをどのインスタンスで作成したかによって認証状態が変わるため、Redis 等のセッションストアを使うか、スティッキーセッション(同一クライアントを同一インスタンスに転送)で対応する。


関連