Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

multiple django sites with apache & mod_wsgi

I want to host several sites with under the same server which uses Debian 5, say I have site1, site2 and site3, and assume my ip is 155.55.55.1:

site1: 155.55.55.1:80  , script at /opt/django/site1/ site2: 155.55.55.1:8080, script at /opt/django/site2/ site3: 155.55.55.1:8090, script at /opt/django/site3/ 

Here is my apache default:

<VirtualHost *:80>     ServerName /     ServerAlias  */     DocumentRoot /opt/django/site1/     LogLevel warn     WSGIScriptAlias / /opt/django/site1/apache/django.wsgi     Alias /media /opt/django/site1/media/statics     Alias /admin_media  /home/myuser/Django-1.1/django/contrib/admin/media  </VirtualHost>  <VirtualHost *:80>     DocumentRoot "/usr/share/phpmyadmin"     ServerName /phpmyadmin     Alias /phpmyadmin /usr/share/phpmyadmin     <Directory /usr/share/phpmyadmin>         Options Indexes FollowSymLinks         AllowOverride None         Order Deny,Allow         Allow from all     </Directory> </VirtualHost> 

And here is my wsgi config for site1, at /opt/django/site1/apache/django.wsgi:

import os, sys import django.core.handlers.wsgi  sys.path.append('/opt/django') sys.path.append('/opt/django/site1')  os.environ['DJANGO_SETTINGS_MODULE'] = 'site1.settings' application = django.core.handlers.wsgi.WSGIHandler() 

How can I add site2 and site3, which are Django-based sites and will be served like site1?

like image 506
Hellnar Avatar asked Oct 12 '09 07:10

Hellnar


People also ask

Can you use Apache with Django?

Django will work with any version of Apache which supports mod_wsgi. The official mod_wsgi documentation is your source for all the details about how to use mod_wsgi. You'll probably want to start with the installation and configuration documentation.

Is Apache a Wsgi?

WSGI (Web Server Gateway Interface) is an interface between web servers and web apps for python. mod_wsgi is an Apache HTTP server module that enables Apache to serve Flask applications.

Is Django a Wsgi?

Django's primary deployment platform is WSGI, the Python standard for web servers and applications. Django's startproject management command sets up a minimal default WSGI configuration for you, which you can tweak as needed for your project, and direct any WSGI-compliant application server to use.


2 Answers

Your ServerName/ServerAlias directives are wrong. ServerName should be hostname. You probably should just delete ServerAlias.

Then just do the obvious and duplicate VirtualHost/Listen directives, just changing the port number and locations of scripts in the file system.

Finally, do not set DocumentRoot to be where your Django code is as it makes it easier to accidentally expose your source code to download if you stuff up Apache configuration. So, just remove DocumentRoot directive from VirtualHost for Django sites.

Listen 80  <VirtualHost *:80> ServerName www.example.com WSGIScriptAlias / /opt/django/site1/apache/django.wsgi Alias /media /opt/django/site1/media/statics Alias /admin_media  /home/myuser/Django-1.1/django/contrib/admin/media  <Directory opt/django/site1/apache> Order allow,deny Allow from all </Directory>  <Directory /home/myuser/Django-1.1/django/contrib/admin/media> Order allow,deny Allow from all </Directory> </VirtualHost>  Listen 8080  <VirtualHost *:8080> ServerName www.example.com WSGIScriptAlias / /opt/django/site2/apache/django.wsgi Alias /media /opt/django/site2/media/statics Alias /admin_media  /home/myuser/Django-1.1/django/contrib/admin/media  <Directory opt/django/site2/apache> Order allow,deny Allow from all </Directory>  <Directory /home/myuser/Django-1.1/django/contrib/admin/media> Order allow,deny Allow from all </Directory> </VirtualHost>  Listen 8090  <VirtualHost *:8090> ServerName www.example.com WSGIScriptAlias / /opt/django/site3/apache/django.wsgi Alias /media /opt/django/site3/media/statics Alias /admin_media  /home/myuser/Django-1.1/django/contrib/admin/media  <Directory opt/django/site3/apache> Order allow,deny Allow from all </Directory>  <Directory /home/myuser/Django-1.1/django/contrib/admin/media> Order allow,deny Allow from all </Directory> </VirtualHost> 

I have also add missing Directory directive for allowing access to static files. You should review paths however.

Make sure you read:

http://code.google.com/p/modwsgi/wiki/IntegrationWithDjango http://code.google.com/p/modwsgi/wiki/ConfigurationGuidelines#Hosting_Of_Static_Files

for further information.


UPDATE 1

BTW, since you are using PHP in same Apache, you would be much better off using mod_wsgi daemon mode and push each Django instance out into its own separate process. That allows those processes to be multithreaded, even though main Apache processes are forced to be single threaded because of PHP. End result will be much much less memory being used than if running multiple Django instances in each process under embedded mode with prefork MPM. Your Django code just needs to be thread safe. Configuration in addition to above would be to add WSGIDaemonProcess/WSGIProcessGroup to each Django VirtualHost, where name of daemon process group is different for each VirtualHost.

<VirtualHost *:80> WSGIDaemonProcess site1 display-name=%{GROUP} WSGIProcessGroup site1 ... existing stuff </VirtualHost>  <VirtualHost *:8080> WSGIDaemonProcess site2 display-name=%{GROUP} WSGIProcessGroup site2 ... existing stuff </VirtualHost>  <VirtualHost *:8090> WSGIDaemonProcess site3 display-name=%{GROUP} WSGIProcessGroup site3 ... existing stuff </VirtualHost> 

This also allows you to more easily restart each Django instance without restart whole of Apache. Read:

http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide#Delegation_To_Daemon_Process http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode

like image 77
Graham Dumpleton Avatar answered Sep 19 '22 11:09

Graham Dumpleton


Putting all virtualHost configuration in one place works fine, but Debian has its own concept by separating them in a file for each site in /etc/apache2/sites-available, which are activated by symlinking them in ../sites-enabled. In this way a server-admin could also assign separate access rights to the config file for each of the site-admin unix users, scripts can check if a site is active etc.

Basically it would be nice to have one central howto for Django-Admin installations, the current multitude of separate docs, links and blog articles is not really helpful for the proliferation of Django.

like image 23
Ed Doerr Avatar answered Sep 19 '22 11:09

Ed Doerr