web-dev-qa-db-ja.com

Apache仮想ホストとリバースプロキシ

ドメイン名が単一のApacheサーバーにマップされている仮想ホストがたくさんあります(server1と呼びましょう)。特定の状況下では、特定の仮想ホストのすべてのURLは、代わりに別のサーバーによって提供される必要があります(server2と呼びましょう)。

それを達成するための最も簡単な方法は何ですか? server1と同じ名前ベースの仮想ホストセットアップを使用するようにserver2を設定し、server1のX-Forwarded-Hostヘッダーに依存することはできますか(つまり、server2はそれらのヘッダーだけに基づいて正しいことを行います)? 「同じ名前ベースの仮想ホスト設定」とは、「実際の」ドメイン名(つまり、server1のIPにマップされるドメイン名)を意味します。

5
oggy

実際にmod_proxyモジュールを使用できます。 vhostsで正常に動作します。基本的に、メインサーバーはすべてのリクエストを受信し、特定のURL /ドメインが呼び出されると、mod_proxyはこのドメインを別のサーバー(サーバー2)にリダイレクトします。サーバー1では次のようになります。

<VirtualHost *>
ServerName server1.com
Hosted on the server
</VirtualHost *>

<VirtualHost *>
ServerName server2.com
// mod_proxy directives in order to redirect this domain name to the other server //
</VirtualHost>

そして、良いチュートリアルがあります: http://www.apachetutor.org/admin/reverseproxies

4
Razique

同じ問題が発生しました。2つの解決策を検討しました。

  1. 内部DNSで外部階層をミラーリングします(例:foo.example.com-> foo.internal.lanbar.example.com- > bar.internal.lanなど);フロントエンドの各VirtualHostブロックに、適切なProxyPassおよびProxyPassReverseディレクティブを追加します。 vhostがある場合は、フロントエンドにキャッチオール(ServerAlias *.example.com)セクションを作成し、mod_rewrite([P])を使用してリクエストをバックエンドにプロキシし、リクエストを内部名にマッピングできます。

    これは私が試した最初のアプローチです。正常に動作しますが、バックエンドの名前を変更する必要があります。 DNSにアクセスできない場合、またはバックエンドサーバーに名前さえない場合は、このアプローチを使用できません。

    ああ、CookieをProxyPassReverseCookieDomainで修正することを忘れないでください。そうしないと、セッションが機能しなくなった理由を疑問に思ってログを見つめることになります;-)

  2. フロントエンドでキャッチオール仮想ホストを使用し、ProxyPreserveHost onを使用します。この場合、フロントエンドはリクエストのHost:ヘッダーを保持するため、バックエンドで元のvhost構成を再利用できます(つまり、バックエンドはヘッダーに外部名が含まれるリクエストを参照しますHost :foo.example.com

1
Luca Tettamanti