Azure
Tomcat
centos7

Azure上に構築したCentOS7.4にTomcatをインストールしたときのメモ書き

前提

割とはまったので備忘録としてメモ

デフォルト設定変更

Azureでは標準設定が英語のため、下記設定変更を実施する。

$ sudo cat /etc/locale.conf
LANG="en_US.UTF-8"
$ sudo localectl set-locale LANG=ja_JP.UTF-8
$ source /etc/locale.conf
$ echo $LANG
ja_JP.UTF-8
$ date
Fri Mar 23 12:04:15 UTC 2018
$ sudo rm -f /etc/localtime 
$ sudo cp -p /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
$ ls -l /etc/localtime
-rw-r--r--. 1 root root 292 Oct 25 20:11 /etc/localtime
$ date
Fri Mar 23 21:18:05 JST 2018

JDKインストール

Java SEから最新版のJDKをダウンロード。※
(http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)
※Accept License Agrementのラジオボタンをチェック忘れず。

$ wget http://download.oracle.com/otn-pub/java/jdk/8u161-b12/2f38c3b165be4555a1fa6e98c45e0808/jdk-8u161-linux-x64.tar.gz
$ ls -l
total 8
-rw-rw-r--. 1 work work 5307 Mar 20  2012 jdk-8u161-linux-x64.tar.gz

ダウンロードしたが、サイズがおかしい。
調べてみると下記の様なオプションを使用しなければダウンロードができないとのこと。

$ wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u161-b12/2f38c3b165be4555a1fa6e98c45e0808/jdk-8u161-linux-x64.tar.gz
$ ls -l
total 185312
-rw-rw-r--. 1 work work 189756259 Dec 20 19:10 jdk-8u161-linux-x64.tar.gz

解凍してjdkの配置先を作成。その後パスを通す。

$ tar zxvf jdk-8u161-linux-x64.tar.gz
$ sudo mkdir /opt/java
$ sudo mv jdk1.8.0_161/ /opt/java/

$ sudo vim /etc/profile
#JAVA_PATH
JAVA_HOME=/opt/java/jdk1.8.0_161/
PATH=$PATH:$JAVA_HOME/bin

JDKは以上。

Apache Tomcat インストール

公式から最新版のファイルをダウンロード。
(https://tomcat.apache.org/download-80.cgi)
その後解凍し配置先にディレクトリを移動する。

$ wget http://www-eu.apache.org/dist/tomcat/tomcat-8/v8.5.29/bin/apache-tomcat-8.5.29.tar.gz
$ sudo tar zxvf apache-tomcat-8.5.29.tar.gz
$ sudo mkdir /opt/tomcat
$ sudo mv apache-tomcat-8.5.29/ /opt/tomcat/

Tomcat実行用のユーザを作成。

$ sudo useradd -s /sbin/nologin tomcat
$ sudo chown -R tomcat:tomcat /opt/tomcat/

Systemd用のTomcatのUnitファイルを作成。

$ sudo vim /usr/lib/systemd/system/tomcat8.service

[Unit]
Description=Apache Tomcat 8
After=network.target

[Service]
Type=oneshot
User=tomcat
Group=tomcat
PIDFile=/opt/tomcat/apache-tomcat-8.5.29/tomcat.pid
RemainAfterExit=yes
ExecStart=/opt/tomcat/apache-tomcat-8.5.29/bin/startup.sh
ExecStop=/opt/tomcat/apache-tomcat-8.5.29/bin/shutdown.sh

[Install]
WantedBy=multi-user.target

準備は終了。いざ起動して確認。

$ sudo systemctl start tomcat8
Job for tomcat8.service failed because the control process exited with error code. See "systemctl status tomcat8.service" and "journalctl -xe" for details.
$ sudo journalctl -xe
-- Unit tomcat8.service has begun starting up.
 3月 23 23:37:46 WebAP01-H startup.sh[36774]: Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
 3月 23 23:37:46 WebAP01-H startup.sh[36774]: At least one of these environment variable is needed to run this program
 3月 23 23:37:46 WebAP01-H systemd[1]: tomcat8.service: main process exited, code=exited, status=1/FAILURE
 3月 23 23:37:46 WebAP01-H systemd[1]: Failed to start Apache Tomcat 8.
-- Subject: Unit tomcat8.service has failed
-- Defined-By: systemd

エラー。jounalctl -xeで状況確認すると環境変数を読み込めていないように見える。

調べるとsystemdはprofileに設定した環境変数を読まないとのこと。
環境変数をUnit設定ファイルに記載。もしくはtomcatのbin配下にsetenv.shを作成しそこに記載することで対応可能。
参考(https://qiita.com/Monota/items/3f715def67d53ba2f2a2)

今回はsetenv.shを作成しそこに環境変数を記載する。

$ sudo vim /opt/tomcat/apache-tomcat-8.5.29/bin/setenv.sh
#JAVA_PATH
JAVA_HOME=/opt/java/jdk1.8.0_161/
PATH=$PATH:$JAVA_HOME/bin
#Tomcat_PATH
CATALINA_HOME=/opt/tomcat/apache-tomcat-8.5.29/

$ sudo systemctl daemon-reload
$ sudo systemctl start tomcat8
$ sudo systemctl status tomcat8
● tomcat8.service - Apache Tomcat 8
   Loaded: loaded (/usr/lib/systemd/system/tomcat8.service; disabled; vendor preset: disabled)
   Active: active (exited) since 金 2018-03-23 23:39:17 JST; 3s ago
  Process: 36890 ExecStart=/opt/tomcat/apache-tomcat-8.5.29/bin/startup.sh (code=exited, status=0/SUCCESS)
 Main PID: 36890 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/tomcat8.service
           mq36898 /opt/java/jdk1.8.0_161//bin/java -Djava.util.logging.config.file=/opt/tomcat/apache-tomcat-8.5.29/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.Clas...

 3月 23 23:39:17 WebAP01-H systemd[1]: Starting Apache Tomcat 8...
 3月 23 23:39:17 WebAP01-H startup.sh[36890]: Using CATALINA_BASE:   /opt/tomcat/apache-tomcat-8.5.29
 3月 23 23:39:17 WebAP01-H startup.sh[36890]: Using CATALINA_HOME:   /opt/tomcat/apache-tomcat-8.5.29/
 3月 23 23:39:17 WebAP01-H startup.sh[36890]: Using CATALINA_TMPDIR: /opt/tomcat/apache-tomcat-8.5.29/temp
 3月 23 23:39:17 WebAP01-H startup.sh[36890]: Using JRE_HOME:        /opt/java/jdk1.8.0_161/
 3月 23 23:39:17 WebAP01-H startup.sh[36890]: Using CLASSPATH:       /opt/tomcat/apache-tomcat-8.5.29//bin/bootstrap.jar:/opt/tomcat/apache-tomcat-8.5.29/bin/tomcat-juli.jar
 3月 23 23:39:17 WebAP01-H systemd[1]: Started Apache Tomcat 8.

再度起動して確認したところ問題なく起動した。終了。

Tomcat manager設定

このままであると、Tomcatの画面にはアクセスできるが、Managerにアクセスができないので下記設定を実施する。

ロール設定

tomcat-users.xmlに下記6つのロールを追加する。
追加したロールを割り当てるuserについても追加する。

$ sudo vim /opt/tomcat/apache-tomcat-8.5.29/conf/tomcat-users.xml
  <role rolename="manager-gui"/>
  <role rolename="manager-status"/>
  <role rolename="manager-script"/>
  <role rolename="manager-jmx"/>
  <role rolename="admin-gui"/>
  <role rolename="admin-script"/>
  <user username="admin" password="xxxxxx" roles="manager-gui,manager-status,manager-script,manager-jmx,admin-gui,admin-script"/>

アクセス制限

403エラーが表示された際のエラーページによるとデフォルトの場合同じ端末のみアクセス可能な仕組みとのこと。

By default the Manager is only accessible from a browser running on the same machine as Tomcat. If you wish to modify this restriction, you'll need to edit the Manager's context.xml file.

リモートからアクセスする場合はcontext.xml ファイルを編集する必要がある。※
※"Server Status"、"Manager App"はmanagerで"Host Manager"はhost-manaeger以下のcontextファイルで二つあることに注意。

$ sudo vim /opt/tomcat/apache-tomcat-8.5.29/webapps/manager/META-INF/context.xml
<Context antiResourceLocking="false" privileged="true" >
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="^([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))$" />

$ sudo vim /opt/tomcat/apache-tomcat-8.5.29/webapps/host-manager/META-INF/context.xml
<Context antiResourceLocking="false" privileged="true" >
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="^([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))\.([0-9]|[1-9][0-9]|1([0-9][0-9])|2([0-4][0-9]|5[0-5]))$" />

allowは正規表現で書く必要があり、全てを許可する場合上の様な正規表現になる。
サービスを再起動しエラーが出ずにアクセスできることを確認し、終了。