こんにちは。しゃっくです。
javaの環境構築のための学習として
Linux(EC2)にapacheとTomcatをインストールしwarのデプロイをしてみました。
全体の流れ
- Linux(EC2)インスタンス起動
- apacheインストール
- JDKインストール
- Tomcatインストール
- apache、Tomcatの連携(リバースプロキシの設定)
- デプロイ(war配置)
- Linux(EC2)ポート開放
LinuxにWEBサーバとしてapache、APサーバとしてTomcatをインストール。
その後apacheからTomcatへのリバースプロキシの設定を行い、Tomcatにwarをデプロイ。
最後にhttpアクセスして起動確認を行います。
Linux(EC2)インスタンス起動
Linuxサーバは「Amazon Linux 2 AMI (HVM) – Kernel 4.14, SSD Volume Type」を選択
後は無料枠の範囲でインスタンスを起動。
起動後、rootユーザのパスワード設定を行います。
(初期設定ではrootユーザのパスワードが設定されていないので、ログインできません。)
ec2-userでログイン後、rootユーザに変更
# su - root
パスワード変更。
# passwd
パスワード設定後、確認のためもう一度同様のパスワードを入力し設定完了となります。
apacheインストール
apacheのインストールはyumで行います。
rootユーザに変更
# su - root
apacheインストール
# yum -y install httpd
apacheを自動起動に登録
# systemctl enable httpd
apache起動
# systemctl start httpd
apache起動確認。「active」で起動、「inactive」で停止。
# systemctl status httpd
JDKインストール
JDKはOpenJDK8を使用します。
OpenJDK8はyumでインストールします。
OpenJDK8インストール
# yum install java-1.8.0-openjdk
インストール確認(バージョン確認)
# java -version
Tomcatインストール
以下のような流れでインストール
- TomcatのOSユーザ作成
- Tomcatインストール
- システム管理デーモン設定(自動起動設定)
TomcatはApache Tomcat9のダウンロードページから最新版をcurlで取得します。
TomcatのOSユーザ作成
Tomcatユーザ作成
# useradd -d /opt/tomcat -s /sbin/login -M tomcat
確認
# cat /etc/passwd | grep tomcat
Tomcatインストール
tar.gzダウンロード⇒解凍⇒シンボリックリンク作成 の流れ。
tar.gzダウンロード(※URLはApache Tomcat9のダウンロードページのtar.gzのリンクよりコピー)
# cd /opt
# curl -O https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.58/bin/apache-tomcat-9.0.58.tar.gz
解凍
# tar zxvf apache-tomcat-9.0.58.tar.gz
シンボリックリンク作成
# ln -s /opt/apache-tomcat-9.0.58 /opt/tomcat
所有者変更
# chown -R tomcat:tomcat /opt/tomcat/
# chown -h tomcat:tomcat /opt/tomcat
tar.gz削除
# rm -f /opt/apache-tomcat-9.0.58.tar.gz
システム管理デーモン設定(自動起動設定)
systemd環境変数ファイル作成
# vi /etc/sysconfig/tomcat
/etc/sysconfig/tomcat ファイル内容
JAVA_HOME="/usr/lib/jvm/jre"
CATALINA_HOME="/opt/tomcat"
CATALINA_BASE="/opt/tomcat"
CATALINA_OPTS="-server -Xmx128m -Xms128m -XX:MaxMetaspaceSize=128m"
systemdユニットファイル作成
# vi /usr/lib/systemd/system/tomcat.service
/usr/lib/systemd/system/tomcat.service ファイル内容
[Unit]
Description=Apache Tomcat application server.
After=network.target
[Service]
Type=forking
User=tomcat
Group=tomcat
EnvironmentFile=/etc/sysconfig/tomcat
ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh
[Install]
WantedBy=multi-user.target
権限変更
# chmod 755 /usr/lib/systemd/system/tomcat.service
ユニットファイルリロード
# systemctl daemon-reload
tomcatを自動起動に登録
# systemctl enable tomcat.service
tomcat起動
# systemctl start tomcat.service
tomcat起動確認
# systemctl status tomcat.service
以上でTomcatのインストールは完了。
apache、Tomcatの連携(リバースプロキシの設定)
apacheとTomcatを連携させます。
連携にはAJP (Apache JServ Protocol)というプロトコルを使用します。
Tomcatポート変更
server.xml 変更
# vim /opt/tomcat/conf/server.xml
ファイルを以下のように変更(AJPのポート(8009)開放、8080ポート遮断)
<!-- <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> -->
<Connector protocol="AJP/1.3" secretRequired="false" port="8009" redirectPort="8443" />
apche リバースプロキシの設定
00-proxy.conf 変更
# vim /etc/httpd/conf.modules.d/00-proxy.conf
ファイルの最下行に以下を追加
ProxyPass / ajp://localhost:8009/
apache再起動
停止⇒起動
# systemctl stop httpd
# systemctl start httpd
デプロイ(war配置)
Tomcatのページからサンプルwarファイルをダウンロードしてデプロイします。
まずはTomcatのデプロイフォルダに不要なアプリケーションが入っているので
削除してから配置します。
不要アプリケーション削除
# rm -rf /opt/tomcat/webapps/*
サンプルwarダウンロード
# curl -O https://tomcat.apache.org/tomcat-9.0-doc/appdev/sample/sample.war
移動
# mv sample.war /opt/tomcat/webapps/
所有者変更
# chown tomcat:tomcat /opt/tomcat/webapps/sample.war
Linux(EC2)ポート開放
セキュリティグループのインバウンドルールでHTTPポート(80)を開放。
sampleのページが見れました。
※ハマった箇所
ハマった箇所は2点
- Tomcatの起動エラー
- apache⇒TomcatでTomcatまで届かない
Tomcatの起動エラー
Tomcatの起動がうまくいかず、ログを参照したところ以下のようなエラーが出ていました。
参照したログは /opt/tomcat/logs/catalina.2022-02-13.log
13-Feb-2022 08:42:53.210 SEVERE [main] org.apache.catalina.util.LifecycleBase.handleSubClassException Failed to start component [Connector[AJP/1.3-8009]]
org.apache.catalina.LifecycleException: Protocol handler start failed
at org.apache.catalina.connector.Connector.startInternal(Connector.java:1075)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at org.apache.catalina.core.StandardService.startInternal(StandardService.java:449)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:927)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
at org.apache.catalina.startup.Catalina.start(Catalina.java:772)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:345)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:476)
Caused by: java.lang.IllegalArgumentException: The AJP Connector is configured with secretRequired="true" but the secret attribute is either null or "". This combination is not valid.
at org.apache.coyote.ajp.AbstractAjpProtocol.start(AbstractAjpProtocol.java:270)
at org.apache.catalina.connector.Connector.startInternal(Connector.java:1072)
... 12 more
ネットで検索したところ server.xml のAJPの設定で
secretRequired=”false” が不足していましたので追加しました。
apache⇒TomcatでTomcatまで届かない
ブラウザでアクセスしましたがsampleページが表示できない状態となりました。
アクセスログを見るとapacheまでは届いているが、Tomcatまで行けていませんでした。
server.xml のAJPの設定で、「address=”::1″」との設定があったのですが
IPv6の設定なので不要なため削除しました。
まとめ
apacheやTomcatはWebサーバと認識しており構築方法や役割などは全く知りませんでした。
javaについても結構無知なところが多く、JDKやWARファイルなど基本的なところも
あまりわかっていませんでしたが、今回のことを通してかなりイメージが掴めました。
この記事がどなたかの役に立てばと思います。
ありがとうございました!
めっちゃ役に立ちました!
またよろしくお願いします☆