Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Deploying multiple django apps on Apache with mod_wsgi

I want to deploy two different django apps in the same host: The first will correspond to the url /site1 and the second to the url /site2. Here's my configuration:

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>

Also here's the wsgi.py file for both applications

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()

Now, here's my problem. When I go to my server, let's say http://app1.sites.gr/site1 it some times loads site1, and some other times it loads site2 !!!! The same goes when I visit http://app1.sites.gr/site2 ... Sometiems I get the welcome page for site1, sometimes I get the welcome page for site2 ! I am hitting F5 and getting different welcome pages. I have checked everything for the previous hours and did not find anything strange...

Please, tell me what could be the problem before I go crazy ...

Thanks !

like image 782
Serafeim Avatar asked Jul 16 '12 13:07

Serafeim


People also ask

What is mod_wsgi in Apache?

mod_wsgi is an Apache HTTP Server module by Graham Dumpleton that provides a WSGI compliant interface for hosting Python based web applications under Apache. As of version 4.5. 3, mod_wsgi supports Python 2 and 3 (starting from 2.6 and 3.2).


3 Answers

This is a problem with the wsgi.py file generated by Django 1.4. It will not work where trying to host two distinct Django instances in the same process, even though in separate sub interpreters.

Change:

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

to:

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

Or better still use daemon mode and delegate each to run in distinct daemon process groups.

That is, instead of:

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 

use:

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

Note that there is a whole blog post about this and other causes now.

  • http://blog.dscpl.com.au/2012/10/requests-running-in-wrong-django.html
like image 178
Graham Dumpleton Avatar answered Sep 27 '22 22:09

Graham Dumpleton


Your apps listen on the same port, and there doesn't seem to be a proxy that delegates them to different ones.

You either have to setup VirtualHosts within apache or use Nginx, lighttpd or something else to create a proper proxy

like image 40
Hedde van der Heide Avatar answered Sep 27 '22 22:09

Hedde van der Heide


Graham Dumpleton's response is the one you probably want to read closest, but I would suggest saving yourself a lot of heartburn by hosting your two Djangos at the root of different subdomains rather than at non-root locations on the same domain. There are lots of gotchas for running non-root Django sites IMHO.

Good luck!

like image 26
Erik Avatar answered Sep 27 '22 20:09

Erik