徒然なるままに

個人の備忘録を中心としたブログです

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
(2013/03/24 記事の再編集)

フロントサーバとしてApacheを動かし、内部サーバーとしてtomcatを動かしています。

localhost/tomcat以下へのアクセスをtomcatのルートディレクトリに渡すとすると
httpd.confなどの設定は
ProxyPass /tomcat ajp://localhost:8009

となります。

これで以下のようなアクセスが可能になります。

1、外部からのアクセス→localhost/index.html→Apache(Apacheで処理する)
                        ↓
 外部へのレスポンス←localhost/index.html←ーーー

2、外部からのアクセス→localhost/tomcat/index.html→Apache→URLの変換→ajp://localhost:8009/index.html→tomcat
                                                      ↓
 外部へのレスポンス←Apache←localhost/tomcat/index.html←URLの逆変換←tomcat←ーーーーーーーーーーーーー←

ここで、ファイル$CATALINA_HOME/webapps/ROOT/redirect.htmlが http://localhost:8080/dest.htmlにリダイレクトするようになっていたとしましょう。
このページが http://localhost/tomcat/redirect.html でアクセスされると、リダイレクト機能によって、
リバースプロキシ(apache)を介さずに内部サーバ(tomcat) http://localhost:8080/dest.html へ直接リダイレクトされてしまいます。
これは本来意図しないサーバ、及びファイルへの直接アクセスになります。
このような処理になってしまう原因は、内部サーバ内でリダイレクトをしているからです。



本当ならばリダイレクト先の指定URLが一度 http://localhost/tomcat/dest.htmlに変換された後に
内部変換でhttp://localhost:8080/dest.htmlを呼び出すようにするべきです。

この変換を実現するために、以下のコードでProxyPassReverseを指定します。
ProxyPassReverse /tomcat ajp://localhost:8009


今まで localhost/tomcat/ → localhost:8009/ の一方通行だけだったのが
逆の  localhost/tomcat/ ← localhost:8009/ の関連付けもされるというわけです。



ProxyPassを指定したら、特別な理由がない限りProxyPassReverseも同じように指定しておきなさいということですね。
(ajpを使った場合のProxyPassReverseの指定はProxyPassの指定とは異なるものにするよう?
tomcat側はajpでアクセスされていることを知らずに、内部URL http://localhost/ だと思い込んでいるようなので)

ここでチェックされているのはあくまでリクエストヘッダ、リダイレクト時のレスポンスヘッダだけなのでwebページ内のリンクそのものは変更されません。
ページに埋め込まれたリンクのURLを変更、置換するには別途「mod_proxy_html」というサードパーティーのApacheモジュールが必要となります。

例えばappserver.example.comが内部のサーバ、www.example.comがフロントサーバであり、内部サーバはhttp://www.example.com/appserverでアクセスされるとします。
http://appserver.example.com/foo/bar.htmlで自分へのリンクを<a href="http://appserver.example.com/foo/bar.html">foobar</a>
で貼っていたとすると、これはappserver.example.comへのプロキシサーバを介さない直接のアクセスになってしまいます。

しかし、mod_proxy_htmlモジュールが有効になっていれば上のリンクは
<a href="http://www.example.com/appserver/foo/bar.html">foobar</a>
のように変更されるというわけです。

mod_proxy_htmlの有効化については別の記事で書きます。


なお、URLの変換以外にもCookieの変換という作業も必要になってくることがあります。
tomcat側の/DIR1/use_cookieというサーブレットで、そのままCookieの書き込みをすると
host:localhost
pass:/DIR1
となり、実際のアクセスhttp://localhost/tomcat/DIR1/use_cookieとの関連付けに失敗します。
本来ならば、下のように書き込まなければなりません。
host:localhost
pass:/tomcat


そこで指定するのがProxyPassReverseCookieDomain、ProxyPassReverseCookiePathです。

今回は両方localhostですが、異なるホスト(front,backend)でそれぞれサーバを動かしているとすると
ProxyPassReverseCookieDomain backend front
ProxyPassReverseCookiePath /DIR1 /tomcat/DIR1

になります。

backend /DIR1がtomcat側、
front /tomcat/DIR1がapache側です。
普通に考えてCookieの文字列置換ですね。

これにより、
host:backend
pass:/DIR1
と書き込まれていたのが
host:front
pass:/tomcat/DIR1
こう書かれているはずです。


ごちゃごちゃ書きましたが、localhostでApacheとtomcatを動かしている場合
ProxyPass /tomcat ajp://localhost:8009/DIR1
#ProxyPassReverse /tomcat ajp://localhost:8009/DIR1 #正しい指定か不明
ProxyPassReverseCookieDomain localhost localhost
ProxyPassReverseCookiePath /DIR1 /tomcat/DIR1

が最終的なコードです。

<Location /><Location>の中に記述する方法もあります。

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://kamiyasu2.blog.fc2.com/tb.php/17-5adfbf26

kamiyasu

Author:kamiyasu

QR

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。