Running Pyramid Web Framework with FastCGI
So, I’ve been experimenting a little bit with Python here and there lately. I finally decided to start looking into some of the different web frameworks, like Django, Pylons, Pyramid, web.py, etc. I chose to start playing around a little bit with Pyramid, mainly because it appears to allow more freedoms than Django (and I’m not going to attempt to build any type of blog/publishing website).
After I finished installing Pyramid and creating the folder structure of my site, one of my next steps was to ensure that I got some sane response from Apache showing that my site is alive. Now, my particular environment uses FastCGI, so I needed to find a way to allow FastCGI to serve up my shiny new Pyramid application that is written in Python.
There are three steps to do this:
- Create a
dispatch.fcgi
file – This will handle the the creation and running of the WSGI server - Chmod
dispatch.fcgi
to 0755 (it needs to be executable!) - Create a
.htaccess
file – This will route all incoming requests to thedispatch.fcgi
file
Create a dispatch.fcgi
File
This file, along with the upcoming .htaccess file, are the only files that are required to be visible by the public. That is, the source of the application can be safely stored above the document root, which can prevent potential attacks that could expose the application’s source code.
Create a dispatch.fcgi
file with the following content:
#!/path/to/your/bin/python import sys from paste.deploy import loadapp from flup.server.fcgi_fork import WSGIServer app = loadapp('config:/path/to/your/production.ini') server = WSGIServer(app) server.run()
Chmod dispatch.fcgi
to 0755
If you don’t do this, I promise you will spend a while trying to figure out what is preventing your site from serving up correctly.
Let’s take a quick look at what happens when dispatch.fcgi
is not executable.
[Wed May 02 02:10:25 2012] [info] mod_fcgid: server example.net:/path/to/my/dispatch.fcgi(130539) started [Wed May 02 02:10:25 2012] [warn] [client 127.0.0.1] (104)Connection reset by peer: mod_fcgid: error reading data from FastCGI server, referer: http://example.net/ [Wed May 02 02:10:25 2012] [error] [client 127.0.0.1] Premature end of script headers: dispatch.fcgi, referer: http://example.net/
… well then, I’m not sure how much more unhelpful that could be. Anyway, make sure that you don’t end up wasting time debugging a dumb issue and issue the following command:
chmod 0755 dispatch.fcgi
Create a .htaccess
file
The last and final step is to utilize mod_rewrite to redirect requests to the Python application via the dispatch.fcgi
file.
AddHandler fcgid-script .fcgi RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ dispatch.fcgi/$1 [QSA,L]
That’s it! The site should be accessible by navigating to the website URL where the dispatch.fcgi
file resides.
Things to Note
Keep in mind that the FastCGI application will continue running after the first request. If any changes are made to the dispatch.fcgi
file, be sure to kill the old instance of Python. This will force a new instance to be created on the next request, and cause the updated code to be executed.
This entry was posted on Tuesday, May 1st, 2012 at 7:23 pm and is filed under Python. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.