QA@IT

Apache2.2とTomcat6のドメインルート設定

8418 PV

こんにちは。

AWSのlinux(AmazonlinuxOS)でWEBサーバ(WebアプリはSAStruts)を構築中です。

Apache2.2とTomcat6のAJP連携自体はアプリ名を指定した設定ではうまく行っており、
http://XXX.com/app/」とURLを打てば繋がります。

ただ、これを
http://XXX.com/」のようにドメインルート設定したいのですが、
うまく表示されません。

以下、手順となりますが、何か間違いなどありますでしょうか?
ご指摘いただければ幸いです。

1.httpd/conf/httpd.confの修正。

   LoadModule proxy_module modules/mod_proxy.so
   LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
   ↑有効になっている事を確認。

   (以下、追記)
   <IfModule mod_proxy_ajp.c>
      <Location / >
         ProxyPass ajp://localhost:8009/
      </Location>
   </IfModule>
   Include conf/extra/httpd-proxy.conf

2.httpd/conf/extra/httpd-proxy.conf作成。
   (以下、一行のみ)
   ProxyPass / ajp://localhost:8009/

以上、リブートして確認したのですが。

よろしくお願いいたします。

回答

たぶん、一通り画面の表示は出来ていると思いますが、Apacheのパス(質問で言っている「ドメインルート」)と、
Tomcatのコンテキストパス(app)がずれていると、以下の問題が発生します。

・JESSIONIDのクッキーのPathがずれるため、セッション管理が正常に機能しません。
このため、ログイン処理が動作しない等の問題が発生します。
・アプリケーション側でリダイレクトした場合、Tomcatがコンテキストパスをつけてリダイレクトするため、
リダイレクトするURLが実際のURLとずれて、404になる。

これを回避するには、mod_proxy の ProxyPassReverse / ProxyPassReverseCookiePath の設定を適切に行う必要がありますが、自分はドメインルートを使う場合にはROOT.war でデプロイして、この設定を使わないので、適切な設定については調べてみてください。

(参考)

http://d.hatena.ne.jp/a666666/20090211/1234348004
http://kadoppe.com/archives/2011/04/tomcat-cookie-path-mod-proxy.html

編集 履歴 (0)
  • ご助言ありがとうございます。
    確認します。
    -

y-moriさん

ありがとうございます。
色々勉強になりました。
Apache Rewriteも探ってみます。

大変感謝しております。

編集 履歴 (0)

今まで同じ様に、本番環境はドメインルートの環境での開発もありましたが、とくにこれらを意識せずに出来ていました。
サーバチームが優秀だっただけかもしれませんが、一般的にはこのような設定をするものでしょうか?

私もあまり強くないですが、このような設定はあまりしたことないですね。
Apache Rewrite等でルートから、アプリのルートにリダイレクトするぐらいですね。

編集 履歴 (0)

y-moriさん

ありがとうございます。
ご指摘の方法で連携する事ができました。

静的ファイルの取得などは、css,js,imageなどの指定で、ユーザが意識しないようにする事はできるのですが、HTMLタグで下記のようにも使っています。

<a href="<c:url value="/home"/>">ホーム</a>

この場合、アドレスバーにアプリのルートが指定されてしまいます。
静的コンテンツだけでなく、画面遷移&Ajaxなども使っており、結局このように指定するようになってしまうのですが、

ProxyPass /app/  ajp://localhost:8009/app/
ProxyPass /      ajp://localhost:8009/app/

これをしてしまうとそもそも何のためにドメインルートを設定しているのか分からなくなってしまいます。
また、アプリのルートディレクトリに、index.htmlを配置し、onloadのJSでtop.location.href="/app/"とするのが、より簡易かと思いました。

ただ、おっしゃるようにエラー画面などシステム側で共通のURLなど、
「c:url」タグなど階層が変わってる呼び先もあり、できればあまりいじりたくない箇所です。

今まで同じ様に、本番環境はドメインルートの環境での開発もありましたが、とくにこれらを意識せずに出来ていました。
サーバチームが優秀だっただけかもしれませんが、一般的にはこのような設定をするものでしょうか?

サーバ側の設定に疎くこの辺が良く分かっておらず、すみません。。

編集 履歴 (4)

ただ、1点。アプリ側で「${f:url('/imgs/head.png')}」のように、JSP2.0タグを多用しているのですが。
これでは「/app/imgs/head.png」と言うようにアプリのルートが入ってしまいます。
やはり、「./imgs/head.png」のような相対パス指定した方が良いのでしょうか?
それとも静的ファイルなので、パフォーマンス改善の為に、Apacheのhtdocに入れるほうが良い>のでしょうか?

いくつか方法があると思いますが、相対パス指定はJSPの配置場所によって指定方法が変わりますし、修正が手間なのであまりお薦めはいたしません。
画像ファイルだけProxyのパスを変更すれば、
アプリのルートが入っても、Tomcat上の画像へアクセスできると思います。

<Location /app/imgs >
ProxyPass ajp://localhost:8009/app/imgs
</Location>

パフォーマンスを重要視されるのであれば、Apache上への配置が良いと思います。
配置場所はhtdocでなくともよいですが、ProxyPass の設定で、プロキシから除外が必要です。

編集 履歴 (2)

y-moriさん

ありがとうございます。大変助かりました。

ご指摘の内容から下記の指定で無事表示されました!

1.httpd/conf/httpd.confの編集
   (以下、一行追加)
   Include conf/extra/httpd-proxy.conf

2.httpd/conf/extra/httpd-proxy.confの編集
   (以下、一行のみ)
   ProxyPass / ajp://localhost:8009/app/

ただ、1点。アプリ側で「${f:url('/imgs/head.png')}」のように、JSP2.0タグを多用しているのですが。

これでは「/app/imgs/head.png」と言うようにアプリのルートが入ってしまいます。
やはり、「./imgs/head.png」のような相対パス指定した方が良いのでしょうか?

それとも静的ファイルなので、パフォーマンス改善の為に、Apacheのhtdocに入れるほうが良いのでしょうか?
これも確か、httpd-proxy.confに入れるんですよね。。

いずれにしましても、ずっと悩んでいた事が解決し、心からありがとうございました。
とても感謝しております。

編集 履歴 (1)

ProxyPass ajp://localhost:8009/

ProxyPass ajp://localhost:8009/app
とすればうまくいきませんか?

また、以下の記述はhttpd.confには不要で、httpd-proxy.confへの記述だけでよいはずです。

<Location / >
ProxyPass ajp://localhost:8009/app
</Location>
編集 履歴 (1)
ウォッチ

この質問への回答やコメントをメールでお知らせします。