Linuxサーバのtomcatを手動でアップデートする方法

# 目的
システムのメンテナンスで、Tomcatをアップデートする際にyumやaptなどのリポジトリに存在していないバージョンにアップデートする場合がある。本記事では、そのような場合の対応として、手動でアップデートする手順をまとめている。

# アップデートの主な流れ
本記事では商用環境でのメンテナンスを想定し、Tomcatを停止させる時間がなるべく短くなるように作業を行う。この手順では、Tomcatアプリが止まるのはシンボリックリンクの張り替えを行う時のみである。また、シンボリックを使用して、万が一アプリに不具合が生じた場合に素早く切り戻すことができるようにしておく。今回はTomcat 9.0.96からTomcat 9.0.98にアップデートする。
1. ローカルのPCで、Tomcat 公式サイトからアーカイブを入手
1. ダウンロードしたアーカイブファイルをLinuxサーバに送信
1. 新しいディレクトリを作成し、アーカイブファイルを解凍する
1. 設定ファイル、Javaアプリの移行
1. 現在稼働している Tomcat の停止
1. 旧シンボリックリンクの削除と新シンボリックリンクの作成
1. Tomcatの起動

### 1. ローカルのPCで、Tomcat 公式サイトからアーカイブを入手

[Tomcatの公式ダウンロードページ](https://tomcat.apache.org/download-90.cgi)からCoreのtarファイルを取得してくる。今回は最新のtomcat 9.0.98をダウンロードしてくる。

### 2. ダウンロードしたアーカイブファイルをLinuxサーバに送信
scpでtarファイルをLinuxサーバに転送する。
``` 
scp (apache-tomcat-9.0.98.tarのパス)　ユーザー名@LinuxサーバのIPアドレス:/home/ユーザー名/ 
```

### 3. 新しいディレクトリを作成し、アーカイブファイルを解凍する
ここからは全てLinuxサーバ内での操作

まず、apache-tomcat-9.0.98.tarを展開するディレクトリを用意し、必要であれば所有者を変更する
``` 
sudo mkdir -p /usr/tomcat9.0.98
sudo chown tomcat:tomcat /usr/tomcat9.0.98 
```

apache-tomcat-9.0.98.tarの解凍

通常、Tomcat 公式サイトからダウンロードすると .tar.gz 形式が多いが、環境によっては拡張子が .tar になっている場合もある。本記事では .tar を使用しているが、.tar.gz の場合は tar -xzvf のように -z オプションをつける必要がある。
``` 
sudo tar -xvf /home/ユーザー名/apache-tomcat-9.0.98.tar -C /usr/tomcat9.0.98 --strip-components=1　
``` 

必要であれば/usr/tomcat9.0.98配下の全てのファイルの権限を変更する
``` 
sudo chown -R tomcat:tomcat /usr/tomcat9.0.98 
```

### 4. 設定ファイル、Javaアプリの移行
まず、既存の設定ファイルとの違いを比較する
```  
diff /usr/tomcat9.0.96/conf /usr/tomcat9.0.98/conf

usr/tomcat9.0.96/conf のみに存在: Catalina
/usr/tomcat9.0.96/conf のみに存在: SSLCertificate.p12
diff /usr/tomcat9.0.96/conf/server.xml /usr/tomcat9.0.98/conf/server.xml
(省略)
diff /usr/tomcat9.0.96/conf/web.xml /usr/tomcat9.0.98/conf/web.xml
(省略)
```

```
[ユーザー名@サーバー名 conf 2025-01-14 13:35:40]# ls Catalina/
localhost
[ユーザー名@サーバー名 conf 2025-01-14 13:37:04]# ls Catalina/localhost/
[ユーザー名@サーバー名 conf 2025-01-14 13:37:13]#
```

Catalinaというディレクトリは存在するが、中にファイルが入っていないので、ここではコピーしない。ここでは、SSL証明書SSLCertificate.p12と、server.xml、web.xmlをコピーします。

```
cp -a /usr/tomcat9.0.96/conf/SSLCertificate.p12 /usr/tomcat9.0.96/conf/server.xml /usr/tomcat9.0.96/conf/web.xml /usr/tomcat9.0.98/conf/
```

次にJavaアプリ(Warファイル)をコピーします。今回はアプリのバージョンアップを伴わないので、先ほどまで動いていたWarファイルを/usr/tomcat9.0.98にコピーする。
```
cp -a /usr/local/tomcat/webapps/warファイル名 /usr/tomcat9.0.98/webapps/
```
### 5. 現在稼働している Tomcat の停止
```
sudo systemctl stop tomcat
```

### 6. 旧シンボリックリンクの削除と新シンボリックリンクの作成

```
[ユーザー名@サーバー名 ~]# ls -l /usr/local
合計 0
drwxr-xr-x. 2 root   root   28  6月 22  2021 bin
drwxr-xr-x. 2 root   root    6  6月 22  2021 etc
drwxr-xr-x. 2 root   root    6  6月 22  2021 games
drwxr-xr-x. 2 root   root    6  6月 22  2021 include
drwxr-xr-x. 2 root   root    6  6月 22  2021 lib
drwxr-xr-x. 3 root   root   17  6月 22  2021 lib64
drwxr-xr-x. 2 root   root    6  6月 22  2021 libexec
drwxr-xr-x. 2 root   root   66  6月 22  2021 sbin
drwxr-xr-x. 5 root   root   49  6月 22  2021 share
drwxr-xr-x. 2 root   root    6  6月 22  2021 src
lrwxrwxrwx. 1 tomcat tomcat 17 11月  5 18:29 tomcat -> /usr/tomcat9.0.96
[ユーザー名@サーバー名 ~]# rm /usr/local/tomcat
rm: シンボリックリンク '/usr/local/tomcat' を削除しますか? yes
[ユーザー名@サーバー名 ~]# ls -l /usr/local
合計 0
drwxr-xr-x. 2 root root 28  6月 22  2021 bin
drwxr-xr-x. 2 root root  6  6月 22  2021 etc
drwxr-xr-x. 2 root root  6  6月 22  2021 games
drwxr-xr-x. 2 root root  6  6月 22  2021 include
drwxr-xr-x. 2 root root  6  6月 22  2021 lib
drwxr-xr-x. 3 root root 17  6月 22  2021 lib64
drwxr-xr-x. 2 root root  6  6月 22  2021 libexec
drwxr-xr-x. 2 root root 66  6月 22  2021 sbin
drwxr-xr-x. 5 root root 49  6月 22  2021 share
drwxr-xr-x. 2 root root  6  6月 22  2021 src
[ユーザー名@サーバー名 ~]# ln -s /usr/tomcat9.0.98/ /usr/local/tomcat
[ユーザー名@サーバー名 ~]# ls -l /usr/local
合計 0
drwxr-xr-x. 2 root root 28  6月 22  2021 bin
drwxr-xr-x. 2 root root  6  6月 22  2021 etc
drwxr-xr-x. 2 root root  6  6月 22  2021 games
drwxr-xr-x. 2 root root  6  6月 22  2021 include
drwxr-xr-x. 2 root root  6  6月 22  2021 lib
drwxr-xr-x. 3 root root 17  6月 22  2021 lib64
drwxr-xr-x. 2 root root  6  6月 22  2021 libexec
drwxr-xr-x. 2 root root 66  6月 22  2021 sbin
drwxr-xr-x. 5 root root 49  6月 22  2021 share
drwxr-xr-x. 2 root root  6  6月 22  2021 src
lrwxrwxrwx  1 root root 18  1月 14 18:06 tomcat -> /usr/tomcat9.0.98/
```
### 7. Tomcatの起動

```
[ユーザー名@サーバー名 ~]# systemctl start tomcat
[ユーザー名@サーバー名 ~]# systemctl status tomcat
● tomcat.service - Apache Tomcat 9
   Loaded: loaded (/etc/systemd/system/tomcat.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2025-01-14 18:07:15 JST; 6s ago
  Process: 2371667 ExecStop=/usr/local/tomcat/bin/shutdown.sh (code=exited, status=0/SUCCESS)
  Process: 2371788 ExecStart=/usr/local/tomcat/bin/startup.sh (code=exited, status=0/SUCCESS)
 Main PID: 2371795 (java)
    Tasks: 16 (limit: 10988)
   Memory: 197.4M
   CGroup: /system.slice/tomcat.service
           └─2371795 /usr/java/latest/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.eph>

 1月 14 18:07:15 TAPION-ATTESTATION systemd[1]: Starting Apache Tomcat 9...
 1月 14 18:07:15 TAPION-ATTESTATION systemd[1]: Started Apache Tomcat 9.
```

ここでは、tomcat.serviceに特に変更を加えていないが、systemctl で管理されている場合は、下記のようにCATALINA_HOME やCATALINA_BASEを、 /usr/local/tomcat にしておくと運用しやすい
``` 例: /etc/systemd/system/tomcat.service
[Service]
Environment="CATALINA_HOME=/usr/local/tomcat"
Environment="CATALINA_BASE=/usr/local/tomcat"
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
...

```


もし、Tomcatの起動後に不具合が生じたら、シンボリックリンクを /use/local/tomcat -> /usr/tomcat9.0.98/ から/use/local/tomcat -> /usr/tomcat9.0.96/ に戻せばすぐに切り戻すことが出来る

※今回は/usr/tomcat9.0.96のバックアップを取りませんでしたが、より安全な運用をするなら、/usr/tomcat9.0.98のディレクトリの作成前にバックアップをとっておいた方がいいかもしれない