Archive for category Python

Serving django media files from the same host as the passenger app server

WARNING: Please read before continuing ▼

Difficulty: Easy
Time: ~5 Minutes
Last Updated: 20rd September 2010
Applies to: *NIX

The recommended configuration for django is to have any static files, such as script, CSS or images uploaded onto a CDN network. While this is the best configuration for a large site, for toy applications it is overkill.

Also, you may wish to run your development environment using passenger, rather than using manage.py runserver.

To start, we need to make a media directory in your passenger app root, and then create a symbolic link to the admin media files located on your system.

1
2
3
cd /var/www
mkdir media #the directory where our media files will be stored
ln -s /usr/lib/pymodules/python2.6/django/contrib/admin/media/ admin_media

Next, we need to disable passenger on the directories/symlinks we have created, as per the previous article on the blog.

Once this is done, edit settings.py in your django app, specifying the new addresses for your media.

Finally, restart apache, and you should now be able to access the media files you need.

, , , , , ,

No Comments

Serving non-python files from a subdirectory of the passenger root.

WARNING: Please read before continuing ▼

Difficulty: Easy
Time: ~5 Minutes
Last Updated: 23rd September 2010
Applies to: *NIX

Serving non-python or ruby files from a subdirectory below the passenger app root requires a simple change to the site configuration.

Open it up, and add something similar to this under the VirtualHost entry (this example shows the subdirectory phpPgAdmin being disabled, so that phpPgAdmin can be served by php instead):

1
2
3
4
        Alias /phpPgAdmin /var/www/phpPgAdmin
        <Location /phpPgAdmin>
                PassengerEnabled off
        </Location>

Once this is done, restart php and any requests made to yourdomain.com/phpPgAdmin will not be served by passenger.

, , , , , , , , , ,

1 Comment

Serving django apps using Phusion Passenger (mod_rails)

WARNING: Please read before continuing ▼

Difficulty: Moderate
Time: varies
Last Updated: 23rd September 2010
Applies to: *NIX

Phusion passenger is a fast and robust solution for serving python web apps, particularly those using the Django framework.

To start, it is assumed you have a suitably configured *NIX base system. This has been tried using Gentoo and Ubuntu.

The next thing to do is to install apache2. NGINX is also supported, however we will be using apache. It should also be possible to use lighttpd, however, there is no official support for such a configuration.

Passenger prefers to use the worker mpm, however if you wish to run PHP apps on the same server instance, you need to use the prefork mpm.

Next, ensure that you install the django framework (your distribution probably has it available as a package, try “apt-get install python-django” or “zypper in python-django“). Also required is

The next step is to configure a VHost (or the default host if you will only be using a single app) and ensure that it can successfully serve static html files without issue.

Next, you need to add a line to the site config file, “PassengerAppRoot“. This tells passenger where to look for the python application you want to serve on that domain.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<VirtualHost python.app.domain.net:80>
        ServerAdmin adam@omega.org.uk

        PassengerAppRoot /var/www
        DocumentRoot /var/www

        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>

        <Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog /var/log/apache2/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog /var/log/apache2/access.log combined
</VirtualHost>

Once this is done, deploy your django app into /var/www, or wherever you specified the passenger app root to be. If you are writing an app from scratch, then the command is “django-admin startproject <projectname>“.

Finally, there is one more step you need to do before passenger will serve your app.

You need to create a passenger_wsgi.py file in the passenger root folder. This file looks like this:

1
2
3
4
5
6
7
8
import os, sys

sys.path.append(os.path.dirname(__file__))
os.environ['DJANGO_SETTINGS_MODULE'] = '<projname>.settings'

import django.core.handlers.wsgi

application = django.core.handlers.wsgi.WSGIHandler()

Once this is done, passenger should now start serving your apps.

One final note is that passenger does not cope very well with fatal errors. There tend to not be written to the browser or logs, making them hard to pin down.

To get around this, you can install python-paste (try “apt-get install python-paste“), and use this to catch any fatal errors.

To enable this, you need to make a small change to passenger_wsgi.py:

1
2
3
4
5
6
7
8
9
import os, sys

sys.path.append(os.path.dirname(__file__))
os.environ['DJANGO_SETTINGS_MODULE'] = '<projname>.settings'

import django.core.handlers.wsgi
from paste.exceptions.errormiddleware import ErrorMiddleware

application = ErrorMiddleware(django.core.handlers.wsgi.WSGIHandler(), debug=True)

If a fatal exception now occurs, it will have a stack trace recorded and emitted to the client. This is useful for testing, but should be used with care in a production environment, as it may expose information such as passwords if not configured correctly.

, , , , , , ,

No Comments

Technical Procedures is Digg proof thanks to caching by WP Super Cache