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 web.py
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)
# 1.2.1.1. Using apt-get:
sudo apt-get install python-setuptools
# 1.2.1.2. Manually retrieving easy_install from the web using wget
wget http://peak.telecommunity.com/dist/ez_setup.py
sudo python ez_setup.py
# 1.2.2. Now get the web.py egg using python’s easy_install
# This will put the python ‘web’ module in your python environment path
sudo easy_install web.py
1.3. Install webpy straight from git
# Or, get webpy straight from git
git clone git://github.com/webpy/webpy.git ln -s `pwd`/webpy/web .
2. Write Your Web.py App
Choose a directory where you would like your web.py 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 web.py 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 web.py
# this will create our application file ~/project/main.py
touch main.py
2.3. Open your application with your favourite editor
# Substitute “emacs -nw” with an editor of your choice: vim, nano, etc
emacs -nw main.py
2.4. Paste the following in your app file and save
import web
app_path = os.path.dirname(__file__)
sys.path.append(app_path)
if app_path: # Apache
os.chdir(app_path)
else: # CherryPy
app_path = os.getcwd()
urls = (
'/(.*)', 'hello'
)
# WARNING
# 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__":
app.run()
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:
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 web.py
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)
# 1.2.1.1. Using apt-get:
sudo apt-get install python-setuptools
# 1.2.1.2. Manually retrieving easy_install from the web using wget
wget http://peak.telecommunity.com/dist/ez_setup.py
sudo python ez_setup.py
# 1.2.2. Now get the web.py egg using python’s easy_install
# This will put the python ‘web’ module in your python environment path
sudo easy_install web.py
1.3. Install webpy straight from git
# Or, get webpy straight from git
git clone git://github.com/webpy/webpy.git ln -s `pwd`/webpy/web .
2. Write Your Web.py App
Choose a directory where you would like your web.py 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 web.py 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 web.py
# this will create our application file ~/project/main.py
touch main.py
2.3. Open your application with your favourite editor
# Substitute “emacs -nw” with an editor of your choice: vim, nano, etc
emacs -nw main.py
2.4. Paste the following in your app file and save
import web
app_path = os.path.dirname(__file__)
sys.path.append(app_path)
if app_path: # Apache
os.chdir(app_path)
else: # CherryPy
app_path = os.getcwd()
urls = (
'/(.*)', 'hello'
)
# WARNING
# 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__":
app.run()
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:
ServerAdmin admin@project.com DocumentRoot /var/www/project.com/public_html/ ErrorLog /var/www/project.com/logs/error.log CustomLog /var/www/project.com/logs/access.log combined WSGIScriptAlias / /var/www/project.com/production/main.py Alias /static /var/www/project.com/public_html 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.
No comments:
Post a Comment