CentOS Stream 9 への Apache Tomcat インストール:本番環境向けの「実践的」ノウハウ

CentOS tutorial - IT technology blog
CentOS tutorial - IT technology blog

なぜ企業の選択肢として VM 上の Tomcat が依然として有力なのか?

CentOS 7 から CentOS Stream 9 へのシステム移行を半年間経験して分かったことがあります。Docker や Kubernetes が全盛の時代ですが、仮想マシン(VM)上で Apache Tomcat を直接動かすことには独自のメリットがあります。レガシーな Java Web アプリケーションの場合、この方法が I/O パフォーマンスを最適化しやすく、デバッグも格段に容易です。CentOS Stream 9 と JDK 17 または 21 の組み合わせは、安定性の面で現在非常に相性が良いです。

実際に私が担当したプロジェクトでは、最大の難関はコードではありませんでした。問題は、RHEL ベースの環境におけるサービス管理や権限の競合から生じることが多いです。Firewall や SELinux の設定方法を熟知していないと、アプリが外部と通信できない理由を探すだけで一日を費やすことになります。

システム要件

クリーンな CentOS Stream 9(または Rocky/AlmaLinux)サーバーが必要です。本記事では、Jakarta EE の機能を活用するために Tomcat 10 を選択します。注意点として、Java をスムーズに動作させるために、最低 2GB の RAM を搭載したサーバーを用意してください。

ステップ 1:OpenJDK 17 LTS のインストール

Tomcat の動作には Java が不可欠です。今回は、パフォーマンスが非常に高く、長期サポートが提供されている OpenJDK 17 を優先して使用します。

sudo dnf update -y
sudo dnf install java-17-openjdk-devel -y

インストール完了後、以下のコマンドを入力して確認してください:

java -version

もし openjdk version "17.x.x" という行が表示されれば、土台の準備は完了です。パッケージの依存関係でトラブルが生じた場合は、dnf パッケージマネージャーのログを確認することをお勧めします。

ステップ 2:専用ユーザーの作成 — 決して Root を使用しないこと

「手軽だから」という理由で Tomcat を root 権限で実行する習慣があるかもしれませんが、これは極めて危険な間違いです。アプリケーションにリモートコード実行(RCE)の脆弱性があった場合、ハッカーにサーバー全体を乗っ取られてしまいます。サービスを隔離するために、シェル権限を持たない専用ユーザーを作成しましょう。

sudo useradd -m -U -d /opt/tomcat -s /bin/false tomcat

このコマンドは、ホームディレクトリを /opt/tomcat とした tomcat ユーザーを作成しますが、直接ログインはできないように設定します。

ステップ 3:Apache Tomcat 10 のダウンロードと解凍

公式サイトから最新の 10.1.x バージョンのリンクを取得してください。セキュリティパッチが随時更新されるため、古いバージョンのリンクをそのままコピーしないよう注意してください。

cd /tmp
wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.18/bin/apache-tomcat-10.1.18.tar.gz

# 直接インストール先ディレクトリに解凍
sudo tar -xf apache-tomcat-10.1.18.tar.gz -C /opt/tomcat --strip-components=1

次に、ディレクトリの所有権を適切なユーザーに変更します:

sudo chown -R tomcat:tomcat /opt/tomcat
sudo chmod -R g+r /opt/tomcat/conf
sudo chmod g+x /opt/tomcat/conf
sudo chown -R tomcat /opt/tomcat/webapps/ /opt/tomcat/work/ /opt/tomcat/temp/ /opt/tomcat/logs/

ステップ 4:Systemd によるプロフェッショナルな Tomcat 管理

手動で startup.sh を実行するのは避けましょう。Tomcat をサービス化して、OS 起動時に自動開始するようにします。これにより、journalctl を通じてログを一元管理できるようになり、運用が非常に楽になります。

サービス設定ファイルを作成します:

sudo nano /etc/systemd/system/tomcat.service

以下の内容を貼り付けます。-Xmx1024M のパラメータに注目してください。サーバーに 4GB の RAM がある場合は、最適化のためにこの数値を 2048M に引き上げてください。

[Unit]
Description=Apache Tomcat Web Application Container
After=network.target

[Service]
Type=forking

User=tomcat
Group=tomcat

Environment="JAVA_HOME=/usr/lib/jvm/jre"
Environment="JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom"

Environment="CATALINA_BASE=/opt/tomcat"
Environment="CATALINA_HOME=/opt/tomcat"
Environment="CATALINA_PID=/opt/tomcat/temp/tomcat.pid"
Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseG1GC"

ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh

[Install]
WantedBy=multi-user.target

直ちにサービスを有効化します:

sudo systemctl daemon-reload
sudo systemctl enable --now tomcat

ステップ 5:ファイアウォールポートの開放

デフォルトでは Tomcat はポート 8080 でリッスンしますが、CentOS 9 は外部からの接続をすべてブロックします。接続を許可するために「門」を開放する必要があります:

sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload

もし server.xml でポートを変更した場合は、対応するファイアウォールコマンドも忘れずに更新してください。

ステップ 6:Web マネージャーの設定

Web 管理画面を使用するには、tomcat-users.xml ファイルで権限を付与する必要があります。

sudo nano /opt/tomcat/conf/tomcat-users.xml

十分に強力なパスワードを設定した admin ユーザーを追加します:

<role rolename="manager-gui"/>
<user username="admin" password="ChouKyoukoPassword2024!" roles="manager-gui"/>

デフォルトでは、Tomcat は localhost からのアクセスのみを許可しています。リモート IP からアクセスしたい場合は、webapps/manager/META-INF/context.xml に移動し、IP を制限している Valve セクションをコメントアウトする必要があります。

まとめ:運用現場からの教訓

インストールして終わりではありません。システムを 24 時間 365 日安定して稼働させるために、以下の 3 つの重要なポイントに注意してください:

  • 定期的なログ確認: アプリで問題が発生した際、最初に確認すべき場所は catalina.out ファイルです。
  • RAM の最適化: -Xmx がサーバーの全 RAM の 70% を超えないようにしてください。そうしないと、メモリ不足時に OS が Tomcat プロセスを強制終了(OOM Kill)してしまいます。
  • リバースプロキシの活用: 実務では、私は常に Tomcat の前に Nginx を配置しています。Nginx が SSL や Gzip 圧縮を担当し、Tomcat は Java ロジック의 処理だけに集中させる構成にします。

これらの共有が、皆さんの迅速かつ安全なシステム構築に役立つことを願っています。成功を祈ります!

Share: