Django

幫助我了解如何使用 ProxyPass

  • September 18, 2012

更新:在玩了下面兩個答案後,我添加了一個修改後的問題。

你好呀,

如果您正在閱讀本文,您可能熟悉 Apache 的 mod_proxy 及其 ProxyPass 函式。像許多其他人一樣,我有一個可以從內部網路外部訪問的應用程序的問題,但是該應用程序本身會訪問不同機器上的其他內部應用程序,並且當您使用此設置進行遠端訪問時,事情就會變得不穩定。

所以,我的設置很簡單,我有:

機器 #1 啟用了遠端訪問,我通過主機名訪問它,它吐出執行在其上的 PHP 應用程序。

機器 #2 是一個執行 Django 的新應用程序,它使用完全不同的後端(甚至是身份驗證),它託管在單獨的機器上。在我們的 Intranet 中,我們通過一個簡單的命名主機名訪問它,該主機名基本上鍊接到內部 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 應用程序中修改的東西?

任何提示和指示也將不勝感激。謝謝你的時間

您應該修改您的 django 應用程序,使其位於 /new/auth/login 而不是 /auth/login。通常,您的代理通行證應如下所示:

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

這與您期望位於 /new/ 的 Django 應用程序相結合,應該可以解決您的問題。

使用虛擬主機。例如,將您的伺服器的 A 名稱(例如sub.external.com)設置為您的伺服器 IP(例如123.456.678

出於安全考慮,如果在settings.py中使用 ProxyPass,您需要根據Ticket #6880顯式轉發 HTTP_HOST :

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訪問您的網站,而不必擔心“路徑”

引用自:https://serverfault.com/questions/429404