django-virtualenv-apache-mod_wsgi
Django virtualenv Apache2 mod_wsgi
By the end of this article you will know how to deploy a Django web application using a python virtualenv, using an Apache2 webserver with mod_wsgi.
You should bookmark this page.
Why use wsgi and virtualenv?
- I also host pylons applications using mod_wsgi and apache2 and mod_python is incompatible.
- mod_wsgi is fast.
- I don't want my public site-packages library conflicting with other applications.
Install virtualenv
Install Setup tools:
$ sudo apt-get install python-setuptools memcached
Install virtualenv:
$ sudo easy_install virtualenv
Create a virtualenv
Move to the directory where you want to create the virtualenv:
$ cd /www/lostquery.com
Create python environment:
$ virtualenv --no-site-packages virtpy
Install Django
Activate the virtualenv:
$ source virtpy/bin/activate
The shell should have changed to (virtpy) $ . Run this command to install django to the virtualenv:
# I know this version works... $ easy_install django==1.3.1
Install any dependencies you will need to the virtualenv:
$ easy_install MySQL-python markdown html5lib modwsgideploy python-openid South python-memcached
Install and configure the Django web application
Get the sourcecode:
Configure the application:
$ cd trunk
$ cp settings_local.py.dist settings_local.py
$ vi settings_local.py
You must tell the Django's application what database to use. Also configure memcached:
# database settings DATABASE_NAME = 'databasename' # Or path to database file if using sqlite3. DATABASE_USER = 'username' # Not used with sqlite3. DATABASE_PASSWORD = 'p@ssw0rd' # Not used with sqlite3. DATABASE_ENGINE = 'mysql' #mysql, etc DATABASE_HOST = 'localhost' DATABASE_PORT = ''
# memcached settings (osqa is slow as dirt without this) CACHE_BACKEND = 'memcached://127.0.0.1:11211/'
Give apache access to a few directories, /trunk/log and /trunk/forum/upfiles:
$ chmod 777 log $ chmod 777 forum/upfiles
Create the database (example syntax to create a mySQL database).
Let the django application build the tables in the new database:
$ python manage.py syncdb --all $ python manage.py migrate forum --fake
Configure Apache2 VirtualHost
Turn on mod_rewrite:
$ a2enmod rewrite
Create a sites-available vhost apache2 file:
$ sudo vi /etc/apache2/sites-available/007-lostquery
Setup the host file:
Configure mod_wsgi
Create the egg-cache directory:
$ mkdir /www/lostquery.com/mod_wsgi
$ mkdir /www/lostquery.com/mod_wsgi/egg-cache
Create the wsgi dispatch file:
$ vi /www/lostquery.com/mod_wsgi/dispatch.wsgi
Setup the wsgi dispatch file:
Enable the Virtual Host and reload Apache2
Reset apache2 so that it reads in the new config files:
$ a2ensite lostquery
$ sudo service apache2 reload
Remarkbox
Comments
Hi,
Thanks this is great and exhaustive. Helped me host my django. One question though, I usually do this: Create sites and put them in: sites-available. Reload apache2 for a graceful restart. Call them/switch on:
Is there any special reason why you don't do this?
Fritz
export
@fritzvd
I have recently started using the a2ensite method that you described.
Thanks for your input. I have adjusted the tutorial. Feel free to adjust anything you feel need work!
Foxhop
export