Apache Tomcat とは何か
JavaのサーブレットコンテナであるTomcatの役割・仕組みと、Apache HTTP Serverとの違い・組み合わせ方をまとめた入門記事
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 Server | Apache Tomcat | |
|---|---|---|
| 通称 | Apache, httpd | Tomcat |
| 主な役割 | Webサーバー(静的ファイル配信) | サーブレットコンテナ(Java アプリ実行) |
| 処理できるもの | HTML, CSS, JS, 画像などの静的リソース | Servlet, JSP, Java アプリ |
| 動的コンテンツ | PHP などを組み合わせれば可能 | Java アプリをネイティブに処理 |
| ポート(デフォルト) | 80 / 443 | 8080 |
なぜ 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-tomcat を provided スコープにしないと Tomcat が二重に起動してしまう。
<!-- pom.xml:外部 Tomcat にデプロイする場合 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>セッション管理の注意点
複数の Tomcat インスタンス(クラスタ構成)ではセッションが共有されない。セッションをどのインスタンスで作成したかによって認証状態が変わるため、Redis 等のセッションストアを使うか、スティッキーセッション(同一クライアントを同一インスタンスに転送)で対応する。
関連
- NestJS 入門(Node.js ベースの別のアプリサーバー構成との比較として)
- Docker とコンテナ(Tomcat の Docker 化)