2012-09-27 70 views
3

我有我的原始Django serving question後續問題,這是如何開發Django應用程序,並從我的主要基於PHP的網站服務於他們(我的網站的一個較大的遷移的所有部分從一個靜態和PHP驅動的應用程序到一系列Django應用程序)。ProxyPass和ProxyPassReverse爲Django應用程序

我無法完全使用我提供的名稱服務器解決方案,而只是使用mod_wsgi在不同端口(8000)上部署我的Django應用程序。但是,現在我需要將Django應用程序實際集成到主站點中。在我的Apache 2.0配置文件(比如http://www.example.com)添加以下的ProxyPass指令(我mod_wsgi的初始化後):

ProxyPass  /app/newsletter  http://www.example.com:8000/app/newsletter 
ProxyPassReverse /app/newsletter  http://www.example.com:8000/app/newsletter 

在這裏,我想到的是任何請求:

http://www.example.com/app/newsletter 

將獲得成功代理到:

http://www.example.com:8000/app/newsletter 

和所有將與世界的權利。

但是,情況並非如此。 Apache的掛起5分鐘左右(手藝這一問題所需要的時間),然後吐出502代理錯誤

Proxy Error 

The proxy server received an invalid response from an upstream server. 
The proxy server could not handle the request GET /app/newsletter/. 

Reason: Error reading from remote server 

這個響應我看到的連續錯誤像以下後看我的Apache 2.0錯誤日誌中:

[Thu Sep 27 15:25:49 2012] [error] Exception KeyError: KeyError(****,) in <module 'threading' from '/usr/lib64/python2.6/threading.pyc'> ignored 

因此,mod_proxy在Django和/或Python中扮演的角色似乎有些失職。我有其他Java相關的進程,我使用ProxyPass和ProxyPassReverse,他們工作正常。另外,當我不嘗試應用ProxyPass時,Django應用程序一切正常(即,當我直接在端口8000上處理它們時)。

任何想法?我不覺得我所做的事情特別複雜。

在此先感謝。

+0

它已被推薦給我,因爲一切都在同一臺服務器上,我應該使用mod_rewrite而不是mod_proxy。 – tatlar

回答

2

最後,使用mod_rewrite是解決方案。將此添加到Apache的httpd.conf文件中:

RewriteEngine On 
RewriteRule ^/app/newsletter/(.*)$ http://%{SERVER_NAME}:8000%{REQUEST_URI} [P] 

一切按預期工作。

+0

這並沒有完全解決問題。 Django ** get_absolute_url **方法並不總是有效,偶爾會在其生成的鏈接中留下端口號(8000)。 – tatlar

+0

通過刪除** get_absolute_url()**並替換爲** {%url「named-view」%} **語法來修復100%。 – tatlar