[CentOS8]5分でできないTomcat9のインストール

#はじめに
昨年Javaサーブレットを用いたゲームを制作した際に超絶初心者がtomcatを構築したのでその時の備忘録です。当時はCentOS7で構築しましたが改めてCentOS8で構築してみました。

#前提と環境
・Windows10 pro 64bit上にVMware15.5.2を入れて仮想で動作
・CentOS8のiosファイルをDLしてVMwareでインストール。サーバ(GUI使用)。
　尚、簡易インストールはVMwareにCentOS8と認識されず不具合の可能性があったため手動インストール
・CentOSのバージョンは8.1.1911。tomcatのバージョンは9.0.36。
・ネットワーク全般の知識があると楽かも


#VMwareのインストール・設定
VMware自体のインストールは自分で調べてほしいですが、設定で一つ注意点。
[仮想マシン設定の編集]から[ネットワークアダプタ]を[ブリッジ]にしてください

インストール時にはrootパスワードやユーザの設定をしておいてください

#とりあえずアップデート
CentOSのデスクトップ左上のアクティビティから黒い画面のようなものをクリックして"端末"を起動。rootユーザになって行います。

```shell-session
#su -
#dnf -y update
```
アップデートが完了したら再起動しておきます。

#Java JDKのインストール
これがないとtomcatくんが動かないのでインストール。Javaのバージョンは開発環境に合わせてください。今回は11を使います。バージョンが違うと作成したアプリを実行したときにjava.lang.ClassNotFoundExceptionとか出ます(当たり前)

```shell-session
#dnf -y install java-11-openjdk
#dnf -y install java-11-openjdk-devel

#java -version
openjdk version "11.0.7" 2020-04-14 LTS
OpenJDK Runtime Environment 18.9 (build 11.0.7+10-LTS)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.7+10-LTS, mixed mode, sharing)
```
※複数のJavaバージョンをインスコしている場合実行するバージョンを選択する必要があります。その場合は`#alternatives --config java`と`#alternatives --config javac`を実行してください。
#Tomcat9のインストール
2020年6月8日時点で最新の9.0.35を使用します。

###tomcatユーザの作成
ついでにtomcatユーザをtomcatグループに入れておきます

```
#useradd -s /sbin/nologin tomcat
#usermod -aG tomcat tomcat
```
###ダウンロード＆展開
hogehogeフォルダを作成しその下にインストールします。フォルダ名は何でも構いません。

```shell-session
#mkdir /home/tomcat/hogehoge
```

ダウンロードして「/home/tomcat/hogehoge」以下に展開
/opt以下に展開するのが普通のようですが初心者の私はこうしてました。インストール場所や展開するときのユーザによってpermission deniedがでます。`/var/log/messages`を見ると解決できるかもしれません。

```shell-session
#wget /home/tomcat/hogehoge https://ftp.yz.yamagata-u.ac.jp/pub/network/apache/tomcat/tomcat-9/v9.0.36/bin/apache-tomcat-9.0.36.tar.gz

#cd /home/tomcat/hogehoge
#tar -xzvf apache-tomcat-9.0.36.tar.gz 
#chown -R tomcat:tomcat /home/tomcat/hogehoge/
```

###環境変数設定
全ユーザに設定するので/etc/profileに設定しています。

```shell-session
#vim /etc/profile

//下記を追加

JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.7.10-1.el8_1.x86_64
CATALINA_HOME=/home/tomcat/hogehoge/apache-tomcat-9.0.36
export JAVA_HOME CATALINA_HOME
```

###サービス登録
tomcatのサービスを登録します

```shell-session
#vim /etc/systemd/system/tomcat.service
```
下記を記述して保存します

```
[Unit]
Description=Apache Tomcat 9
After=network.target

[Service]
User=tomcat
Group=tomcat
Type=oneshot
PIDFile=/home/tomcat/hogehoge/apache-tomcat-9.0.36/tomcat.pid
RemainAfterExit=yes

ExecStart=/home/tomcat/hogehoge/apache-tomcat-9.0.36/bin/startup.sh
ExecStop=/home/tomcat/hogehoge/apache-tomcat-9.0.36/bin/shutdown.sh
ExecReStart=/home/tomcat/hogehoge/apache-tomcat-9.0.36/bin/startup.sh;/home/tomcat/hogehoge/apache-tomcat-9.0.36/bin/shutdown.sh

[Install]
WantedBy=multi-user.target
```
権限を付与しておきます。

```shell-session
#chmod 755 /etc/systemd/system/tomcat.service
```

###ファイヤーウォールの設定
そもそもファイアーウォールが動作しているか確認。動作していなければ起動させます

```shell-session
#systemctl status firewalld
//起動していなければ
#systemctl start firewalld
```
tomcatのポートを開けるためにfirewallにその名前を認識させます。

```
#vim /etc/firewalld/services/tomcat.xml
//下記を記述して保存

<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>Apache Tomcat 9</short>
  <description>Apache Tomcat 9</description>
  <port protocol="tcp" port="8080"/>
</service>
```
firewallのポートを開けます

```shell-session
#firewall-cmd --add-service=tomcat --zone=public --permanent
#firewall-cmd --reload
# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens160
  sources: 
  services: cockpit dhcpv6-client ssh tomcat
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:
```

##SElinuxをOFF
何かと問題がでるのでOFFにしておきます。

```shell-session
#vim /etc/sysconfig/selinux
//下記のように修正

SELINUX=disabled

```

```shell-session
#reboot
```
で再起動しておきます

###起動＆自動起動設定

```shell-session
#systemctl start tomcat

#systemctl enable tomcat
```
正常に起動したらインストール成功です。

###ブラウザからアクセス
ブラウザからアクセスしてtomcatのあの画面がでるのか確認します。
まずはIPアドレスを確認

```shell-session
#ip -4 a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    inet 192.168.11.40/24 brd 192.168.11.255 scope global dynamic noprefixroute ens160
       valid_lft 171919sec preferred_lft 171919sec
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
```
私の環境の場合`192.168.11.40`ですね。もちろん人によって変わるので自分の表示されたIPを使ってアクセスしてください。
おそらく多くの環境は`ens160`という所のIPを確認すればよいかと思います。
※ちなみにCentOS7の時はens33でした。

ホスト側(windows)ブラウザを開いて`http://192.168.11.40:8080`
でアクセスしてネコが表示されればきちんと動作しています。

#Tomcat9の設定もろもろ
そのままだと使えないので色々設定します。とりあえずmanagerにアクセスできるようにします。
###managerのログインユーザ設定
managerにアクセスする際のユーザ名とパスワードを記述します。
以下は例なので自分でユーザ名とパスワードを決めてください。

```shell-session
#vim /home/tomcat/hogehoge/apache-tomcat-9.0.36/conf/tomcat-users.xml

//下記を</tomcat-users>の上に追加

<role rolename="manager-gui"/>
  <user username="qiita" password="12345" roles="manager-gui"/>
```
ちなみに12345とかadminとかいうガバガバパスワード,ユーザ名はやめてください。
これではまだmanagerにアクセスできません。
###managerに許可するホストIPを設定

```shell-session
#vim /home/tomcat/hogehoge/apache-tomcat-9.0.36/webapps/manager/META-INF/context.xml
```
context.xmlの中に`allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1"`という記述があると思うのでその部分を下記のように修正。

```shell-session
allow="192\.168\.11\.([1-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))$|127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1"
```
これは192.168.xxx.xxxの形式をすべて許可するように正規表現で指定しています。
今回はローカルで構築したためこれで接続できますが、VPSを借りて構築した場合、自分のグローバルIPを調べ、そのIPを`allow="xxx.xxx.xxx.xxx|(以下略)`のように記述する必要があります。IPをつなげる場合は`|`を使います。

最後にtomcatを再起動します。

```shell-session
#systemctl restart tomcat
```
`http://192.168.11.40:8080/manager/html`
にアクセスして先ほど設定したユーザ名とパスワードを入力してアクセスできます。

#エラーTips的な
##起動できない場合のログは/var/log/messages
大体permission deniedかSElinuxが原因

##時刻は合っているか
私の環境だとCentOS8がなぜかアメリカ時間になってた。。。
`#timedatectl set-timezone Asia/Tokyo`で変更できる


##〇〇のsyntax error
コピペしたときに全角空白が入ってたり文字の順番がぐちゃぐちゃになる。
空白はみえないのでややこしい。vimで十字キーを押しまくって　がないか調べよう。