Complete Tutorial: Webpy + Apache + mod_wsgi on Ubuntu

There has been plenty of tutorials and blogs on how to configure webpy application with apache and mod_wsgi, but none of them turned into successful one. After 2 days of research i have found the solution and decided to write a blog on the same. Hope it will be useful for others.

In the future, I hope to update this post to also include a complete list of steps for getting setup with python’s webpy over lighttpd.

1. Install

1.1. Install webpy with apt-get

sudo apt-get install python-webpy

1.2. Install webpy using easy_install using python setuptools 

1.2.1. Install python setuptools (easy_install)

# Using apt-get:

sudo apt-get install python-setuptools
# Manually retrieving easy_install from the web using wget

sudo python

# 1.2.2. Now get the egg using python’s easy_install
# This will put the python ‘web’ module in your python environment path

sudo easy_install

1.3. Install webpy straight from git

# Or, get webpy straight from git

git clone git:// ln -s `pwd`/webpy/web .

2. Write Your App

Choose a directory where you would like your python application to live. If my username is ‘mek’ and I want to name my project ‘project’, I might make a directory /home/sajee/project.

2.1. Make a directory for your app to live
# Replace the word project in the path below with your desired project name

mkdir ~/project
cd ~/project # move into the project directory you have created

2.2. Create your application file using
# this will create our application file ~/project/

2.3. Open your application with your favourite editor

# Substitute “emacs -nw” with an editor of your choice: vim, nano, etc

emacs -nw

2.4. Paste the following in your app file and save

import web

app_path = os.path.dirname(__file__)

if app_path: # Apache
else: # CherryPy
app_path = os.getcwd()

urls = (
‘/(.*)’, ‘hello’
# web.debug = True and autoreload = True
# can mess up your session: I’ve personally experienced it
web.debug = False # You may wish to place this in a config file
app = web.application(urls, globals(), autoreload=False)
application = app.wsgifunc() # needed for running with apache as wsgi
class hello:
def GET(self, name):
if not name:
name = ‘World’
return ‘Hello, ‘ + name + ‘!’

if __name__ == “__main__”:

2.4. (Optional) Setup static directory for imgs, css, js, etc
# Having a static directory allows you to serve static content without
# your webpy application trying to steal focus and parse the request
# This is especially important using the default CherryPy server.
# We’ll also handle this case in our apache config within:
# /etc/apache2/sites-available

mkdir ~/project/static

3. Install Apache2

3.1. Install apache and wsgi dependencies

sudo aptitude install apache2 apache2.2-common apache2-mpm-prefork apache2-utils libexpat1 ssl-cer
# I like to also install python-dev (optional) to make sure I have
# python’s latest support files

sudo apt-get install python-dev
3.2. Install apache mod_wsgi and enable mod_wsgi + mod_rewrite

sudo aptitude install libapache2-mod-wsgi
sudo a2enmod mod-wsgi;sudo a2enmod rewrite
Need help troubleshooting your apache/mod_wsgi installation?

4. Configure Apache2 With Your App

In the following steps, replace ‘project’ with the name of your project

4.1. Make Apache Directories for your project

sudo mkdir /var/www/project
sudo mkdir /var/www/project/production
sudo mkdir /var/www/project/logs
sudo mkdir /var/www/project/public_html
4.2. Create Symlinks
Creating symlinks to your project files is an important covention as, if there is a problem with one of your code bases, you can simply change your symlink to a stable codebase without having to modify your apache configuration.

ln -s ~/project/ production
ln -s ~/project/static public_html # If you created the static directory in step 2.4.
4.3. Replace you /etc/apache2/sites-available/default with:

DocumentRoot /var/www/
ErrorLog /var/www/
CustomLog /var/www/ combined

WSGIScriptAlias / /var/www/
Alias /static /var/www/
AddType text/html .py
WSGIDaemonProcess www-data threads=15
WSGIProcessGroup www-data

Order deny,allow
Allow from all
Options +FollowSymLinks
Options -Indexes

4.4. Change the group and owner of files requiring write access to apache’s www-data
Careful in this step to only change the group and owner of directories or files that will require write access.

sudo chgrp -R www-data
sudo chown -R www-data

5.Try to run!

sudo /etc/init.d/apache2 restart # Open your browser and visit the url: http://localhost or 127.0.01

You will see Hello World on the browser.

One thought on “Complete Tutorial: Webpy + Apache + mod_wsgi on Ubuntu

  1. Thank you for sharing. However, some additional clarifications are essential.
    1) What is the exact name of the file to be replaced in /etc/apache2/sites-available/default? (under /etc/apache2/sites-available/ , there are two files: 000-default.conf and default-ssl.conf)
    2) How ‘project’ directory (folder) would become ‘’ stated in the replacement file?
    3) Where is www-data? When I do your commands, the error says: missing operand after ‘www-data’


Leave a Reply

Please log in using one of these methods to post your comment: Logo

You are commenting using your account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.