2012-07-16 114 views
20

我想在同一主機上部署兩個不同的django應用程序:第一個將對應於url/site1,第二個對應於url/site2。下面是我的配置:用mod_wsgi在Apache上部署多個django應用程序

 
LoadModule wsgi_module modules/mod_wsgi.so 

WSGIScriptAlias /site1 /var/www/py/site1/site1/wsgi.py 
WSGIScriptAlias /site2 /var/www/py/site2/site2/wsgi.py 

WSGIPythonPath /var/www/py/site1:/var/www/py/site2 

<Directory "/var/www/py/site1/site1"> 
<Files wsgi.py> 
Order deny,allow 
Allow from all 
</Files> 
</Directory> 

<Directory "/var/www/py/site2/site2"> 
<Files wsgi.py> 
Order deny,allow 
Allow from all 
</Files> 
</Directory> 

而且這裏的wsgi.py文件這兩個應用程序

 
import os 
import sys 

path = '/var/www/py/site1' 
if path not in sys.path: 
    sys.path.append(path) 

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "site1.settings") 
from django.core.wsgi import get_wsgi_application 
application = get_wsgi_application() 

現在,這裏是我的問題。當我去我的服務器,讓我們說http://app1.sites.gr/site1有些時候加載site1,有些時候加載site2 !!!!當我訪問http://app1.sites.gr/site2 ... Sometiems時,我得到site1的歡迎頁面,有時我會得到site2的歡迎頁面!我打F5並獲得不同的歡迎頁面。我已經檢查一切爲了先前小時,並沒有發現什麼異樣......

請告訴我,我發瘋之前可能是什麼問題...

謝謝!

回答

41

這與Django的1.4生成的wsgi.py文件有問題。在嘗試在同一個進程中託管兩個不同的Django實例的情況下,即使在單獨的子解釋器中,它也不起作用。

變化:

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "site1.settings") 

到:

os.environ["DJANGO_SETTINGS_MODULE"] = "site1.settings" 

或者更好的使用守護進程模式,並委託各在不同的守護進程運行組。

也就是說,代替:

WSGIScriptAlias /site1 /var/www/py/site1/site1/wsgi.py 
WSGIScriptAlias /site2 /var/www/py/site2/site2/wsgi.py 

WSGIPythonPath /var/www/py/site1:/var/www/py/site2 

使用:

WSGIDaemonProcess site1 python-path=/var/www/py/site1 
WSGIScriptAlias /site1 /var/www/py/site1/site1/wsgi.py process-group=site1 application-group=%{GLOBAL} 

WSGIDaemonProcess site2 python-path=/var/www/py/site2 
WSGIScriptAlias /site2 /var/www/py/site1/site2/wsgi.py process-group=site2 application-group=%{GLOBAL} 

UPDATE

注意,有關於這個問題和其他原因,整個博客文章了。

+2

這實際上工作,謝謝!但是現在我又遇到了另一個問題:當我嘗試在同一個瀏覽器中訪問這兩個站點時,它有時會從site2註銷我(當我訪問site1時) - 但不是相反......這是因爲我有/ site1和/ site2?我應該嘗試一下Erik提出的建議並擁有site1.sites.gr和site2.sites.gr嗎? – Serafeim 2012-07-17 07:28:39

+3

您需要爲每個網站設置不同的SESSION_COOKIE_NAME或SESSION_COOKIE_PATH,因爲它們位於同一個域中。請參閱http://code.google.com/p/modwsgi/wiki/IntegrationWithDjango – 2012-07-18 03:31:58

2

您的應用程序在同一個端口上偵聽,並且似乎沒有代理將它們委派給不同的端口。

你要麼必須設置VirtualHosts阿帕奇範圍內或使用Nginx的,lighttpd的或別的東西來創建正確的代理服務器

+0

我不能通過不同的url委託給正確的腳本(site1 vs site2)嗎?我不想使用不同的端口或配置代理!我只想在同一個apache主機上運行兩個django應用程序 - 我已在其他地方看到這是可能的:( – Serafeim 2012-07-16 13:58:27

+3

是的,這就是虛擬主機的用途,readthedocs – 2012-07-16 13:59:29

+0

所以,我應該運行我的兩個站點在不同的端口上使用gunicorn然後只是添加下面的「ProxyPass/site1 http://127.0.0.1:8111/ ProxyPassReverse/site1 http://127.0.0.1:8111/」爲我的httpd.conf上的兩個站點?? – Serafeim 2012-07-16 15:09:58

1

格雷厄姆鄧普爾頓的迴應是,你可能想讀最接近的一個,但我會建議在不同的子域的根託管你的兩個Django的自己節省了大量灼熱的,而不是在在同一個域上的非根位置。有很多陷阱運行非根Django網站恕我直言。

祝你好運!

+2

那麼,經過大約8個月(不是重)的生產使用後,有四個不同的網站(/ site1,/ site2,site3和site4),所有內容工作真的很棒(是的,即使是SESSION_COOKIE_NAME設置的會話)!唯一要記住的就是永遠不要使用絕對的URL,而只能通過revels和{%url%} - 所有這些都是django-DRY-way :) – Serafeim 2013-02-20 21:02:10

相關問題