Tomcat 9.0系のマイナーバージョンアップをしてみた。

Tomcat 9.0系に脆弱性が見つかったためマイナーバージョンアップをしました。Tomcatを動かしている環境は Amazon Linux 2023 です。Tomcatのバージョンは 9.0.89 から 9.0.106にあげました。

Tomcatのダウンロードサイトからtarファイルを取得します。

ダウンロードしたファイルは apache-tomcat-9.0.106.tar.gz というファイル名でした。

ハッシュ値を確認しておきます。ダウンロードサイトにあるsha512のリンクをクリックして表示された文字列をメモしておきます。以下のコマンドで文字列が一致するか確認をします。

$ sha512sum apache-tomcat-9.0.106.tar.gz

一致すればダウンロード時の破損はありません。ダウンロードしたファイルを Amazon Linux 2023 のTomcatを配置するディレクトリに持っていきます。

ここで、Tomcatのマイナーバージョンアップでやることを先に書いておきます。

  • 新しいTomcatを解凍して配置する。
  • 古いTomcatにあるWebアプリケーションのフォルダを新しいTomcatにコピーする。
  • 新しいTomcatの不要なWebアプリケーションのフォルダを削除する。
  • 新しいTomcatのconfファイル(server.xml)を修正する。

このような感じです。

新しいTomcatを解凍します。

$ tar xf apache-tomcat-9.0.106.tar.gz

解凍すると apache-tomcat-9.0.106 というフォルダができます。フォルダは任意の名前に変更しても構いません。解凍に使用したtarファイルは不要なので削除します。

古いTomcatにあるWebアプリケーションフォルダをアーカイブします。WebアプリケーションフォルダはTomcatの webapps 配下のものです。古いTomcatの webapps 配下まで移動してから tarコマンドを実行します。

$ tar cf tool.tar tool

tool.tar がアーカイブファイル名、tool が移行するWebアプリケーションフォルダです。アーカイブした tool.tar ファイルを新しいTomcatの webapps 配下に持っていき展開します。

$ tar xf tool.tar

展開をしたら tool.tar ファイルは不要ですので削除します。新しいTomcatにはデフォルトで ROOT、docs、examples、host-manager、manager のアプリケーションフォルダがありますので、こちらも削除をします。削除は必要に応じて判断してください。

最後にTomcatのコンフィグファイルを修正します。コンフィグファイルの修正内容は環境によって変わるかと思います。コンフィグファイルは conf 配下にあります。僕の場合は server.xml の修正をしました。古いTomcatのserver.xml を新しいTomcatに持っていっても使えるような気はしますが、新しいTomcat側で編集をしました。

$ vi server.xml

編集内容はポートの変更です(ポートを8080から8000に変更)。


<Connector port="8000" protocol="HTTP/1.1"
	connectionTimeout="20000"
	redirectPort="8443"
	maxParameterCount="1000"
	/>

ここまで出来たら新しいTomcatを起動させます。bin フォルダ配下のシェルを実行します。

$ ./startup.sh

ウェブブラウザからアクセスしてウェブアプリケーションが動けば終わりです。

Dockerのphp-fpmのイメージをコンテナ化してPHPのWebアプリを動かしてみた。

ubuntu24.04LTSにNginxのWebサーバーを立て、PHP7.4でWebアプリを稼働させています。7.4はもう古いのでPHPのバージョンアップをします。ただ、一部のPHPのWebアプリがバージョンを上げたPHP向けに修正ができておらず、PHP7.4も残したい。仕方がないのでPHP7.4はDockerのコンテナで稼働させることにしました。このような感じです。

ubuntuへのDockerのインストールは済んでいるものとします(すみませんが省略します)。

Dockerのコンテナで実行するphp-fpmですが、Docker Hub にある 7.4.33-fpm を使います。

このイメージのDockerfileの抜粋です。

WORKDIR および EXPOSE を見ると、Webアプリケーションを配置するディレクトリは /var/www/html で、ポート9000でHTTPリクエストを受け付けるようになっています。あとで後述しますが、コンテナ起動の際にはこれらをパラメータとして指定をします。

Nginxの設定を変更します。

Nginxの fastcgi_pass ディレクティブの向き先はローカルPC上のPHP7.4ですので、Docker Engineに向けてリクエストを送るようにします。Docker EngineのIPアドレスはifconfigコマンドで確認できます。docker0 というインターフェイスです。

僕の環境では 172.17.0.1 となっていました。fastcgi_pass ディレクティブの設定を以下のようにします。

変更前
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;

変更後
fastcgi_pass 172.17.0.1:9000;

Nginxの再起動をします。

それではDocker Engineで 7.4.33-fpm のコンテナを起動させてWebアプリを動かします。この際に、ローカルPC上のPHPのWebアプリをバインドマウントする、および、ポートフォワードの設定をします。

まずバインドマウントですが、ローカルPC上のPHPのWebアプリの格納先を確認します。僕の場合は /var/www/html 配下です。ですので、ここのディレクトリをコンテナから参照できるようにします。コンテナ側のWebアプリケーションを配置するディレクトリ(前述のDockerfileの WORKDIR 指定の場所)から見えるように -v /var/www/html:/var/www/html というパラメータをコンテナ起動時に指定します。

次にポートフォワードですが、NginxからはDocker Engineのポート9000にリクエストを転送しています。Docker Engineからコンテナにリクエストを渡すために -p 9000:9000 というパラメータ指定をします。

HTTPリクエストの転送イメージです。

コンテナを起動させます。Dockerコマンドは以下です。コンテナの名前は php74-fpm としていますが、適宜変更をしてください。


$ docker run -dit --name php74-fpm -p 9000:9000 -v /var/www/html:/var/www/html php:7.4.33-fpm

$ docker ps でコンテナの起動を確認したら、Webブラウザからアクセスができます。

なお、コンテナの停止と再開は以下のコマンドでできます。

コンテナの停止
$ docker stop php74-fpm

コンテナの再開
$ docker start php74-fpm