はじめに
前回、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に置き換えてください。
※以降、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) 8月 14 04:17:07 localhost.localdomain systemd[1]: Starting Apache Tomcat 9... 8月 14 04:17:07 localhost.localdomain systemd[1]: tomcat.service: Main process exited, code=exited, status=203/EXEC 8月 14 04:17:07 localhost.localdomain systemd[1]: tomcat.service: Failed with result 'exit-code'. 8月 14 04:17:07 localhost.localdomain systemd[1]: Failed to start Apache Tomcat 9. 8月 14 04:18:41 localhost.localdomain systemd[1]: /etc/systemd/system/tomcat.service:14: Unknown lvalue 'ExecReStart' in section 'Service' 8月 14 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 # 赤文字部分を一部抜粋 8月 14 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> 8月 14 04:25:15 localhost.localdomain systemd[1]: Starting Apache Tomcat 9... 8月 14 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を設定していてややこしかったので、そこらへんも併せて修正しています。)
- 名前
- 任意の名前(今回は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/にアクセスしてみて以下のページが表示されたら完了。
おわりに
SELinuxの設定当たりで一度躓きましたが、無事にゴールとしていたところまで無事に辿り着けました。
次回は、今回飛ばしたSELinuxの設定やApache HTTP Serverとの連携部分をやっていきたいと思います。