django-virtualenv-apache-mod_wsgi

15y, 298d ago [edited]

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

  1. Install Setup tools:

    $ sudo apt-get install python-setuptools memcached

  2. Install virtualenv:

    $ sudo easy_install virtualenv

Create a virtualenv

  1. Move to the directory where you want to create the virtualenv:

    $ cd /www/lostquery.com

  2. Create python environment:

    $ virtualenv --no-site-packages virtpy

Install Django

  1. Activate the virtualenv:

    $ source virtpy/bin/activate

  2. 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

  3. 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

  1. Get the sourcecode:

    $ svn co http://svn.osqa.net/svnroot/osqa/trunk

  2. Configure the application:

    $ cd trunk

    $ cp settings_local.py.dist settings_local.py

    $ vi settings_local.py

  3. 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/'

  4. Give apache access to a few directories, /trunk/log and /trunk/forum/upfiles:

    $ chmod 777 log $ chmod 777 forum/upfiles

  5. 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

  1. Turn on mod_rewrite:

    $ a2enmod rewrite

  2. Create a sites-available vhost apache2 file:

    $ sudo vi /etc/apache2/sites-available/007-lostquery

  3. Setup the host file:

Configure mod_wsgi

  1. Create the egg-cache directory:

    $ mkdir /www/lostquery.com/mod_wsgi

    $ mkdir /www/lostquery.com/mod_wsgi/egg-cache

  2. Create the wsgi dispatch file:

    $ vi /www/lostquery.com/mod_wsgi/dispatch.wsgi

  3. Setup the wsgi dispatch file:

Enable the Virtual Host and reload Apache2

  1. Reset apache2 so that it reads in the new config files:

    $ a2ensite lostquery

    $ sudo service apache2 reload


Comments

hide preview ▲show preview ▼

What's next? verify your email address for reply notifications!

fritzvd 14y, 196d ago

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:

a2ensite lostquery

/etc/init.d/apache2 reload

Is there any special reason why you don't do this?

Fritz

hide preview ▲show preview ▼

What's next? verify your email address for reply notifications!

foxhop 14y, 195d ago

@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

hide preview ▲show preview ▼

What's next? verify your email address for reply notifications!