Java Eclipseの動的 WebプロジェクトをWebサーバで公開までの道のり Apache Tomcatのインストール

前回、Javaの導入ができたと信じて、次は、アプリケーションサーバー(Apache Tomcat)をインストールしていきたいと思います。

Google Cloud Platformの仮想マシンを起動し、sshログインしておきます。  

Apache Tomcat用のユーザー

Apache Tomcat用のユーザーが必要になるようなので追加します。

sudo useradd -s /sbin/nologin tomcat

f:id:ts0818:20170826125313j:plain

 

Apache Tomcatのダウンロード

curlコマンドでApache Tomcatをダウンロード。バージョンは9でいきます。

curl -O http://www-eu.apache.org/dist/tomcat/tomcat-9/v9.0.0.M26/bin/apache-tomcat-9.0.0.M26.tar.gz

f:id:ts0818:20170826125312j:plain

展開します。

tar -xzvf ~/apache-tomcat-9.0.0.M26.tar.gz

f:id:ts0818:20170826125314j:plain

移動しようとすると、権限で怒られるので、sudoを付けて実行。

sudo mv ~/apache-tomcat-9.0.0.M26 /opt

f:id:ts0818:20170826125315j:plain

一旦、「sudo su」でrootユーザー(スーパユーザー)に切り替えておきます。(コマンド入力の左側に「$」でなく「#」が表示されてればスーパユーザーになってます。)解凍した Apache Tomcat の所有者を、先ほど作成した tomcat ユーザの所有とします。

sudo su
chown -R tomcat:tomcat /opt/apache-tomcat-9.0.0.M26

f:id:ts0818:20170826125316j:plain

バージョンアップによるパスの差分をシンボリックリンクで吸収できるらしいです。

ln -s /opt/apache-tomcat-9.0.0.M26 /opt/tomcat

f:id:ts0818:20170826125317j:plain

パスを通します。

echo 'export CATALINA_HOME=/opt/tomcat'  >  /etc/profile.d/tomcat.sh
source /etc/profile.d/tomcat.sh

f:id:ts0818:20170826125318j:plain

 

初期設定 & 起動

サービス定義ファイルの作成

vi /etc/systemd/system/tomcat.service

f:id:ts0818:20170826125320j:plain

 

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

f:id:ts0818:20170827102027j:plain

作成した定義ファイルの権限を 755 に変更します。

chmod 755 /etc/systemd/system/tomcat.service

f:id:ts0818:20170826125322j:plain

 

systemctl enable コマンドでサービスを有効にします。

systemctl enable tomcat

f:id:ts0818:20170826125321j:plain

 

ファイアウォール (Firewalld) の設定

デフォルトだとFirewalledによってTomcatはブロックされてるようです。 

f:id:ts0818:20170826125324j:plain

Firewalld 自身が認識しているサービスは /usr/lib/firewalld/services/ にサービス毎に xml ファイルを作成して、xml にサービスで利用するポート番号などを記載して管理しています。 しかしユーザーがカスタマイズした設定(CentOS 7 初期状態とは異なる設定)は /etc/firewalld/services/ 内に配置するように決められています。

Apache Tomcat 9 を CentOS 7 にインストールする手順 | WEB ARCH LABO

Tomcat 9 を許可するようにユーザー定義のファイアーウォールの設定ファイルを作成します。

vi /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>

「Esc」キーを押した後、「:wq」で保存。Firewalld に上で作成した tomcat の通信を許可させます。

firewall-cmd --add-service=smtp --zone=public --permanent

f:id:ts0818:20170826125328j:plain

ファイアーウォールの再起動

firewall-cmd --reload

f:id:ts0818:20170826125329j:plain

現在通信を許可しているサービスを確認

firewall-cmd --list-services --zone=public --permanent

f:id:ts0818:20170826125332j:plain

間違えてメールサービス追加されてしまった...。今度はtomcatを追加。

firewall-cmd --add-service=tomcat --zone=public --permanent

f:id:ts0818:20170826125330j:plain

ファイアーウォールの再起動

f:id:ts0818:20170826125329j:plain

今度はtomcatが加わりました。

firewall-cmd --list-services --zone=public --permanent

f:id:ts0818:20170826125331j:plain

だがしかし、起動せず!どうやら、Javaのインストールしてる場所とTomcatをインストールする場所が結構関係してくるようで、試しにスーパユーザーの状態で、

f:id:ts0818:20170827102016j:plain

Javaが使えない状態となってます。 

Tomcatをサービスでなく起動しようとしてみたところ、

f:id:ts0818:20170827102015j:plain

やはり、スーパユーザーだとJavaが使えないとなります。

そして、systemctlコマンドは普通だとスーパユーザーでないと実行できないようですが、実行ユーザーを決めることもできるようです。

root以外でsystemdサービスを起動 - てきとうなメモ

ですが、ちょっと難しそうです。seviceで起動する場合、

どうしてもsystemctlでの起動となり

   

systemctlはスーパユーザーでないと実行できない 

   

スーパユーザーでjava使えない

   

java使えないからTomcat動かない

   

systenctl start tomcatは失敗する

という流れでしょうか?だが、しかし、tomcat.serviceファイルでユーザー指定をしていたので、実行ユーザーを指定していたことになるようです。

ですが、/optでもJavaが有効になっていないところを見ると、やはりJavaのインストール場所を、/usr/local/javaではなく、/usr/javaにしたほうが良さそうです。

 

苦肉の策として、前回の追記に記載したようにJavaのインストール先を変更します。

Java Eclipseの動的 WebプロジェクトをWebサーバで公開までの道のり まずはJavaのインストール

⇧  こちらを参考ください。

 

で、変更すると、Serviceを使わないTomcatの起動はいけるようになりました!

/opt/tomcat/bin/startup.sh

f:id:ts0818:20170827102024j:plain

Tomcatが起動してるか確認。

ps -ef | grep java

f:id:ts0818:20170827102023j:plain

Tomcatの停止。

/opt/tomcat/bin/shutdown.sh

f:id:ts0818:20170827102025j:plain 

Tomcatが停止してるか確認

ps -ef | grep java

f:id:ts0818:20170827102026j:plain

ServiceとしてではないTomcatの起動・停止は行われるようになりました。

う~ん、serviceとしてのTomcat起動の解決に時間がかかりそうな予感です。見本のサイトだとすんなり解決してるっぽいんですが....。

 

Apache Tomcat 9 を CentOS 7 にインストールする手順 | WEB ARCH LABO

CentOS7にTomcat8を構築する方法 - Qiita

CentOS7にTomcat8をインストールして自動起動設定 - Qiita

 

2017年8月28日(月) 追記

⇩  Tomcatの設定ファイル(setenv.sh)というものを作成する必要があるようです。

LinuxサーバへのTomcat 7導入 (Tomcatインストール)

 

その前に、/etc/bashrcに記述していた環境変数を/etc/profileに移します。

export JAVA_HOME=/usr/java/jdk1.8.0_144
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

の部分を、/etc/profileの末尾に追加し、/etc/bashrcからは消しときます。

 

続いて、/opt/tomcat/binにsetenv.shというファイルを作成します。

vi /opt/tomcat/bin/setenv.sh

ファイルに下記を追加します。

JAVA_HOME=/usr/java/jdk1.8.0_144

ログファイルへの権限の問題でエラーになる場合があるので、

chown -R tomcat:tomcat /opt/tomcat/logs
chmod -R u+rw /opt/tomcat/logs

そして、tomcatをserviceとして実行してみます。

systemctl start tomcat    

f:id:ts0818:20170828071144j:plain 

systemctl status tomcat

f:id:ts0818:20170828071143j:plain

無事起動できました! 止めるときは、「systemctl stop tomcat」で。

ちなみに、serviceの起動でエラーがあると、

Job for tomcat.service failed because the control process exited with error code. See "systemctl status tomcat.service" and "journalctl -xe" for details.

と表示されると思うので、メッセージ通り、

journalctl -xe

とコマンドを実行すると詳細な情報が表示されます。

ブラウザからTomcatの起動を確認するには、Google Cloud Platform側で「VPCネットワーク」>「ファイアーウォール ルール」で設定が必要のようです。

f:id:ts0818:20170828071206j:plain

⇩  下記サイトが詳しいです

Tomcat8をインストール[GCE] - ゼロからはじめるWEBプログラミング入門

 

2017年8月29日(火) 追記

Tomcatのクラスパスについては、デフォルトで存在しているsetclasspath.shファイルが初期化してくれているみたいです。

f:id:ts0818:20170829221945j:plain

 

Tomcatの起動スクリプトとか – gmt-24.net

 

2017年9月1日(金) 追記

Apache Tomcat 9.0.0.26Mで初期画面が表示されない問題が解決できました。権限の問題でした。

⇩  詳細はこちらの記事の終盤に載っておりますので是非是非。

GCP(Google Cloud Platform)のCompute EngineのVMインスタンス(仮想マシン)にWinSCPで接続