web-dev-qa-db-ja.com

Apache + Tomcat:AJPの代わりにmod_proxyを使用する

Tomcatがlocalhostではなく正しい着信ホスト名を取得するように、HTTPプロキシを使用してApacheをTomcatに接続する方法はありますか?私はこのディレクティブをApacheで使用しています:

ProxyPass /path http://localhost:8080/path

しかし、それはlocalhostとして届きます。これは、同じサーバー上に多数のサイトがある場合には役に立ちません。サーバー構成でホストを手動で設定できます:

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           proxyName="pretend.Host" proxyPort="80" />

しかし、これは複数のサイトに対応していません。また、サイトごとに異なる内部ポートを使用するという考えは好きではありません。

プロキシするときにポートを転送する方法はありませんか?

(なぜ私がAJPを使用しないのかと尋ねると、答えは このエラー です。私はあきらめる前にできる限りのことを試みています TomcatとApache全体

21
Marcus Downing

探している設定は次のとおりです。

<VirtualHost *:80>
  ServerName public.server.name

  ProxyRequests Off
  ProxyPreserveHost On

  <Proxy *>
    Order deny,allow
    Allow from all
  </Proxy>

  ProxyPass / http://localhost:8080/
  ProxyPassReverse / http://localhost:8080/
</VirtualHost>

プロキシターゲットとしてlocalhostを使用していることに注意してください。 ProxyPreserveHost を有効にするため、これを行うことができます。ドキュメントには、

これは、プロキシされた大量の名前ベースの仮想ホスティングなど、元のホストヘッダーをバックエンドサーバーで評価する必要がある特殊な構成で主に役立ちます。

まさにあなたがしていることのように聞こえます。

40
Robert Munteanu

同じサーバー上の複数のサイトが必要な場合は、Apache構成で仮想ホストを使用するのが最善の策だと思います。次に例を示します。

<VirtualHost *:80>
ServerName server.domain.com

ProxyRequests Off
<Proxy *>
    Order deny,allow
    Allow from all
</Proxy>

ProxyPass / http://server.domain.com:8080/
ProxyPassReverse / http://server.domain.com:8080/
<Location />
    Order allow,deny
    Allow from all
</Location>

外部DNSにserver.domain.comが登録されている限り、受信ホスト名はクライアントURLに表示されます。この方法を使用して、Tomcatによって戻された3つを含む6つの別個のサイトをホストする単一のサーバーを実行しています。

5
gareth_bowles

AJPは引き続き使用できますが、HTTPよりも高速であるため、使用する必要があります。必ずhttp.confで有効にしてください:

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

その場合、この構成は私にとってはうまくいきます:

<VirtualHost *:80>
  ServerName public.server.name

  ProxyRequests Off
  ProxyPreserveHost On

  <Proxy *>
    Order deny,allow
    Allow from all
  </Proxy>

  ProxyPass / ajp://localhost:8080/
# ProxyPassReverse might not be needed,
# it's only for redirecting from inside.
#  ProxyPassReverse / ajp://localhost:8080/
</VirtualHost>
0
John Mikic