ApacheLinuxTomcatVirtualBox

VirtualBox上のLinux環境でTomcatを動かしてみる。

はじめに

前回、VirtualBox上のLinux環境をApatch HTTP Severを使用してWebサーバ化できたので、今回はTomcatを用いてアプリケーションサーバを構築してみる。

本記事のゴール

  • Java8のインストール
  • Tomcatのダウンロードおよび配置
  • Tomcat用サービスの作成と登録
  • Tomcatのテストページを表示する

なお、本記事はApache Tomcat 9 を CentOS 7 にインストールする手順 |を参考にさせていただきました。

環境

  • Windows 10 64bit
  • VirtualBox 6.1.12
  • Centos 8.2
  • openjdk 1.8.0_262
  • Tomcat 9.0.37

事前知識

Tomcatとは

  • Java Servletを動かすためのソフトウェアで、サーブレットコンテナとも呼ばれる
  • 正式名称はApache Tomcatなので、Apache HTTP Serverとごっちゃにならないようにする。
  • Apache HTTP Serverと連係して使われることが多い。

Java Servletとは

  • サーバー上で実行されるJavaプログラムのこと
  • 動的なページ生成が可能

環境構築手順

Java8(OpenJDK)のインストール

今回はJavaアプリケーションの開発はホスト側で行うでのサーバ側はJavaランタイムのみインストールします。

[root@localhost ~]# yum install java-1.8.0-openjdk -y

インストール出来たことを確認します。

[root@localhost ~]# java -version
openjdk version "1.8.0_262"
OpenJDK Runtime Environment (build 1.8.0_262-b10)
OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode)

バージョンが1.8.0で表示されているのでJavaのインストール完了です。

Javaランタイムとは

  • Javaで作られたアプリを動かすために必要なものをまとめたもの。
  • 正式には、JRE(Java Runtime Enviroment)と呼ばれる。

Tomcatのダウンロード

まず、サーバ側でTomcatを動かすための専用ユーザーtomcatを追加します。

# -s /sbin/nologinをつけることでログインできなユーザーを作成できる。
useradd -s /sbin/nologin tomcat

次にcurlコマンドを使用して、Tomcatをダウンロードします。
curlコマンドで指定しているtomcatのバージョンについては、2020年8月時点で最新バージョンの9.0.37をダウンロードしています。

最新バージョンに置き換えたい場合はTomcatダウンロードページにアクセスし、Core内のtar.gzの上で右クリック⇒リンクアドレスのコピーで取得したURLに置き換えてください。

f:id:ashitaka1963:20200815094452p:plain

※以降、Tomcatのバージョンが記載されている箇所についてはダウンロードしたバージョンに置き換える。

# rootユーザーのホームディレクトリに移動する。
[root@localhost ~]# cd ~
# ホームディレクトリ配下にtomcatをダウンロードする。
[root@localhost ~]# curl -O https://ftp.kddi-research.jp/infosystems/apache/tomcat/tomcat-9/v9.0.37/bin/apache-tomcat-9.0.37.tar.gz

ダウンロードしたファイルをtarコマンドで解凍し、/opt配下に配置します。
また、解凍したファイルの所有者も変更します。

# ファイルの解凍
[root@localhost ~]# tar -xzvf apache-tomcat-9.0.37.tar.gz
# /opt配下に移動
[root@localhost ~]# mv apache-tomcat-9.0.37 /opt
# 所有者の変更
[root@localhost ~]# chown -R tomcat:tomcat /opt/apache-tomcat-9.0.37

サービスの作成と登録

ダウンロードしたTomcatをサービスとして登録します。

以下、コマンドを入力してサービス定義ファイルであるtomcat.serviceを作成します。

[root@localhost ~]# vi /etc/systemd/system/tomcat.service

tomcat.service

以下の内容をコピペする。ただし、バージョン記載部分についてはダウンロードした物に置き換える。

[Unit]
Description=Apache Tomcat 9
After=network.target
[Service]
User=tomcat
Group=tomcat
Type=oneshot
PIDFile=/opt/apache-tomcat-9.0.37/tomcat.pid
RemainAfterExit=yes
ExecStart=/opt/apache-tomcat-9.0.37/bin/startup.sh
ExecStop=/opt/apache-tomcat-9.0.37/bin/shutdown.sh
ExecReStart=/opt/apache-tomcat-9.0.37/bin/shutdown.sh;/opt/apache-tomcat-9.0.37/bin/startup.sh
[Install]
WantedBy=multi-user.target

保存できたら次のコマンドでファイルの権限を変更します。

[root@localhost ~]# chmod 755 /etc/systemd/system/tomcat.service

サービス定義ファイルの作成が完了したのでApacheの時と同様に有効にして、再起動します。

[root@localhost ~]# systemctl enable tomcat
Created symlink /etc/systemd/system/multi-user.target.wants/tomcat.service → /etc/systemd/system/tomcat.service.
# 再起動
[root@localhost ~]# reboot

実行確認

tomcatが起動されているかステータス確認してみると、エラーが発生しているので対応していく。

[root@localhost ~]# systemctl status tomcat
● tomcat.service - Apache Tomcat 9
Loaded: loaded (/etc/systemd/system/tomcat.service; enabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Fri 2020-08-14 04:17:07 EDT; 1min 43s ago
Main PID: 902 (code=exited, status=203/EXEC)
814 04:17:07 localhost.localdomain systemd[1]: Starting Apache Tomcat 9...
814 04:17:07 localhost.localdomain systemd[1]: tomcat.service: Main process exited, code=exited, status=203/EXEC
814 04:17:07 localhost.localdomain systemd[1]: tomcat.service: Failed with result 'exit-code'.
814 04:17:07 localhost.localdomain systemd[1]: Failed to start Apache Tomcat 9.
814 04:18:41 localhost.localdomain systemd[1]: /etc/systemd/system/tomcat.service:14: Unknown lvalue 'ExecReStart' in section 'Service'
814 04:18:46 localhost.localdomain systemd[1]: /etc/systemd/system/tomcat.service:14: Unknown lvalue 'ExecReStart' in section 'Service'

サービスを開始してみるとやっぱり落ちてしまってるみたい。。

[root@localhost ~]# systemctl start tomcat
Job for tomcat.service failed because the control process exited with error code.
See "systemctl status tomcat.service" and "journalctl -xe" for details.

出力されたログの通りコマンドを入力してログを見てみる。

[root@localhost ~]# journalctl -xe
# 赤文字部分を一部抜粋
814 04:20:56 localhost.localdomain setroubleshoot[2266]: SELinux is preventing (artup.sh) from execute access on the file startup.sh. For complete SELinux messages run: sealert -l 99b91766-a265-4d33-8>

ログを見てみる限りSELinuxが原因っぽいので、一旦無効化してみる。
今回は手探りでPermissiveにしているが本当にこれでよいかどうかは今後勉強してみようと思う。

# SELinuxの動作モードを恒久的に`Permissive`に変更
[root@localhost ~]# vi /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=enforcing ← ★ここを`permissive`に変更する。
# SELINUXTYPE= can take one of these three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

もっかいサービス起動してみて状態を確認してみると正常に起動している。

# tomcatサービスのステータス確認(Active: activeなので正常に起動している。)
[root@localhost ~]# systemctl status tomcat
● tomcat.service - Apache Tomcat 9
Loaded: loaded (/etc/systemd/system/tomcat.service; enabled; vendor preset: disabled)
Active: active (exited) since Fri 2020-08-14 04:25:15 EDT; 7s ago
Process: 2322 ExecStart=/opt/apache-tomcat-9.0.37/bin/startup.sh (code=exited, status=0/SUCCESS)
Main PID: 2322 (code=exited, status=0/SUCCESS)
Tasks: 14 (limit: 11324)
Memory: 158.4M
CGroup: /system.slice/tomcat.service
└─2336 /usr/bin/java -Djava.util.logging.config.file=/opt/apache-tomcat-9.0.37/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKey>
814 04:25:15 localhost.localdomain systemd[1]: Starting Apache Tomcat 9...
814 04:25:15 localhost.localdomain systemd[1]: Started Apache Tomcat 9.

ゲストOSからTomcatのテストページを表示する

無事に起動できてるっぽいので、ゲストOSからTomcatのテストページを開いてみると表示されることを確認できた!

# Tomcatのデフォルトのポート番号は8080
[root@localhost ~]# curl http://localhost:8080
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Apache Tomcat/9.0.37</title>
<link href="favicon.ico" rel="icon" type="image/x-icon" />
<link href="favicon.ico" rel="shortcut icon" type="image/x-icon" />
<link href="tomcat.css" rel="stylesheet" type="text/css" />
</head>
<body>
# 長いので割愛。
</body>
</html>

ホストOSからゲストOSのTomcatのテストページを表示する

まず初めにApacheのとき同じようにVirtualBoxのポートフォワーディングの設定を行う。
(Apacheが8080を設定していてややこしかったので、そこらへんも併せて修正しています。)

f:id:ashitaka1963:20200815101018p:plain

  • 名前
    • 任意の名前(今回はTomcatとする)
  • プロトコル
    • TCP
  • ホストIP
    • (空白)
  • ホストポート
    • 任意の数字(今回は8080)
  • ゲストIP
    • (空白)
  • ホストポート
    • 8080(tomcatのポート番号)

次にホストOSからの8080番ポートへのアクセスはファイアウォールにより遮断されてしまうので、設定を行います。

まず、firewallに読み込ませるtomcat用の設定ファイルを作成します。

vi /etc/firewalld/services/tomcat.xml

中身は以下の内容をコピペする

<?xml version="1.0" encoding="utf-8"?>
<service>
<short>Apache Tomcat</short>
<description>Apache Tomcat</description>
<port protocol="tcp" port="8080"/>
</service>

先ほど作成したtomcatファイルをfirewalldに読み込ませる。

# --permanent       : 恒久設定(これを指定しないと再起動時のこの設定が消えてしまう。)
# --zone=public     : ゾーン設定(要確認)
# --add-service     : 追加するサービスを指定
[root@localhost ~]# firewall-cmd --zone=public --permanent --add-service=tomcat
success
# サービスの再起動(設定ファイルを読み込む。)
[root@localhost ~]# systemctl restart firewalld

ホストOSのブラウザからhttp://localhost:8080/にアクセスしてみて以下のページが表示されたら完了。

f:id:ashitaka1963:20200815101254p:plain

おわりに

SELinuxの設定当たりで一度躓きましたが、無事にゴールとしていたところまで無事に辿り着けました。

次回は、今回飛ばしたSELinuxの設定やApache HTTP Serverとの連携部分をやっていきたいと思います。

参考サイト