2012-07-08 44 views
1

我最近設置了一個Web服務器,它目前承載了幾個靜態頁面網站和兩個Django項目。託管多個Django站點的問題(設置交叉)

這兩個django項目是'abc'和'xyz',分別位於主文件夾的不同目錄中。每個都有自己的wsgi腳本,它們指向它們各自的settings.py文件。

最近,雖然我一直注意到'xyz'上的幾個500錯誤。通常情況下刷新會糾正問題,但這是不可接受的,所以我檢查了apache error.log,並注意到有時當我點擊'xyz'時,會出現異常,提示無法在xyz項目中找到abc.settings。不知何故,這兩個項目正在交叉並相互干擾。我還沒有做足夠的工作,但是知道問題是否相同。以下是我的例外。

[Sun Jul 08 13:30:34 2012] [error] Traceback (most recent call last): 
[Sun Jul 08 13:30:34 2012] [error] File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/wsgi.py", line 219, in __call__ 
[Sun Jul 08 13:30:34 2012] [error] self.load_middleware() 
[Sun Jul 08 13:30:34 2012] [error] File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 39, in load_middleware 
[Sun Jul 08 13:30:34 2012] [error]  for middleware_path in settings.MIDDLEWARE_CLASSES: 
[Sun Jul 08 13:30:34 2012] [error] File "/usr/local/lib/python2.7/dist-packages/django/utils/functional.py", line 184, in inner 
[Sun Jul 08 13:30:34 2012] [error]  self._setup() 
[Sun Jul 08 13:30:34 2012] [error] File "/usr/local/lib/python2.7/dist-packages/django/conf/__init__.py", line 42, in _setup 
[Sun Jul 08 13:30:34 2012] [error]  self._wrapped = Settings(settings_module) 
[Sun Jul 08 13:30:34 2012] [error] File "/usr/local/lib/python2.7/dist-packages/django/conf/__init__.py", line 95, in __init__ 
[Sun Jul 08 13:30:34 2012] [error]  raise ImportError("Could not import settings '%s' (Is it on sys.path?): %s" % (self.SETTINGS_MODULE, e)) 
[Sun Jul 08 13:30:34 2012] [error] ImportError: Could not import settings 'abc.settings' (Is it on sys.path?): No module named scalamoosh.settings 

任何幫助/建議將不勝感激。乾杯

回答

4

您正在運行的問題是,雖然mod_wsgi的給每個Django應用程序自身的Python解釋器,它們仍然共享相同的操作系統環境,這就是Django的存儲設置模塊的名稱。我找到的解決方法是在創建WSGI應用程序對象之前更改Django查找settings模塊的環境變量的名稱。

我稍微修改wsgi.py看起來是這樣的:

import os 

# change the env variable where django looks for the settings module 
import django.conf 
django.conf.ENVIRONMENT_VARIABLE = "DJANGO_SECOND_SETTINGS_MODULE" 

os.environ.setdefault("DJANGO_SECOND_SETTINGS_MODULE", "second.settings") 

# This application object is used by any WSGI server configured to use this 
# file. This includes Django's development server, if the WSGI_APPLICATION 
# setting points here. 
from django.core.wsgi import get_wsgi_application 
application = get_wsgi_application() 
+0

這很好。非常感謝! :) – Scalamoosh 2012-08-10 21:08:05

2

目前看起來您並不像使用單獨的虛擬環境來處理您的兩個項目,如果不是,我會強烈建議您這樣做,看看問題是否會在此後繼續存在。您仍然可以使用相同的Apache實例,但運行兩個獨立的Django實例(以及項目的所有其他需求,這些需求可能會也可能不會有所不同)。這通常是任何Django項目的推薦方法。

如果你不瞭解虛擬環境,下面是關於使用virtualenv和Django的quickstart tutorial,我還建議使用Doug Hellman的非常漂亮的Virtualenv Wrapper。希望這可以幫助!

+0

我遇到同樣的問題,但我不確定virtualenv是否能解決這個問題。真正的問題是被其他應用程序覆蓋的DJANGO_SETTINGS_MODULE環境變量。 – stschindler 2012-07-10 05:26:17

+0

感謝有關virtualenv的信息。我一直想讓它成立一段時間,但從未接近它。不幸的是,它並沒有解決我的問題。就像@Tank提到的,每次使用不同的應用程序時,DJANGO_SETTING_MODULE變量(在apache(?)中)都會被覆蓋。 – Scalamoosh 2012-07-29 19:52:40

0

您是否使用memcached作爲高速緩存,或者其他兩種實例可以寫入同一個高速緩存文件的其他高速緩存方法?這可以解釋爲什麼這兩種環境混合起來。在這種情況下,只需在設置'CACHES字典中添加KEY_PREFIX變量即可。

CACHES = { 
    'default': { 
     'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 
     'LOCATION': '127.0.0.1:11211', 
     'KEY_PREFIX': 'scalamoosh' 
    } 
} 
+0

我目前沒有在任何一個網站上設置任何緩存,所以懷疑這會解決我的問題。謝謝你的信息。 – Scalamoosh 2012-07-29 19:54:19

2

的mod_wsgi的默認配置在同一過程的不同的子解釋器運行兩個Django的網站。不幸的是,Django在1.4中改變了他們生成的wsgi.py,並且新的文件使用了默認的mod_wsgi行爲。要解決這個問題,如果使用Django 1.4,進入wsgi.py文件,更改:

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

到:

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

也就是說,不使用os.environ.setdefault(),因爲由於環境變量在子解釋器之間泄漏的方式,當變量已經被另一個子解釋器中的其他Django站點設置時,它將不會執行任何操作。

更好的是,使用mod_wsgi守護進程模式併爲每個站點創建不同的守護進程組,並委派它們在不同的進程集中運行。這可以解決Django版本中的一個類似問題,那就是使用了不完全正確的VirtualHosts Apache配置。