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

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

新規登録して質問してみよう
ただいま回答率
85.36%
Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

Q&A

解決済

2回答

29885閲覧

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

ami613

総合スコア20

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

0グッド

0クリップ

投稿2020/04/23 07:05

編集2020/04/23 08:15

前提

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

実現したいこと

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

設定

■ EC2

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

■ Apache

■ 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で再起動はかけております。
何か足りない情報がございましたら、ご指摘いただければ追記を致します。
何卒宜しくお願い致します。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/04/23 08:18

SELINUX の設定で httpd が外部ポートにアクセスできる設定ですか?
ami613

2020/04/23 08:32

ご回答ありがとうございます。 SELINUXという単語を初めて聞き、調べたのですが、外部ポートにアクセスできる設定になっているかわからず...。 下記のコマンドを実行し、Disabledとなっていることは確認しました。 # getenforce なので、SELINUXは無効になっております。 すみません、回答になっておりませんね(汗)
xebme

2020/04/23 10:14

以前、AWSにSpringをデプロイしたときの設定 /etc/httpd/conf/extra/httpd-proxy.conf ではなく(バージョンが古くないか?) /etc/httpd/conf.d/mod_ajp_proxy.confに<location> を記述しました。 httpd.confの末尾には、includeをひとつだけ記述しています。 IncludeOptional conf.d/*.conf mod_ajp_proxy.conf Tomcat9 あたりで検索してください。
ami613

2020/04/23 11:18

xebme様 ご回答ありがとうございます! mod_ajp_proxy.confに下記のように記述して試したのですが、同じく503エラーでした...。 ``` <Location /test/> ProxyPass ajp://localhost:8009/ </Location> ``` ただ、上記のように<Location /test/>と記載して、 ・http://パブリックIPアドレス/test/とアクセス → 503エラー画面が表示される ・http://パブリックIPアドレス/testhoge/とアクセス → 404エラー画面が表示される ので、pathのマッピング(?)はちゃんと効いていて、ApacheからTomcatへリクエストするときに何か通信を阻害している要因があるのかなと思っています...。 Apacheのerror_logを見ても、それっぽいなと思っていて、このあたりを調査しようと考えております。 pathの記述に関しては、xebme様のおっしゃったとおり、<location>でいこうと思います!ありがとうございます!
xebme

2020/04/23 11:27

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

2020/04/23 11:31

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

2020/04/23 11:41 編集

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

回答2

0

ベストアンサー

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 12:44

編集2020/04/23 13:28
TaichiYanagiya

総合スコア12173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ami613

2020/04/23 13: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) ``` どんどん答えに近付いてきている感じがあり、うれしいです。 ありがとうございます(:_;)
ami613

2020/04/24 08:10

追記をしていただきご、ありがとうございます<(_ _)> > tomcat 起動時に以下のようなログが出ていませんでしょうか。 まさにおっしゃっている通りのログが出ていて、server.xmlにてsecretRequired="false"のオプションを設定したところ、ajpによる通信ができるようになりました! > CVE-2020-1938 に関連するかもしれないので、よく調べた方がいいと思います。 貴重な情報を、ありがとうございます(:_;) 調べたところ、私の環境でインストールしてあるTomcatのバージョンは9.0.34なので、大丈夫そうです...! こういった脆弱性の情報もキャッチアップしていく必要があると、大変勉強になりました。 TaichiYanagiya様より教えていただいたおかげで、ajpでの接続を実現することができました。 ありがとうございました!
ami613

2020/05/16 00:48

TaichiYanagiya様 お世話になっております。 以前は本質問にご回答いただき、誠にありがとうございました。 実は、本質問に関連する質問を、また投稿致しました。 関連質問:https://teratail.com/questions/262009 大変恐縮ですが、もしお時間がございましたら見ていただけますと大変幸甚に存じます。 ご検討くださいますよう何卒よろしくお願い致します<(_ _)>
guest

0

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接続がエラーになるので、あらかじめ以下のコマンドを実行しておきます。

bash

1/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配下のオプションファイルはすべてインクルードする。

conf

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

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

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

conf

1<location /manager/> 2 ProxyPass ajp://localhost:8009/manager/ 3</location>

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

投稿2020/04/23 11:12

編集2020/04/23 11:15
xebme

総合スコア1090

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ami613

2020/04/23 12: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. ```
xebme

2020/04/23 19:14 編集

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

2020/04/24 08:00

ご返信ありがとうございます<(_ _)> > managerアプリはデフォルトでlocalhostからしかアクセスできない。 そうなのですね、勉強になります...! > managerは無視してmod_ajp_proxyの接続に集中してください。 ajpによる接続、できました...! xebme様よりTomcatやApacheの設定を丁寧かつ体系的に教えていただけたおかげで、本当に勉強になりました。 ありがとうございました!
ami613

2020/05/16 00:49

xebme様 お世話になっております。 以前は本質問にご回答いただき、誠にありがとうございました。 実は、本質問に関連する質問を、また投稿致しました。 関連質問:https://teratail.com/questions/262009 大変恐縮ですが、もしお時間がございましたら見ていただけますと大変幸甚に存じます。 ご検討くださいますよう何卒よろしくお願い致します<(_ _)>
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問