I am experimenting on running two wsgi applications configured on the same VirtualHost. One of the apps myapp is the standard hello-world code specified here. It is loading absolutely fine. The other app, uiapp is a Django site. It fails with an ImportError.
I read in wsgi docs that value of python-path is appended to the sys.path, so that’s what I have specified in my WSGIDaemonProcess for uiapp.
I can’t figure out if the problem is with the Python code, or the Apache configuration.
This is my virtualhost configuration:
[ . . . ]
# 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>
[ . . . ]
I have tried to change the python-path for uiapp to /some/path/ui_dir/site_prod, but even that is failing with the same error.
The error-log is:
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
This is the source for /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)
Kindly help me figure out what I am doing wrong.
You can’t have two WSGIProcessGroup directives in a row like that. Only the last will be used. Thus you are actually sending both applications to the same daemon process group instead of different ones. Having done that and having them in the same process you are hitting the setdefault() issue described in:
Move the WSGIProcessGroup directives inside of the Directory blocks pertaining to the respective WSGI script file locations.