リハビリ&社内勉強用のために作成します。第3弾。
#用意するもの
・PC
・インターネット
・TeraTarm
・WinSCP ※ファイル転送時
#用語
EC2(EC2インスタンス)
AWSにおけるIaasのサーバ。#2で作成したEC2を流用します。
Tomcat
APサーバ用のソフトウェア(MW)。
OpenJDK
Javaの実行環境諸々を詰め込んだパッケージ。JREとか色々あるけど違いはここ参照。
#ゴール
Webサーバと同じサーバ内にTomcatをインストールして、Apacheと連携できることを確認する。
#手順
##1.OpenJDKインストール
Javaの実行環境であるOpenJDKをインストールします。ちなみにTomcatとの互換性があるのでTomcatを入れる際は注意。
[ec2-user@ip-10-0-1-236 opt]$ yum search java-
#javaのパッケージ検索。今回は1.8が新しそうだったので、それをインストールすることに。
[ec2-user@ip-10-0-1-236 opt]$ sudo yum -y install java-1.8.0-openjdk
#Complite!となればOK
[ec2-user@ip-10-0-1-236 opt]$ sudo yum -y install java-1.8.0-openjdk-devel
#Complite!となればOK
#開発用環境パッケージ、ついでにインストール
[ec2-user@ip-10-0-1-236 opt]$ java -version
openjdk version "1.8.0_282"
OpenJDK Runtime Environment (build 1.8.0_282-b08)
OpenJDK 64-Bit Server VM (build 25.282-b08, mixed mode)
#バージョン確認完了
##2.Tomcatインストール
Apacheはインストール時に自動でユーザ作成されたが、Tomcatは自分で作成する。
[ec2-user@ip-10-0-1-236 html]$ sudo useradd -s /sbin/nologin tomcat
#Tomcatを動かすための専用ユーザを作成。
#MWが利用する、通常利用しない(ログインできない)ユーザを作成する。
[ec2-user@ip-10-0-1-236 html]$ sudo cat /etc/passwd | grep tomcat
tomcat:x:1001:1001::/home/tomcat:/sbin/nologin
#ユーザができていることを確認。
Tomcatをインストール。Apache/Tomcatサイトの「Download」からインストールしたいTomcatのページを選んでCoreの「tar.gz」ファイルを右クリックし「リンクのアドレスをコピー」し、そのリンクからインストールする。Tomcat10は最近出たばかりなのでTomcat9にて。
[ec2-user@ip-10-0-1-236 /]$ sudo curl -O https://downloads.apache.org/tomcat/tomcat-9/v9.0.45/bin/apache-tomcat-9.0.45.tar.gz
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 264 100 264 0 0 484 0 --:--:-- --:--:-- --:--:-- 484
#ファイル取得完了。
[ec2-user@ip-10-0-1-236 /]$ sudo tar -zxvf apache-tomcat-9.0.45.tar.gz
#ファイル展開(解凍)。
#tarコマンドで圧縮・展開する。
[ec2-user@ip-10-0-1-236 /]$ sudo mv apache-tomcat-9.0.45 /opt
#追加アプリケーションを置くためのディレクトリ「/opt」にファイルを移動。
#mv 移動元 移動先 でファイル移動。
[ec2-user@ip-10-0-1-236 /]$ ls -ltr /opt
drwxr-xr-x 2 root root 6 Aug 16 2018 rh
drwxr-xr-x 4 root root 33 Apr 24 09:38 aws
drwxr-xr-x 9 root root 220 May 2 14:55 apache-tomcat-9.0.45
#移動していることを確認。
[ec2-user@ip-10-0-1-236 /]$ sudo chown -R tomcat:tomcat /opt/apache-tomcat-9.0.45
#tomcatユーザで動かしてもらうので権限を変更して
[ec2-user@ip-10-0-1-236 /]$ ls -ltr /opt
total 0
drwxr-xr-x 2 root root 6 Aug 16 2018 rh
drwxr-xr-x 4 root root 33 Apr 24 09:38 aws
drwxr-xr-x 9 tomcat tomcat 220 May 2 14:55 apache-tomcat-9.0.45
#変更状態を確認。
##3.Tomcat起動設定(飛ばしてもOK)
続いてApache同様にsystemコマンドで落とし上げできるように設定する。Apacheと異なり手動で実行ファイルを配備しているので、このあたりの作業も自分でやる必要あり。やらなくても困らないので興味のある人だけ。
[ec2-user@ip-10-0-1-236 /]$ sudo touch /etc/systemd/system/tomcat.service
[ec2-user@ip-10-0-1-236 /]$ sudo vi /etc/systemd/system/tomcat.service
#内容は下記参照
[ec2-user@ip-10-0-1-236 /]$ sudo ls -ltr /etc/systemd/system/tomcat.service
-rw-r--r-- 1 root root 406 May 2 15:12 /etc/systemd/system/tomcat.service
[ec2-user@ip-10-0-1-236 /]$ sudo chmod 755 /etc/systemd/system/tomcat.service
#他のユーザへも実行権限を付与。
[ec2-user@ip-10-0-1-236 /]$ sudo ls -ltr /etc/systemd/system/tomcat.service
-rwxr-xr-x 1 root root 406 May 2 15:12 /etc/systemd/system/tomcat.service
[ec2-user@ip-10-0-1-236 /]$ sudo systemctl enable tomcat
Created symlink from /etc/systemd/system/multi-user.target.wants/tomcat.service to /etc/systemd/system/tomcat.service.
#systemctlでの自動起動を有効化
service設定は他サイトも試したのですがうまくいかず、試行錯誤して以下になりました。
(root設定は良くないと分かりつつ、権限エラーを超えられなかった・・・)
[ec2-user@ip-10-0-1-236 opt]$ sudo cat /etc/systemd/system/tomcat.service
[Unit]
Description=Apache Tomcat 9
After=network.target
[Service]
Type=oneshot
ExecStart=/opt/apache-tomcat-9.0.45/bin/startup.sh
ExecStop=/opt/apache-tomcat-9.0.45/bin/shutdown.sh
RemainAfterExit=yes
User=root
Group=root
[Install]
WantedBy=multi-user.target
設定は終わったのでTomcatの起動確認
[ec2-user@ip-10-0-1-236 opt]$ sudo systemctl stop tomcat
[ec2-user@ip-10-0-1-236 opt]$ sudo systemctl status tomcat
● tomcat.service - Apache Tomcat 9
Loaded: loaded (/etc/systemd/system/tomcat.service; enabled; vendor preset: disabled)
Active: inactive (dead) since Sun 2021-05-02 16:29:47 UTC; 18min ago
Process: 5294 ExecStop=/opt/apache-tomcat-9.0.45/bin/shutdown.sh (code=exited, status=0/SUCCESS)
Process: 5258 ExecStart=/opt/apache-tomcat-9.0.45/bin/startup.sh (code=exited, status=0/SUCCESS)
Main PID: 5258 (code=exited, status=0/SUCCESS)
May 02 16:29:36 ip-10-0-1-236.us-west-2.compute.internal systemd[1]: Starting Apache Tomcat 9...
May 02 16:29:36 ip-10-0-1-236.us-west-2.compute.internal startup.sh[5258]: Tomcat started.
May 02 16:29:36 ip-10-0-1-236.us-west-2.compute.internal systemd[1]: Started Apache Tomcat 9.
May 02 16:29:47 ip-10-0-1-236.us-west-2.compute.internal systemd[1]: Stopping Apache Tomcat 9...
May 02 16:29:47 ip-10-0-1-236.us-west-2.compute.internal systemd[1]: Stopped Apache Tomcat 9.
[ec2-user@ip-10-0-1-236 opt]$
[ec2-user@ip-10-0-1-236 opt]$ sudo systemctl start tomcat
[ec2-user@ip-10-0-1-236 opt]$ sudo systemctl status tomcat
● tomcat.service - Apache Tomcat 9
Loaded: loaded (/etc/systemd/system/tomcat.service; enabled; vendor preset: disabled)
Active: active (exited) since Sun 2021-05-02 16:47:57 UTC; 1s ago
Process: 5294 ExecStop=/opt/apache-tomcat-9.0.45/bin/shutdown.sh (code=exited, status=0/SUCCESS)
Process: 5506 ExecStart=/opt/apache-tomcat-9.0.45/bin/startup.sh (code=exited, status=0/SUCCESS)
Main PID: 5506 (code=exited, status=0/SUCCESS)
CGroup: /system.slice/tomcat.service
mq5520 /usr/bin/java -Djava.util.logging.config.file=/opt/apache-tomcat-9.0.45/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.hand...
May 02 16:47:57 ip-10-0-1-236.us-west-2.compute.internal systemd[1]: Starting Apache Tomcat 9...
May 02 16:47:57 ip-10-0-1-236.us-west-2.compute.internal startup.sh[5506]: Tomcat started.
May 02 16:47:57 ip-10-0-1-236.us-west-2.compute.internal systemd[1]: Started Apache Tomcat 9.
##4.Tomcatへのアクセス確認
実はTomcatはWebサーバ用のMWとしての機能(というかApache)も内包しています。
ということでアクセスしてみましょう。
[ec2-user@ip-10-0-1-236 opt]$ sudo netstat -anp | grep java
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 5418/java
tcp6 0 0 :::8080 :::* LISTEN 5418/java
#Tomcatのポートは8080。
[ec2-user@ip-10-0-1-236 opt]$ curl http://localhost:8080
#curlコマンドで8080ポートを打つとTomcatのトップページが表示されるはず
「https://+グローバルIP:8080」でトップページが表示される。
##5.ApacheとTomcatの連携
次にApacheとTomcatを連携します。今までApacheは80番、Tomcatは8080番でWebブラウザからのアクセス(HTTP)を受けていました。ここではWebブラウザからのアクセスと同様に、ApacheからTomcatのポートへ接続させるよう設定します。
まず、以下のファイルを見てみます。
[ec2-user@ip-10-0-1-236 opt]$ sudo less /opt/apache-tomcat-9.0.45/conf/server.xml
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
~略~
<Connector protocol="AJP/1.3"
address="::1"
port="8009"
redirectPort="8443" />
-->
#lessコマンドでメッセージやテキストファイルを1画面ずつ表示できます。/で検索も可能です。
上記を見ると、HTTPは8080ポートで受けていることが分かります。一方でTomcatと連携するためのにはAJPプロトコルというプロトコルが必要です。見てみると8009ポートであることが分かります。8009ポートの設定がコメントアウト(<!-- -->で挟まれてる)されていればコメントアウトを削除しましょう。
上記の設定を踏まえて、まずはApacheが8009ポートに接続するように設定しましょう。
[ec2-user@ip-10-0-1-236 opt]$ sudo cat /etc/httpd/conf/httpd.conf | grep Include
Include conf.modules.d/*.conf
IncludeOptional conf.d/*.conf
Apacheのモジュール(部品)はconf.modules.d/にあるようなので、中身を見てみます。
[ec2-user@ip-10-0-1-236 opt]$ sudo ls /etc/httpd/conf.modules.d
00-base.conf 00-lua.conf 00-optional.conf 00-systemd.conf 10-h2.conf README
00-dav.conf 00-mpm.conf 00-proxy.conf 01-cgi.conf 10-proxy_h2.conf
[ec2-user@ip-10-0-1-236 opt]$ sudo cat /etc/httpd/conf.modules.d/00-proxy.conf
# This file configures all the proxy modules:
LoadModule proxy_module modules/mod_proxy.so
LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so
LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_express_module modules/mod_proxy_express.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
LoadModule proxy_fdpass_module modules/mod_proxy_fdpass.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_hcheck_module modules/mod_proxy_hcheck.so
LoadModule proxy_scgi_module modules/mod_proxy_scgi.so
LoadModule proxy_uwsgi_module modules/mod_proxy_uwsgi.so
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
今回ApacheはTomcatのプロキシとして動くので、プロキシのモジュールを見てみます。AJPに利用するmod_proxy_ajpとmod_proxy(mod_proxy_ajpの親玉)がモジュールに含まれていればOKです。
次に、mod_proxy_ajpモジュールが8009ポートに行くように設定を入れておきます。
sudo vi /etc/httpd/conf.d/proxy-ajp.conf
<Location /docs/>
ProxyPass ajp://127.0.0.1:8009/docs/
</Location>
<Location /itskill_bbs/>
ProxyPass ajp://127.0.0.1:8009/itskill_bbs/
</Location>
ここで、127.0.0.1は自分自身を指す特別なIPアドレス(ローカル・ループバック・アドレス)です。今回はApacheと同じサーバにTomcatがいるので、自分自身のIPの8009ポートを指定しています。<Location ・・・>にはhtmlに表示するPATHを、127.0.0.1:8009・・・には読みこみたいwarファイル名(warが自動展開されてディレクトリ名になるので、そのディレクトリ名)を入力します。docsはデフォルトで存在するので以下のURLでTomcatのページが出ればOK、80番ポートでアクセスしていることを確認できます。
http://[グローバルIP]/docs
##6.warのデプロイ
最後にアプリケーションファイル(warファイル)を配備(デプロイ)します。
ファイル転送は慣れているWinSCPを利用しました。ec2-userでも権限のある/tmpに配備しmvするのがお勧めです。
[ec2-user@ip-10-0-1-236 tmp]$ sudo mv /tmp/itskill_bbs.war /opt/apache-tomcat-9.0.45/webapps
#備忘
・Tomcatのトップページが全然開かないと思ったらSG設定で8080ポート閉じてたせいだった・・・curlでローカル内で叩いたら上手くいくのに気づきました。
#参考
①Linux(CentOS)にApacheとTomcatをインストールしてJavaアプリをデプロイするまで
②Linuxにおける色々なユーザー管理コマンド
③[Linux]ファイルの圧縮、解凍方法
④Apache についてのまとめ
⑤127.0.0.1とlocalhostと0.0.0.0の違い