| この記事の要点 |
|
AutoDeploy とは
Tomcat の autoDeploy は $CATALINA_BASE/webapps/ ディレクトリを定期的に監視し、新規 WAR ファイルやディレクトリの追加・更新・削除を検知して自動で展開・反映する機能です。開発時は便利ですが、本番では計画外の再起動を招くため通常無効化します。
conf/server.xml の設定箇所
<Server port="8005" shutdown="SHUTDOWN">
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost"
appBase="webapps"
unpackWARs="true"
autoDeploy="true"
deployOnStartup="true"
deployIgnore=""
copyXML="false">
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="localhost_access_log"
suffix=".txt"
pattern="common" />
</Host>
</Engine>
</Service>
</Server>
各属性の意味
| 属性 | デフォルト | 意味 |
|---|---|---|
appBase | webapps | WAR / コンテキストの配置ディレクトリ |
autoDeploy | true | 稼働中の追加・更新を監視して自動展開 |
deployOnStartup | true | Tomcat 起動時に appBase 配下を一括展開 |
unpackWARs | true | WAR を解凍してディレクトリで実行(false なら WAR のまま) |
deployIgnore | なし | 無視するファイル名の正規表現 |
copyXML | false | WAR 内 META-INF/context.xml を conf/Catalina/localhost/ にコピー |
監視間隔
autoDeploy の監視間隔は <Engine> 階層の backgroundProcessorDelay 属性(秒)で決まります。デフォルト 10 秒:
<Engine name="Catalina" defaultHost="localhost"
backgroundProcessorDelay="10">
<!-- 10 秒ごとに webapps/ をスキャン -->
</Engine>
本番で監視は不要なら -1 で停止可能。ただし autoDeploy=false の方が一般的。
WAR 配置からアクセスまで
# 開発環境 (autoDeploy=true) の場合
cp myapp.war $CATALINA_HOME/webapps/
# 10 秒後にログ確認
tail -f $CATALINA_HOME/logs/catalina.out
# INFO: Deploying web application archive [/opt/tomcat/webapps/myapp.war]
# INFO: Deployment of web application archive ... has finished in 1,234 ms
# 展開先
ls -la $CATALINA_HOME/webapps/
# drwxr-xr-x myapp/ ← unpackWARs=true で自動展開
# -rw-r--r-- myapp.war
# アクセス
curl http://localhost:8080/myapp/
本番環境の推奨設定
本番では autoDeploy / deployOnStartup を無効化し、明示的にデプロイする運用が安全です:
<Host name="localhost"
appBase="webapps"
unpackWARs="true"
autoDeploy="false"
deployOnStartup="false">
</Host>
デプロイ手順:
# 1. Tomcat 停止
sudo systemctl stop tomcat
# または
$CATALINA_HOME/bin/shutdown.sh
# 2. 旧アプリ削除
rm -rf $CATALINA_HOME/webapps/myapp/
rm $CATALINA_HOME/webapps/myapp.war
# 3. 新 WAR 配置
cp /tmp/myapp-new.war $CATALINA_HOME/webapps/myapp.war
chown tomcat:tomcat $CATALINA_HOME/webapps/myapp.war
# 4. work ディレクトリのクリア(古い JSP コンパイル結果)
rm -rf $CATALINA_HOME/work/Catalina/localhost/myapp/
# 5. 起動
sudo systemctl start tomcat
# 6. 確認
tail -f $CATALINA_HOME/logs/catalina.out
curl -I http://localhost:8080/myapp/
Manager Webapp 経由のデプロイ
無停止デプロイしたい場合は Tomcat Manager の HTTP API を使えます:
# conf/tomcat-users.xml に manager-script ロールを設定
# <user username="deploy" password="xxx" roles="manager-script"/>
# 既存アプリの停止 → アンデプロイ → デプロイ
curl -u deploy:xxx \
"http://localhost:8080/manager/text/undeploy?path=/myapp"
curl -u deploy:xxx \
--upload-file myapp.war \
"http://localhost:8080/manager/text/deploy?path=/myapp&update=true"
autoDeploy のリスク
| リスク | シナリオ | 対策 |
|---|---|---|
| 中途展開 | 大きな WAR の cp 途中で Tomcat が展開開始 → クラスファイル欠落 | cp app.war.tmp → mv app.war.tmp app.war |
| 誤上書き | 運用ミスで間違った WAR を webapps へ → 即時反映 | 本番は autoDeploy=false |
| セッション喪失 | 再展開で webapp 再起動 → セッション消失 | セッション永続化、ローリングデプロイ |
| ログ肥大 | 10 秒ごとの監視ログ | org.apache.catalina.startup.HostConfig の log level を上げる |
FAQ
Q: WAR を置いても展開されない
A: ① Tomcat ユーザにファイル読取権限があるか、② autoDeploy=true か、③ catalina.out に FileNotFoundException 等のエラーが出ていないか確認。
Q: ディレクトリ展開を残したくない
A: unpackWARs="false" にすれば WAR のまま実行される。ただし JSP コンパイル時に work/ へキャッシュされる点は変わらず。
Q: コンテキストパスを変えたい
A: WAR 名を変える(myapp##v2.war → /myapp、パラレルデプロイ)、または conf/Catalina/localhost/myapp.xml を作成。
子ページ
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- プロジェクトをTomcatプロジェクトとして認識させる方法 2026-10-07 22:32:50
- MySQLの1366 Incorrect string value|Laravelの文字コード・絵文字エラー 2026-10-07 21:54:03
- curlの証明書ホスト名不一致|旧エラー51・現行60の確認と対処 2026-10-07 21:54:03
- LaravelのMassAssignmentException|fillableの原因と安全な対処 2026-10-07 21:54:03
- Eclipse で Tomcat の起動ログがコンソールに出ない時の確認手順 2026-10-07 21:54:02
- MySQLにおける中央値(Median)の導き方(バージョン8未満) 2026-10-07 13:49:45
- getInputForward 2026-10-07 13:41:15
- JSONから配列に変換 2026-10-07 13:41:15
- ビューから値をモデルに格納しコントローラーで受け取る方法 2026-10-07 13:23:41
- Laravelのテーブル作成と定義変更|マイグレーション・up/down・注意点 2026-10-07 13:23:41
- NumPy 配列に要素を追加する方法 (append / concatenate) 2026-10-07 13:23:41
- MariaDB・MySQLで現在日時を取得する方法|NOW・タイムゾーン・保存型 2026-10-07 13:13:36
- 【django】テンプレートで定数を使用する方法 2026-10-07 13:10:15
- Spring BootにおけるApplication.propertiesの環境依存設定の分割方法 2026-10-07 12:09:35
- Not supported for DML operations【Springエラー】 2026-10-07 11:09:38