Linux(EC2)にapache+Tomcatをインストール

こんにちは。しゃっくです。

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

※ハマった箇所にも記載しましたがAJPの設定をデフォルトから

 変更しています。

  • secretRequired=”false” 追加
  • address=”::1″ 削除

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ファイルなど基本的なところも

あまりわかっていませんでしたが、今回のことを通してかなりイメージが掴めました。

この記事がどなたかの役に立てばと思います。

1 COMMENT

Ryuji Matsuo

ありがとうございました!
めっちゃ役に立ちました!
またよろしくお願いします☆

返信する

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です