前回、Javaの導入ができたと信じて、次は、アプリケーションサーバー(Apache Tomcat)をインストールしていきたいと思います。
Google Cloud Platformの仮想マシンを起動し、sshログインしておきます。
Apache Tomcat用のユーザー
Apache Tomcat用のユーザーが必要になるようなので追加します。
sudo useradd -s /sbin/nologin tomcat
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
展開します。
tar -xzvf ~/apache-tomcat-9.0.0.M26.tar.gz
移動しようとすると、権限で怒られるので、sudoを付けて実行。
sudo mv ~/apache-tomcat-9.0.0.M26 /opt
一旦、「sudo su」でrootユーザー(スーパユーザー)に切り替えておきます。(コマンド入力の左側に「$」でなく「#」が表示されてればスーパユーザーになってます。)解凍した Apache Tomcat の所有者を、先ほど作成した tomcat ユーザの所有とします。
sudo su chown -R tomcat:tomcat /opt/apache-tomcat-9.0.0.M26
バージョンアップによるパスの差分をシンボリックリンクで吸収できるらしいです。
ln -s /opt/apache-tomcat-9.0.0.M26 /opt/tomcat
パスを通します。
echo 'export CATALINA_HOME=/opt/tomcat' > /etc/profile.d/tomcat.sh source /etc/profile.d/tomcat.sh
初期設定 & 起動
サービス定義ファイルの作成
vi /etc/systemd/system/tomcat.service
[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
作成した定義ファイルの権限を 755 に変更します。
chmod 755 /etc/systemd/system/tomcat.service
systemctl enable コマンドでサービスを有効にします。
systemctl enable tomcat
ファイアウォール (Firewalld) の設定
デフォルトだとFirewalledによってTomcatはブロックされてるようです。
Firewalld 自身が認識しているサービスは /usr/lib/firewalld/services/ にサービス毎に xml ファイルを作成して、xml にサービスで利用するポート番号などを記載して管理しています。 しかしユーザーがカスタマイズした設定(CentOS 7 初期状態とは異なる設定)は /etc/firewalld/services/ 内に配置するように決められています。
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
ファイアーウォールの再起動
firewall-cmd --reload
現在通信を許可しているサービスを確認
firewall-cmd --list-services --zone=public --permanent
間違えてメールサービス追加されてしまった...。今度はtomcatを追加。
firewall-cmd --add-service=tomcat --zone=public --permanent
ファイアーウォールの再起動
今度はtomcatが加わりました。
firewall-cmd --list-services --zone=public --permanent
だがしかし、起動せず!どうやら、Javaのインストールしてる場所とTomcatをインストールする場所が結構関係してくるようで、試しにスーパユーザーの状態で、
Javaが使えない状態となってます。
Tomcatをサービスでなく起動しようとしてみたところ、
やはり、スーパユーザーだとJavaが使えないとなります。
そして、systemctlコマンドは普通だとスーパユーザーでないと実行できないようですが、実行ユーザーを決めることもできるようです。
・root以外でsystemdサービスを起動 - てきとうなメモ
ですが、ちょっと難しそうです。seviceで起動する場合、
どうしてもsystemctlでの起動となり
↓
systemctlはスーパユーザーでないと実行できない
↓
スーパユーザーでjava使えない
↓
↓
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
Tomcatが起動してるか確認。
ps -ef | grep java
Tomcatの停止。
/opt/tomcat/bin/shutdown.sh
Tomcatが停止してるか確認
ps -ef | grep java
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
systemctl status tomcat
無事起動できました! 止めるときは、「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ネットワーク」>「ファイアーウォール ルール」で設定が必要のようです。
⇩ 下記サイトが詳しいです
・ Tomcat8をインストール[GCE] - ゼロからはじめるWEBプログラミング入門
2017年8月29日(火) 追記
Tomcatのクラスパスについては、デフォルトで存在しているsetclasspath.shファイルが初期化してくれているみたいです。
・ Tomcatの起動スクリプトとか – gmt-24.net
2017年9月1日(金) 追記
Apache Tomcat 9.0.0.26Mで初期画面が表示されない問題が解決できました。権限の問題でした。
⇩ 詳細はこちらの記事の終盤に載っておりますので是非是非。
・GCP(Google Cloud Platform)のCompute EngineのVMインスタンス(仮想マシン)にWinSCPで接続