web-dev-qa-db-ja.com

ProxyPassの使用方法を教えてください

更新:以下で2つの答えを試してみて、改訂された質問を追加しました。

こんにちは、

これを読んでいるなら、おそらくApacheのmod_proxyとそのProxyPass関数に精通しているでしょう。他の多くの人と同じように、内部ネットワークの外部からアクセスできるアプリケーションがあるという問題がありますが、そのアプリケーション自体が別のマシン上の他の内部アプリにアクセスします。この設定でリモートアクセスに入ると、状況が不安定になります。

だから、私のセットアップは非常に簡単です、私は持っています:

マシン#1でリモートアクセスが有効になっています。ホスト名を使用してアクセスすると、PHPアプリケーションが実行されています。

マシン#2はDjangoを実行する新しいアプリケーションであり、完全に異なるバックエンド(authも含む)を使用し、別のマシンでホストされています。イントラネットでは、基本的に内部192.168.0.101 ipにリンクする単純な名前のホスト名を介してアクセスします。

ProxyPassを試して設定してみました。たとえば、/ newへのパスで新しいアプリケーションに送信されます。

ProxyPass/new http://192.168.0.101/

この種の機能は、他のアプリへのリクエストを取得しますが、私のDjangoアプリが/ auth/login /にリダイレクトすることを望んでいるため、即座に認識しないため、ブレークします。変更した場合私自身のURLはfoo.net/new/auth/loginです。ログインページが表示されますが、ブラウジング全体でこれを行うのは不便です。

では、ProxyPassを希望どおりに機能させるにはどうすればよいですか? Apacheで何かをする必要があるので、他のアプリでは常にURLの前に/ newが書き込まれますか、それともDjangoアプリ内で変更する必要がありますか?

ヒントやポインタも同様にいただければ幸いです。御時間ありがとうございます

11
Bartek

Djangoアプリケーションが/ auth/loginではなく/ new/auth/loginにあることを期待するように変更する必要があります。通常、プロキシパスは次のようになります。

ProxyPass /path http://192.168.0.101/path
ProxyPassReverse /path http://192.168.0.101/path

Djangoアプリが/ new /にあることを期待している)と組み合わせると、問題が解決するはずです。

11
f4nt

ProxyPassReserveディレクティブを使用して問題を解決できると思います。あなたはそれについて読むことができます ここ

5
kgiannakakis

VirtualHostを使用します。たとえば、サーバーのA名(例sub.external.com)をサーバーIP(例123.456.678

セキュリティ上の理由により、settings.pyでProxyPassを使用する場合は、HTTP_Hostを明示的に転送する必要があります チケット#688 ごとに:

USE_X_FORWARDED_Host = True

次に、以下をApache/ etc/httpd/httpd.confに追加します。

# Virtual hosts
Include /etc/httpd/extra/httpd-vhosts.conf

VirtualHostを/ etc/httpd/extra/httpd-vhosts.confに追加します。

NameVirtualHosts *:80

<VirtualHost *:80>
  ServerName sub.external.com
  ProxyPass / http://127.0.0.1:8000/
</VirtualHost>

これで、「パス」を気にすることなく http://sub.external.com からサイトにアクセスできるようになります。

2
Lionel

お返事ありがとうございます。これを試してからいくつかの修正が必要なので、私は自分の質問に答えています。

まず、App#2が実行されます http://192.168.0.101 ..実行されません http://192.168.0.101/path したがって、ProxyPassは作業

そのため、ircの#Apacheの人たちと話した後、次のようなことをする必要があることがわかりました。

RewriteCond%{HTTP_Host} ^ app2.myremotedns.com *

RewriteRule。* http://192.168.0.101/ [P]

これにより、app2.myremotedns.comへのすべてのリクエストがプロキシ経由で内部IPに送信されるように、書き換えルールが送信されます。

これは多少機能しますが、3つの問題があります。

  • すべてのページでログインが必要な場合、app2でリモートから何かにアクセスすると、/ auth/loginにリダイレクトされます。ただし、現在の書き換え設定により、Firefoxがパスの試行を停止する前にリダイレクトループが発生します。これはDjangoのリダイレクトメソッドと関係があるかもしれませんが、よくわかりません。

  • ログインを無効にすると、ページは機能しますが、完全には機能しません。 App#2のインデックスページを取得できるようですが、他には何もありません。

  • 静的メディアはすべて壊れていますが、これはおそらく単純な修正であり、現在は心配されていません。

だから、私は想像したより複雑な問題を抱えています... :)

1
Bartek

本当に学習したい場合は、リバースプロキシのこの段階的な例を読んでください。

http://www.apachetutor.org/admin/reverseproxies

0
Butifarra