0

ajpプロトコルを使用して、Tomcatサーバーで複数のgrailsアプリケーションを実行しています。同じサーバーで、Tomcat アプリケーションのフロント エンドとして apache を実行しています。次のようなApache構成:

ProxyPass /example1/ ajp://localhost:8082/example1/
ProxyPassReverse /example1/ ajp://localhost:8082/example1/
ProxyPass /example2/ ajp://localhost:8082/example1/
ProxyPassReverse /example2/ ajp://localhost:8082/example2/

example1 をルートコンテキストとして実行したい

ProxyPass / ajp://localhost:8082/example1/

これは動作しません。すべての静的コンテンツが破損しています。/example1/images/myimage.jpg に移動すると、画像が解決されます: /images/myimage.jpg

example1 を ROOT.war としてデプロイすることを避けるために、私は多くのことを試みました。しかし、それがこの問題を解決する唯一の方法のようです。これは私のニーズには十分ではありません。

Grails 側では、サーバー URL から ${appName} を削除して、次のように結び付けました: grails.serverURL = "http://apacheajp.example.com/"

grails.app.context=/ を application.properties に追加しましたが、これも機能しませんでした。

ここでの最終的な目標は、この apache to server を複数のサブドメインに使用することです。example1.example.com (apacheajp.example.com のエイリアス) を example1 アプリに解決する必要があります。同様に、example2.example.com が example2 アプリに対して同じように動作するようにします。これは、ROOT として展開することが望ましくない理由を説明しています。

私が使用するサーバーはRHEL6です

この投稿は、私が抱えている同じ問題を最もよく説明しています: http://grails.1312388.n4.nabble.com/Grails-context-big-problem-with-apache-mod-proxy-td1392448.html

4

4 に答える 4

2

ProxyPass でパスを変更した場合、他にも考慮しなければならない問題がたくさんあります。これらは十分にトリッキー/高価であるため、アプリケーションを ROOT.war としてデプロイする方がはるかに簡単です。

それができない/できない場合は、次のことを考慮する必要があります。

  • ProxyPassReverse ディレクティブを追加して、いくつかの HTTP 応答ヘッダーを修正します
  • ProxyPassReverseCookiePath ディレクティブを追加して、すべての Cookie を修正します
  • mod_headers を使用して、間違ったパス参照を含む他のヘッダーを変更します
  • mod_substitute を使用して、応答本文のコンテキスト パスを修正します。

通常はこれで十分ですが、変更が必要なすべての項目を追跡するには時間がかかる場合があります。WAR の名前を ROOT.war に変更することを強くお勧めします。何があなたを止めていますか?

于 2012-05-01T18:30:04.550 に答える
1

したがって、問題を解決する唯一の方法は、rlovtang が最初の返信で提案したことを実行し、仮想ホストを使用してアプリケーションを ROOT.war としてデプロイすることです。

私の他の質問を参照してください: ajp プロトコルを使用して代替代替ホスト エイリアスに接続する

アパッチ

NameVirtualHost *:80


<VirtualHost *:80>
    ServerName app1.myserver.com
    ProxyPass / ajp://tomhost1:8009/
    ProxyPassReverse / ajp://tomhost1:8009/
</VirtualHost>

<VirtualHost *:80>
    ServerName app2.myserver.com
    ProxyPass / ajp://tomhost2:8009/
    ProxyPassReverse / ajp://tomhost2:8009/
</VirtualHost>

トムキャット

<Host name="tomhost1" appBase="tomhost1" unpackWARs="true"
autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false" >
    <Alias>app1.myserver.com</Alias>
</Host>

<Host name="tomhost2" appBase="tomhost2" unpackWARs="true"
autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false" >
    <Alias>app2.myserver.com</Alias>
</host>

/etc/ホスト

ホスト上、myserver.com

127.0.0.1       localhost       tomhost1     tomhost2

クライアント上

188.555.555.555  app1.myserver.com   app2.myserver.com

app1 と app2 に CNAME または ANAME が設定されている場合、クライアント ホスト ファイルをいじる必要はありません。サーバーとクライアントが同じコンピューターである場合は、app1 および app2 ホスト エイリアスを localhost エイリアスに追加します。tomcat の場合は、tomhost1 と 2 のディレクトリがあることを確認してください。Grails アプリを ROOT.war としてデプロイする場合は、サーバーの URL が次のようになっていることを確認してください。

grails.serverURL = "http://app1.myserver.com/"

war ファイルを作成し、tomhost1 フォルダーに配置します。

于 2012-05-10T18:10:20.783 に答える
0

Mark Thomasが示唆しているように、Apacheに必要なのと同じコンテキストルートを使用してアプリケーションをTomcatにデプロイするのが最も簡単です。したがって、コンテキストルート'/'の場合、これは、TomcatにROOT.warとしてデプロイすることを意味します。コンテキストルートが「/」でサブドメインが異なる複数のアプリを作成するには、アプリケーションごとに1つずつ、Tomcatの複数のインスタンスを実行し、それらすべてをROOT.warとしてデプロイするのが最も簡単な解決策です。これは私たちのやり方です。これは、すべてのアプリケーションを停止せずにアップグレードを実行する方が簡単であることも意味します。

各Tomcatインスタンスには、conf / server.xmlに独自のシャットダウンポート、httpポート、およびajpポートが必要です。

于 2012-05-01T18:45:58.763 に答える
0

壊れた画像で発生していた問題を解決できました。ここからの例: http://www.wthr.us/2010/01/25/improve-grails-performance-with-static-resources/

NameVirtualHost *:80

<VirtualHost *:80>
            ServerName subdom1.example.com
            ProxyPass / ajp://localhost:8082/app1/
            ProxyPassReverse / ajp://localhost:8082/app1/
            RewriteEngine on
            RewriteRule ^/app1/images/(.*) /home/tomcat/webapps/app1/images/$1
            RewriteRule ^/app1/css/(.*) /home/tomcat/webapps/app1/css/$1
            RewriteRule ^/app1/js/(.*) /home/tomcat/webapps/app1/js/$1
</VirtualHost>

これで十分です。

于 2012-05-02T15:01:51.780 に答える