Posts Tagged Time: varies
Serving django apps using Phusion Passenger (mod_rails)
Posted by Adam in Programming, Python on Friday September 10, 2010
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.
Opening an elevated command prompt
Posted by Adam in Changing Settings, Linux, OS X, Windows on Sunday November 29, 2009
WARNING: Please read before continuing ▼
Difficulty: Easy
Time: varies
Last Updated: 29th November 2009
Applies to: OS X, Windows, *NIX
Often when performing system administration, you will come across a command that needs to be run as a more priviliged user. Depending on what operating system you use, the procedure for opening an elevated command prompt varies. Read the rest of this entry »
Comparing the contents of 2 directories
Posted by Adam in Fixing Errors, Linux, OS X, Uncategorized on Monday November 9, 2009
WARNING: Please read before continuing ▼
Difficulty: Easy
Time: Varies
Last Updated: 9th November 2009
Applies to: OS X, and Linux
Sometimes, you can end up with multiple copies of a directory from different times. If the number of files is small, then comparing the contents is easy. With large directories, telling the difference between them can be nearly impossible.
Remotely controlling OS-X via a web page
Posted by Adam in OS X, Programming on Saturday October 24, 2009
WARNING: Please read before continuing ▼
Difficulty: Expert
Time: varies
Last Updated: 24th October 2009
Applies to: OS X
Applescript is a scripting language provided by OS X that has the ability to automate significant portions of the system.
PHP has the ability to, given the right configuration, make arbitrary system calls, including applescript.
Using the two together, one can remotely control a number of functions on an OS X system via a web page.
Mixing C++ and Objective-C code using XCode
Posted by Adam in OS X, Programming on Tuesday October 20, 2009
WARNING: Please read before continuing ▼
Difficulty: Expert
Time: varies
Last Updated: 20th October 2009
Applies to: Objective-C
With the release of the iPhone SDK and the growing popularity of OS X, Objective-C is becoming the language of choice for a significant amount of projects.
One inescapable fact in the programming world is the existence of legacy code. Moving to a new language typically means porting or rewriting existing code entirely in the new language. In the case of Objective-C, most existing C and C++ code can be used directly.