質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.59%

ajpによるTomcatとApacheの連携について

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 10K+

score 20

前提

自己学習の一環として、Java11、SpringBootによる開発を行っております。
サーバーはAWSのEC2(OSはAmazonLinux2)を使用しています。
warパッケージを生成し、EC2内のTomcatに配備し、プログラムを公開したいと思っています。

実現したいこと

EC2にインストールしたApacheとTomcatを、ajpで連携をさせたいです。
具体的には、「http://パブリックIP/」 でアクセスした際に、SpringBootで作成したWebアプリケーションのトップページが表示されるようにしたいです。

設定

■ EC2

  • ElasticIPでパブリックIPアドレスを固定してあります。
  • セキュリティグループで 80 と 8080 番のポートを開放しています。

■ Apache

  • インストール :yumでインストール
  • バージョン:Apache2.4.41
  • 設定  :自動起動設定を有効にしてあります。
  • 挙動   :「http://パブリックIP/」でアクセスすると、Apacheのデモページが表示されます。

■ Tomcat

  • インストール :wgetで最新版をインストール
  • バージョン:Tomcat9.0.34
  • 設定  :サービス登録をし、自動起動設定を有効にしてあります。
  • 挙動  :「http://パブリックIP:8080」でアクセスすると、Tomcatのデモページが表示されます。

また、webappsフォルダに「test」という名称のwarファイルを配備しています。
「http://パブリックIP:8080/test」でアクセスすると、SpringBootで作成したアプリのトップページが表示されます。

上記の設定後、ApacheとTomcatを連携するために試したこと

■ Tomcat

  • /opt/apache-tomcat/conf/server.xmlで、8009番ポートのコメントを解除
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector protocol="AJP/1.3"
           address="::1"
           port="8009"
           redirectPort="8443" />

■ Apache

  • /etc/httpd/conf.modules.d/00-proxy.confで、モジュールが有効になっていることを確認
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
  • Try① /etc/httpd/conf/httpd.confに直接設定を書き込む
ProxyPass / ajp://localhost:8009/test/
  • Try② 外部ファイルを読み込む
    /etc/httpd/conf/extra/httpd-proxy.confを作成
ProxyPass / ajp://localhost:8009/test/


/etc/httpd/conf/httpd.confで読み込む

Include /etc/httpd/conf/extra/httpd-proxy.conf

発生している問題・エラーメッセージ

Try① , Try② の状態で http://パブリックIP でアクセスすると、503エラー の画面が表示される。

Service Unavailable
The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.

Apacheのerror_log

[Thu Apr 23 17:04:30.937589 2020] [proxy:error] [pid 17809] (111)Connection refused: AH00957: AJP: attempt to connect to 127.0.0.1:8009 (localhost) failed
[Thu Apr 23 17:04:30.937648 2020] [proxy_ajp:error] [pid 17809] [client 自分のグローバルIP] AH00896: failed to make connection to backend: localhost

備考

ApacheやTomcatといったミドルウェアに疎く、なかなか実現ができません。。。
一応、設定ファイルを変更したらsystemctl restartで再起動はかけております。
何か足りない情報がございましたら、ご指摘いただければ追記を致します。
何卒宜しくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • xebme

    2020/04/23 20:27

    webアプリケーションがtestならマッピングの末尾も/test/
    ProxyPass ajp://localhost:8009/test/

    キャンセル

  • ami613

    2020/04/23 20:31

    あ、本当ですね...!

    ただ、
    ProxyPass ajp://localhost:8009/test/ に修正し、
    http://パブリックIPアドレス/test/ にアクセスしたのですが、
    同じく503エラーでした...。

    キャンセル

  • xebme

    2020/04/23 20:35 編集

    SELINUXを調べてください。Linuxを再起動すると戻っているかもしれない。httpdの設定を再読み込みしていますか?

    キャンセル

回答 2

checkベストアンサー

+1

503 エラーについて、
server.xml で address="::1" と指定がありますが、これは IPv6 のみで LISTEN するのではないでしょうか。
address="127.0.0.1" または address 行を削除してみてください。


(2020/04/23 22:28) 追記
tomcat 起動時に以下のようなログが出ていませんでしょうか。

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.

secretRequired="false" を設定すれば、とりあえず接続できると思いますが、CVE-2020-1938 に関連するかもしれないので、よく調べた方がいいと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/04/23 22:16

    ご回答ありがとうございます!
    すごい、「address="127.0.0.1"」にしてみたのですが、挙動が変わりました...!
    ※ 修正前の「address="::1"」だと、IPv6のみでLISTENになるのですね!

    ただ、今度は通信がタイムアウトになってしまいました。

    ■ /etc/httpd/logs/error_log
    ```
    [core:notice] [pid 19929] AH00094: Command line: '/usr/sbin/httpd -D FOREGROUND'
    [Thu Apr 23 21:59:01.626871 2020] [proxy_ajp:error] [pid 19932] (70007)The timeout specified has expired: AH01030: ajp_ilink_receive() can't receive header
    [Thu Apr 23 21:59:01.626928 2020] [proxy_ajp:error] [pid 19932] [client 私のPCのグローバルIPアドレス] AH00992: ajp_read_header: ajp_ilink_receive failed
    [Thu Apr 23 21:59:01.626934 2020] [proxy_ajp:error] [pid 19932] (70007)The timeout specified has expired: [client 私のPCのグローバルIPアドレス] AH00878: read response failed from 127.0.0.1:8009 (localhost)
    ```

    どんどん答えに近付いてきている感じがあり、うれしいです。
    ありがとうございます(:_;)

    キャンセル

  • 2020/04/24 17:10

    追記をしていただきご、ありがとうございます<(_ _)>

    > tomcat 起動時に以下のようなログが出ていませんでしょうか。
    まさにおっしゃっている通りのログが出ていて、server.xmlにてsecretRequired="false"のオプションを設定したところ、ajpによる通信ができるようになりました!

    > CVE-2020-1938 に関連するかもしれないので、よく調べた方がいいと思います。
    貴重な情報を、ありがとうございます(:_;)
    調べたところ、私の環境でインストールしてあるTomcatのバージョンは9.0.34なので、大丈夫そうです...!
    こういった脆弱性の情報もキャッチアップしていく必要があると、大変勉強になりました。

    TaichiYanagiya様より教えていただいたおかげで、ajpでの接続を実現することができました。
    ありがとうございました!

    キャンセル

  • 2020/05/16 09:48

    TaichiYanagiya様

    お世話になっております。
    以前は本質問にご回答いただき、誠にありがとうございました。

    実は、本質問に関連する質問を、また投稿致しました。
    関連質問:https://teratail.com/questions/262009

    大変恐縮ですが、もしお時間がございましたら見ていただけますと大変幸甚に存じます。
    ご検討くださいますよう何卒よろしくお願い致します<(_ _)>

    キャンセル

+1

AWS Spring

以前、AWSにSpringをデプロイしました。同じやり方で手元のFedora31で動作確認してみました。

環境

httpd -v
Server version: Apache/2.4.43 (Fedora)
Server built:   Mar 31 2020 00:00:00

Apache Tomcat/9.0.31     
1.8.0_222-b10     Amazon.com Inc. (Amazon Coretto)
Linux     5.5.17-200.fc31.x86_64     amd64

selinux

/etc/selinux/config

私の環境では、selinux強制になっています。

SELINUX=enforcing
SELINUXTYPE=targeted

mod_ajp接続がエラーになるので、あらかじめ以下のコマンドを実行しておきます。

/usr/sbin/setsebool -P httpd_can_network_connect true

設定

/opt/apache-tomcat/conf/server.xml (わたしの環境は/usr/share/tomcat/...)
/etc/httpd/conf.modules.d/00-proxy.conf
ここまで質問と同じ設定です。

/etc/httpd/conf/httpd.conf

末尾にインクルードが1行。conf.d配下のオプションファイルはすべてインクルードする。

# Supplemental configuration
#
# Load config files in the "/etc/httpd/conf.d" directory, if any.
IncludeOptional conf.d/*.conf

/etc/httpd/conf.d/mod_ajp_proxy.conf

mod_ajp_proxy.confという名前は.confで終わればなんでも良い。記述方法は以下のとおり。managerはTomcatの管理用Webアプリケーションです。

<location /manager/>
    ProxyPass ajp://localhost:8009/manager/
</location>

以前はSELINUXが問題になりました。ログを調べて、httpd/tomcatのどちらが問題なのか、調査範囲を狭めるようにしてください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/04/23 21:00

    色々と本当にありがとうございます...!

    ■ selinux
    /etc/selinux/configを確認すると、下記のようになっていました。
    ```
    SELINUX=disabled
    SELINUXTYPE=targeted
    ```
    こちら、AmazonLinux2だとデフォルトでdisabledになっているようです。

    ■ /etc/httpd/conf.d/mod_ajp_proxy.conf
    同じく、下記のようにして試してみました。
    ```
    <location /manager/>
    ProxyPass ajp://localhost:8009/manager/
    </location>
    ```
    これで「http://IPアドレス/manager/」にアクセスをすると、やはり503エラーでした...。
    しかし、試しに「http://IPアドレス:8080/manager/」のように、ajp経由ではなく、直接Tomcatの8080番ポートめがけてアクセスをしてみたのですが、すると403エラーが出ました(詳細内容は下記)
    マネージャー画面が出ないということは、Tomcat側の設定がなにかおかしい...?

    ともあれ、少しずつ真相に近付いているように感じております。
    設定のことなどもご丁寧に解説していただき、誠にありがとうございます(:_;)

    ```
    403 Access Denied
    You are not authorized to view this page.

    By default the Manager is only accessible from a browser running on the same machine as Tomcat. If you wish to modify this restriction, you'll need to edit the Manager's context.xml file.

    If you have already configured the Manager application to allow access and you have used your browsers back button, used a saved book-mark or similar then you may have triggered the cross-site request forgery (CSRF) protection that has been enabled for the HTML interface of the Manager application. You will need to reset this protection by returning to the main Manager page. Once you return to this page, you will be able to continue using the Manager application's HTML interface normally. If you continue to see this access denied message, check that you have the necessary permissions to access this application.

    If you have not changed any configuration files, please examine the file conf/tomcat-users.xml in your installation. That file must contain the credentials to let you use this webapp.

    For example, to add the manager-gui role to a user named tomcat with a password of s3cret, add the following to the config file listed above.

    <role rolename="manager-gui"/>
    <user username="tomcat" password="s3cret" roles="manager-gui"/>
    Note that for Tomcat 7 onwards, the roles required to use the manager application were changed from the single manager role to the following four roles. You will need to assign the role(s) required for the functionality you wish to access.

    manager-gui - allows access to the HTML GUI and the status pages
    manager-script - allows access to the text interface and the status pages
    manager-jmx - allows access to the JMX proxy and the status pages
    manager-status - allows access to the status pages only
    The HTML interface is protected against CSRF but the text and JMX interfaces are not. To maintain the CSRF protection:

    Users with the manager-gui role should not be granted either the manager-script or manager-jmx roles.
    If the text or jmx interfaces are accessed through a browser (e.g. for testing since these interfaces are intended for tools not humans) then the browser must be closed afterwards to terminate the session.
    For more information - please see the Manager App How-To.
    ```

    キャンセル

  • 2020/04/23 22:43 編集

    これは正しい動作です。説明していなったので驚いたと思います。
    managerアプリはデフォルトでlocalhostからしかアクセスできない。context.xmlを変更すること。
    managerアプリはadmin権限とパスワードを要求することが書かれています。

    managerは無視してmod_ajp_proxyの接続に集中してください。

    キャンセル

  • 2020/04/24 17:00

    ご返信ありがとうございます<(_ _)>

    > managerアプリはデフォルトでlocalhostからしかアクセスできない。
    そうなのですね、勉強になります...!

    > managerは無視してmod_ajp_proxyの接続に集中してください。
    ajpによる接続、できました...!
    xebme様よりTomcatやApacheの設定を丁寧かつ体系的に教えていただけたおかげで、本当に勉強になりました。
    ありがとうございました!

    キャンセル

  • 2020/05/16 09:49

    xebme様

    お世話になっております。
    以前は本質問にご回答いただき、誠にありがとうございました。

    実は、本質問に関連する質問を、また投稿致しました。
    関連質問:https://teratail.com/questions/262009

    大変恐縮ですが、もしお時間がございましたら見ていただけますと大変幸甚に存じます。
    ご検討くださいますよう何卒よろしくお願い致します<(_ _)>

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る