2012-11-23 51 views
1

我正在試驗運行兩個在同一個VirtualHost上配置的wsgi應用程序。其中一個應用myapp是指定的標準hello-world代碼here。它裝載絕對好。其他應用程序uiapp是一個Django站點。它以ImportError失敗。Django站點導入錯誤,在守護進程模式下使用mod_wsgi

wsgi docs讀到的python-path價值被附加到sys.path,所以這就是我在WSGIDaemonProcess指定爲uiapp

我無法弄清楚問題出在Python代碼還是Apache配置上。

這是我的虛擬主機配置:

[ . . . ] 

    # processGroups 
    WSGIProcessGroup uiapp 
    WSGIProcessGroup myapp 

    # configurations for django sites 
    WSGIScriptAlias /uiapp "/some/path/ui_dir/site_prod/wsgi.py" 
    WSGIScriptAlias /myapp "/some/other/path/myapp.wsgi" 

    # daemons 
    WSGIDaemonProcess uiapp processes=2 threads=25 display-name=site_prod_wsgi python-path=/some/path/ui_dir 
    WSGIDaemonProcess myapp processes=2 threads=25 display-name=helloworld_wsgi 

    # doc root for /uiapp 
    <Directory "/some/path/ui_dir/site_prod"> 
     Order allow,deny 
     Allow from all 
    </Directory> 

    # doc root for /myapp 
    <Directory "/some/other/path"> 
     Order allow,deny 
     Allow from all 
    </Directory> 

    [ . . . ] 

我試圖給python-pathuiapp更改爲/some/path/ui_dir/site_prod,但即使是使用相同的錯誤而失敗。

錯誤日誌是:

mod_wsgi (pid=32652): Exception occurred processing WSGI script '/some/path/ui_dir/site_prod/wsgi.py'. 
Traceback (most recent call last): 
    File "/home/usr/local/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 219, in __call__ 
    self.load_middleware() 
    File "/home/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 39, in load_middleware 
    for middleware_path in settings.MIDDLEWARE_CLASSES: 
    File "/home/usr/local/lib/python2.7/site-packages/django/utils/functional.py", line 184, in inner 
    self._setup() 
    File "/home/usr/local/lib/python2.7/site-packages/django/conf/__init__.py", line 42, in _setup 
    self._wrapped = Settings(settings_module) 
    File "/home/usr/local/lib/python2.7/site-packages/django/conf/__init__.py", line 95, in __init__ 
    raise ImportError("Could not import settings '%s' (Is it on sys.path?): %s" % (self.SETTINGS_MODULE, e)) 
ImportError: Could not import settings 'site_prod.settings' (Is it on sys.path?): No module named site_prod.settings 

這是/some/path/ui_dir/site_prod/wsgi.py

import os 

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

from django.core.wsgi import get_wsgi_application 
application = get_wsgi_application() 

# Apply WSGI middleware here. 
# from helloworld.wsgi import HelloWorldApplication 
# application = HelloWorldApplication(application) 

源請幫我找出我在做什麼錯。

回答

4

你不能在那樣的連續兩個WSGIProcessGroup指令。只有最後一個會被使用。因此,您實際上將兩個應用程序都發送到相同的守護進程組,而不是不同的應用程序。

移動WSGIProcessGroup指令涉及到各自的WSGI腳本文件的目錄塊內:有做到這一點,並讓他們在同一過程中,你的擊球setdefault()問題描述位置。

+0

謝謝格雷厄姆。這解決了我的問題。你的博客文章解釋得很清楚。 – Unos

+0

感謝Graham在mod_wsgi上的出色工作以及解決此配置問題的方法。我面臨同樣的問題。 –

1

如果您查看django文檔版本1.3的前一個版本而不是1.4,那麼How to use Django with Apache and mod_wsgi可以幫助您解決問題。當我配置虛擬主機時,我遇到了同樣的問題。所以不要在虛擬主機配置中指定python-path=/some/path/ui_dir。你可以在/some/path/ui_dir/site_prod/wsgi.py中將下面的行添加到該文件中。在導入和運行django之前,將這些行放在文件頂部的行之前。

代碼

import sys 
path = '/some/path/ui_dir' 
if path not in sys.path: 
    sys.path.append(path) 
0

...,並確保你已經設置DJANGO_SETTINGS_MODULE在wsgi.py

os.environ['DJANGO_SETTINGS_MODULE'] = 'settings.could.be.somewhere.else' 
0

試試這個:

虛擬主機:

<Virtualhost project.dev> 
    DocumentRoot "/full/path/to/project/root/" 

    WSGIScriptAlias//full/path/to/wsgi/file/wsgi.py 
</Virtualhost> 

wsgi.py:

sys.path = ['path/to/project/root'] + sys.path 
相關問題