Home » deployment

Tag: deployment

Cherokee, uWSGi, Django, Python server set up.

Preamble:

As promised in my last blog post this post is going to be all about how to set up a server to run Cherokee with uWSGI for deploying Django or other Python applications.

Server setup:

I am going to make some assumptions about your server environment:

  1. You are running Ubuntu 10.04 or similar. Older versions may have some changes that need to be made.
  2. This is a brand new server or VPS running at either Slicehost or The Rackspace Cloud. Other companies may work but I’ve only tested here.
  3. You have set the machine up, at least doing the steps here and here.
  4. You have a Django project you can deploy.
  5. You are running an operating system that is intelligent enough to give you a shell and open ssh tunnels.

Now that your server is set up you can run this shell script to install all of the software we will be using:

Yes I am installing Python modules server wide and no I don’t care about the problems that can come with that, since, I am only going to be running one application from this server. If you think you are going to have a problem with that install the python modules in the appropriate directories or sub-directories how ever you want to do that.

Now that everything is installed, let’s get it set up. Here are the steps:

  1. Set up our postgres username, password, and database. Here is a link to get setup.
  2. Copy your Django project to: /home/username/
  3. Sync your database
  4. Start the cherokee admin by running: cherokee-admin
  5. Open a second shell and run: ssh -l username -L 9090:localhost:9090 IPADDRESSFORYOURSERVER (Now you can go to localhost:9090 on your computer’s browser and get to the Cherokee admin interface.) You’ll need to use the username and password that come up from Step 4 above.

You can now start the Cherokee server by clicking the start server button (cool huh?) Once it is started follow the directions here:
http://www.cherokee-project.com/doc/cookbook_uwsgi.html
Edit your django_wsgi.py and uwsgi.xml files to match your application’s settings. Once that is done you should be able to start your site as long as things are correct. Oh, and don’t put your Django files in /var/www.

Configuration Options:

Here are some more configuration options:

1. Have the Cherokee server match multiple domains to the same virtual host:

Dock

  1. a. Serve your admin media: 

Dock

b. Create a new rule as type Directory with the web directory being your admin media path (in this case mine is /media):

Dock

c. Change to the Handler tab choose Static Content and put the full path to your admin media in the Document Root including the trailing slash:

Dock

You can play with the other settings for it like gzip, deflate, and traffic shaping.
3. Change the user that the uWSGI process runs as, click Sources and select your uWSGI app:

Dock

I had to change this to the user where my code was deployed: /home/username/ for things to work correctly.

  1. Traffic monitoring. You can enable it by going to Status, then clicking on the virtual server, and checking enable at the bottom. You may need to choose RRDTool Graphs in General -> Network -> Information Collector:

Dock

Dock

  1. Looking at your log files if something isn’t working:
    You just need to cat or tail /var/log/cherokee/cherokee.error. If you want it to log somewhere else you can configure it by clicking vServers -> your vServer -> Logging and changing the path there:

Dock

Tips and Tricks:

If you get something like:
uWSGI Error, wsgi application not found
Make sure that you have set the user that the uWSGI process runs as (step 4 in Configuration Options), save and hard restart the server.

New Django/Python deployment stack: Django, Cherokee, and uWSGI.

What I had:

In the past couple of months I have been looking for alternatives to my current web stack. My current web stack is:

  • Django (my favorite web framework),
  • nginx (frontend web server),
  • apache + mod_wsgi (to serve the Django application), and
  • PostgreSQL the database, obviously.

Django isn’t getting replaced because I like it and I can’t get my coding partner to switch to anything else no matter how magical or revolutionary.

I fucking hate nginx configuration files so that was going out the window as soon as I could find a suitable replacement. Apache + mod_wsgi I’m not entirely unhappy with but the extra memory usage from Apache bloatware and, again, the ugly configuration files are annoying, especially, with non-standard PYTHONPATHs. Yes, I know I can do sys.path magic to work around it but I shouldn’t have to, this is 2010 not 1990, fuck that.

PostgreSQL is a great database server and I’m happy that the Django ORM just works with it so I don’t have to build my own ORM, big plus. I would love to give CouchDB a chance but I don’t have the time to rewrite _everything_ to work with it, I’ll use it with something else.

What I Found:

Looking for other web servers I came across Cherokee (http://www.cherokee-project.com/). The documentation on the Cherokee site is phenomenal, when have you EVER seen screen casts for how to configure your web server? Oh, and what is that? A screencast about deploying Django using uWSGI or Flup? Why, yes, that what you are seeing, isn’t that great? That isn’t the only good thing, Cherokee stacks up, speed wise, with nginx, has plenty of configuration “wizards”, and has a web front end for configuring the web server. I was mostly sold just from the documentation, compare this with this. The Apache docs may be informational but they are completely worthless if I want to get something done, today.

Configuring Cherokee is like using the WebFaction hosting interface, easy to use and as powerful as you want it to be. In fact, in the next blog post about how to set everything up you can see the similarities. (Disclaimer: I work for WebFaction so I am a little biased, however, in the 10 years that I have been dealing with web hosts I have never seen another hosting company build something so great at what it does: allow you to do as much or as little as you need, to get things done.)

After hours of looking through the different ways to serve WSGI applications I finally settled on uWSGI, mostly because it is written completely in C and has a really easy install process (read: one command, make). uWSGI is also able to used with Cherokee and Django really easily, see the screencast here: http://www.cherokee-project.com/screencasts.html#django_uwsgi. Now that is what I was looking for, easy to configure, easy to use, powerful, and fast. Also, setting the PYTHONPATH is as simple as 1 or more XML tags, like so:

<pythonpath>/path/you/are/adding/</pythonpath>

Fantastic! Have another path you want used? Add another line, that’s it.

Processes are automatically managed and restarted when they are killed. uWSGI has amusing errors, such as:

  • …brutally killing workers…
  • DAMN ! process 14955 died 🙁 trying respawn …

Log files are much more fun to read when they include some humor even if shit is wildly broken.

Next post will be about how to set all of this up, from nothing to a working deployment of a working Django app using Cherokee and uWSGI.