mod_rewriteをmod_jkにリクエストを渡し、アプリコンテキストを削除して、Tomcat 5.5をApache 2の背後で実行するにはどうすればよいですか?
-
03-07-2019 - |
質問
わかりましたので、Tomcat(5.5)で実行されているwebappを取得して、Apache 2(正確には2.2.3)の背後で実行し、静的コンテンツを提供しながらサイトのルートから(つまりコンテキストなしで) Apache経由。
アプリが" / myapp
"で実行されている場合Tomcatでは、Apache(プラス mod_rewrite
)を使用して、" /
"の下で実行されているかのように動作させたい代わりに。
Mod_jk
がセットアップされ、正常に動作しています。 " / myapp
"からアプリにアクセスすることはできますが、最後の作業がうまくいきません。以下は、 mod_rewrite
がこれを機能させるための設定です。書き換えられた / static /
のURLを正しく取得して、展開されたwebappから提供するApacheを取得し、書き換えログを有効にすると、他のすべてのリクエストを / myappにパスしようとする
mod_jk
経由。ただし、mod_jkはその後リクエストを処理していないようです。
JkMount /myapp/* worker1
RewriteEngine On
# ensure static stuff gets served by apache
RewriteRule ^/static/(.*)$ /var/lib/tomcat5.5/webapps/myapp/static/$1 [L]
# everything else should go through tomcat
RewriteRule ^/(.*)$ /myapp/$1 [L,PT]
過去にApache 1でこれを行ったとき、 mod_rewrite
の前に mod_jk
がロードされていることを確認しなければなりませんでしたが、達成できないようですこれはApache 2の下にあります。他の人は通常どうやってこれをしますか?
解決
最終的にこれが機能するように管理しました。 JkOptionを次のように設定する必要があるようです:
JkOptions +ForwardURICompat
そして mod_jk
は書き換えられたURLを調べます。これがなぜ機能するのかを100%確信していないことを認めなければなりませんが、私はそれが古い振る舞いに戻っていると信じています。誰かがこれを行うためのより良い/より正しい方法を教えてくれるなら、私は知りたいです。
他のヒント
mod_jkの代わりにプロキシにApacheを使用した方が良い場合があります。 このようなもの:
ProxyPass / static / http:// localhost:8080 / myapp / static /
Tomcat Virtual Hostsまたは異なるホストに異なるコネクタを使用し、ルートアプリケーションを(" /"で)展開し、Apache mod_jk転送を異なるコネクタまたは仮想ホストに設定すると、どうなるかが簡単またはより透過的になる場合があります。
注:これが必要になったとき、Tomcatホストまたはエンジン(覚えていない)ごとに異なるコネクタを使用し、ROOTアプリケーションをデプロイしました。 Tomcatで仮想ホスト(名前ベース)を試したことはありませんが、これが機能する可能性があると推測しています。
利点:パスの変換がないため、最初の展開から数か月後にインストールを変更する必要がある場合、理解しやすくなります。
私は告白しますが、多少奇妙に感じますが、読みやすさのメリットは私にとって非常に価値があります。
「PT」の代わりに「R」フラグを使用します。
RewriteRule ^/(.*)$ /myapp/$1 [L,R]
編集: ユーザーに表示されるURLを変更しないという点を逃しました。別の方法は次のとおりです。
JkMount /* worker1
JkUnmount /static/* worker1
その後、RewriteRuleは不要になります。
また、 Apache Tomcatサイトによると、の新しいデフォルト設定mod_jk
は mod_rewrite
と互換性がないため、 + ForwardURICompatUnparsed
を使用する必要があります。