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

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

ただいまの
回答率

88.37%

さくらのVPSでApacheとTomcatを連携したい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 731

kumaGoro_95

score 1

前提

自分で作成したJavaアプリをWeb上にアップしたいと思い、VPSサーバーをレンタルしApache,JDK,Tomcatをインストールしました。80番ポートでApacheのtestページ、8080番ポートでTomcatのtestページを表示させるところまでは問題なくできたのですが、ApacheとTomcatを連携させることができず困っています。

設定

  • VPS
    ・さくらのVPS
    ・OS:CentOS Linux release 7.8.2003
  • JDK
    ・バージョン:1.8.0_262
    ・インストール方法:yum
  • Apache
    ・バージョン:Apache2.4.6
    ・インストール方法:yum
  • Tomcat
    ・バージョン:apache-tomcat9.0.37
    ・インストール方法:wgetで最新版をインストール

実現したいこと

ApacheとTomcatをajpで連携したい。「http://IPアドレス/examples」で、tomcatのページが表示されるようにしたい。

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

http://IPアドレス/examples でアクセスすると、503エラーの画面が表示される。

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

Apacheのエラーログについては以下の通りです。

[Mon Sep 07 20:02:49.425625 2020] [proxy:error] [pid 2152] (111)Connection refused: AH00957: AJP: attempt to connect to 160.16.151.224:8009 (160.16.151.224) failed
[Mon Sep 07 20:02:49.425783 2020] [proxy:error] [pid 2152] AH00959: ap_proxy_connect_backend disabling worker for (160.16.151.224) for 60s
[Mon Sep 07 20:02:49.425805 2020] [proxy_ajp:error] [pid 2152] [client 自分のグローバルIP:64334] AH00896: failed to make connection to backend: 160.16.151.224

今まで試したこと

  • Tomcat
  1. /opt/apache-tomcat/conf/server.xmlの8080番ポートの記述をコメントアウトし、8009番ポートのコメントアウトを削除する
  2. 同ファイルの8009番ポートの記述内容を以下の通り変更する(adress,secureRequired)
<!--
<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" /> 
-->
~中略~
<Connector protocol="AJP/1.3"
               address="0.0.0.0"
               port="8009"
               secureRequired="false"
               redirectPort="8443" />
  • Apache
    /etc/httpd/conf.dディレクトリにhttpd-proxy.confファイルを作成
ProxyPass /  ajp://IPアドレス:8009/examples/

コメント

今までQiitaの記事や動画等参考にしてがんばってみましたが、Linux、サーバーの知識が不足しており、何が原因なのか判断できません。
設定を変更するたびにsystemctl restartしてはいますが、うまくいく気配が全くありません。
初心者のため質問に至らない点もあると思いますが、原因・解決策等ご教示いただければ幸いです。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • m6u

    2020/09/07 20:43

    Apache httpdをプロキシーとして使ってTomcatに渡そうとしている、のかな?

    キャンセル

  • kumaGoro_95

    2020/09/07 21:58

    はい、おっしゃる通りです・・・ちなみに、以下のページを参考にしています。
    https://weblabo.oscasierra.net/tomcat-mod-proxy-ajp/

    キャンセル

回答 2

checkベストアンサー

+1

javaとtomcatは分かりませんが、

ProxyPass /  ajp://IPアドレス:8009/examples/

の部分
同一サーバー内の事だと思うので、IPアドレス127.0.0.1localhostにする事
外のネットワークを通りたいのならfirewallでポートを開放する事ですが、今回は上記対応がよろしいかと思われます

address="0.0.0.0"

上記対応と併せてこの記述も同一サーバー内なら127.0.0.1でいいでしょう

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/09/09 22:31 編集

    ご回答ありがとうございます!
    > ProxyPass / ajp://IPアドレス:8009/examples/
    部分の「IPアドレス」部分を「127.0.0.0」に修正してみたところ、エラーの解消には至りませんでしたが、エラーログ内容が変わりました!

    ```
    [Wed Sep 09 22:04:37.803230 2020] [proxy_ajp:error] [pid 2123] (70007)The timeout specified has expired: AH01030: ajp_ilink_receive() can't receive header
    [Wed Sep 09 22:04:37.803420 2020] [proxy_ajp:error] [pid 2123] [client 126.47.91.136:65293] AH00992: ajp_read_header: ajp_ilink_receive failed
    [Wed Sep 09 22:04:37.803437 2020] [proxy_ajp:error] [pid 2123] (70007)The timeout specified has expired: [client 自分のグローバルIP:65293] AH00878: read response failed from 127.0.0.1:8009 (127.0.0.1)
    ```

    mod_proxy_ajpの方に問題があるということでしょうか。ちょっと調べてみます。

    キャンセル

  • 2020/09/09 22:43

    済まないのだけど冒頭に書いた通りtomcatは分かりません。
    ProxyPass / ajp://localhost:8009/ keepalive=on
    とりあえず↑の通りkeepalive=onを追加してみてください。

    今までのエラーはリバースプロキシでグローバルIPを指定していたから外(ネットワークの外)からのアクセスという事になり、firewallで弾かれていたんです。なのでtomcatにアクセスが来ることも無いので当然アクセスログもエラーログも出ない事となります。
    なのでそれをlocalhost(127.0.0.1)に書き換える事でinternalのアクセスとなりfirewallに弾かれなくなったのでtomcatへのアクセスが来るようになったのです。

    キャンセル

  • 2020/09/10 22:41

    更なるご教示ありがとうございます。
    >keepalive=on
    を試してみたのですが、挙動・エラーログ共に変化はありませんでした。

    その後、「/etc/httpd/conf.d/httpd-proxy.conf」にLocationの設定を追加して再度チャレンジしてみたところ、「http://IPアドレス/examples」でtomcatのexamplesページが表示されるようになりました。
    ------
    <Location /examples/>
    ProxyPass ajp://127.0.0.1:8009/examples/
    </Location>
    -------
    localhostについてご指摘いただいたおかげでなんとか解決にたどり着くことができました!ありがとうございました。

    キャンセル

+1

Apacheのmod_ajpモジュールを利用する場合は、以下のconfのコメントアウトを解除したのち、Tomcatのajp設定を有効にして、ProxyPassを設定すれば動作します。

#LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

なお、tomcatの設定変更をせずにApache側だけで設定を完結させる方法として、リバースプロクシを設定して行うと、tomcat単体で再起動ができ、より簡単に構築・運用ができます。(mod_ajpはApacheとTomcatの両方を再起動しないと連携できなくなるケースがあります)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/09/09 23:15

    ご回答ありがとうございます。
    「/etc/httpd/conf.modules.d/00-proxy.conf」にて、
    > LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
    が設定されているのを確認しました。(既にコメントアウトされていました)

    現在、ProxyPassについては「/etc/httpd/conf.d/httpd-proxy.conf」で
    > ProxyPass / ajp://127.0.0.1:8009/examples/
    と設定しています。
    なお、「/etc/httpd/conf/httpd.conf」内で
    > Include conf.d/*.conf
    の設定があるのを確認しております。

    この設定でエラーログが以下の様に表示されています。
    -----
    [Wed Sep 09 23:12:14.698850 2020] [proxy_ajp:error] [pid 3137] (70007)The timeout specified has expired: AH01030: ajp_ilink_receive() can't receive header
    [Wed Sep 09 23:12:14.699240 2020] [proxy_ajp:error] [pid 3137] [client 126.47.91.136:49976] AH00992: ajp_read_header: ajp_ilink_receive failed
    [Wed Sep 09 23:12:14.699274 2020] [proxy_ajp:error] [pid 3137] (70007)The timeout specified has expired: [client 自分のグローバルIP:49976] AH00878: read response failed from 127.0.0.1:8009 (127.0.0.1)
    ------

     また、「Tomcatのajp設定を有効にする」とは、「/opt/apache-tomcat/conf/server.xml」内の8009番ポートの記述を有効にするということで合ってますでしょうか?
    初歩的な質問で申し訳ないです・・・

    キャンセル

  • 2020/09/10 10:01

    回答をもう一度読んでいただきたいのですが、
    > 以下のconfのコメントアウトを解除したのち
    ですので、先頭の # を消してください。

    キャンセル

  • 2020/09/10 22:35

    申し訳ありません・・・「既にコメントアウトされていました。」はタイプミスです。
    正しくは「コメントアウトは解除されていました。」でした。
    誤解させてお手数おかけして、すみません。
    ご回答いただき、ありがとうございました。

    キャンセル

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

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

関連した質問

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