I'm about to deploy a mediumsized site powered by Django. I have a dedicated Ubuntu Server.

I'm really confused over which serversoftware to use. So i thought to myself: why not ask stackoverflow.

What i'm looking for is:

  • Easy to set up
  • Fast and easy on resources
  • Can serve mediafiles
  • Able to serve multiple djangosites on same server
  • I would rather not install PHP or anything else that sucks resources, and for which I have no use for.

I have heard of mod_wsgi and mod_python on Apache, nginx and lighty. Which are the pros and cons of these and have i missed someone?

@Barry: Somehow i feel like Apache is to bloated for me. What about the alternatives?

@BrianLy: Ok I'll check out mod_wsgi some more. But why do i need Apache if i serve static files with lighty? I have also managed to serve the django app itself with lighty. Is that bad in anyway? Sorry for beeing so stupid :-)

UPDATE: What about lighty and nginx - which are the uses-cases when these are the perfect choice?

+4  A: 

The officially recommended way to deploy a django project is to use mod_python with apache. This is described in the documentation. The main pro with this is that it is the best documented, most supported, and most common way to deploy. The con is that it probably isn't the fastest.

Though, Django supporting community on #django freenode agrees that the docs is just outdated, officially recommended way is mod_wsgi.
+6  A: 

As @Barry said the documentation uses mod_python. I haven't used Ubuntu as a server, but had a good experience with mod_wsgi on Solaris. You can find documentation for mod_wsgi and Django on the mod_wsgi site.

A quick review of your requirements:

  • Easy to setup I've found apache 2.2 fairly easy to build and install.
  • Fast and easy on resources I would say that this depends on your usage and traffic. * You may not want to server all files using Apache and use LightTPD (lighty) to server static files.
  • Can serve media files I assume you mean images, flash files? Apache can do this. Multiple sites on same server Virtual server hosting on Apache.
  • Rather not install other extensions Comment out anything you don't want in the Apache config.
I've got a setup like this - I'm use mod_wsgi to serve most of the site but have Alias directives to force Apache to handle the serving of static files from /media and /admin_media. Given that we're talking about a "mediumsized site", there's probably not a lot of need to mess with 'simpler' alternatives.
Sean McSomething
+1  A: 

If you're using lighthttpd, you can also use FastCGI for serving Django. I'm not sure how the speed compares to mod_wsgi, but if memory serves correctly, you get a couple of the benefits that you would get with mod_wsgi that you wouldn't get with mod_python. The main one being that you can give each application its own process (which is really helpful for keeping memory of different apps separated as well as for taking advantage of multi-core computers.

Edit: Just to add in regards to your update about nginix, if memory serves correctly again, nginix uses "greenlets" to handle concurrency. This means that you may need to be a little bit more careful to make sure that one app doesn't eat up all the server's time.

Jason Baker
nginx is a single-threaded server; but the backends (either HTTP, FastCGI or whatever) are separate processes.
+11  A: 
The mod_python module need not consume lots more memory. The view that it does has grown to be a bit of an urban myth, when reality is that the memory problems people were having were caused by how mod_python/Python had been installed and how Apache had been configured. The first issue was that in the past Python often wasn't installed with a shared library. This mean mod_python had to link it statically, causing local memory to be used due to address relocations. The other problem is people using prefork, which is better for PHP but sucks for Python.
Graham Dumpleton
+1  A: 

We use nginx and FastCGI for all of our Django deployments. This is mostly because we usually deploy over at Slicehost, and don't want to donate all of our memory to Apache. I guess this would be our "use case".

As for the remarks about the documentation being mostly in Russian -- I've found most of the information on the English wiki to be very useful and accurate. This site has sample configurations for Django too, from which you can tweak your own nginx configuration.

Ryan Duffield
I once had a problem with nginx that wasn't completely explained in the English documentation. I ran one Russian line through the translator (Google) and the problem was solved. So the Russian side of the documentation is more complete.
@stesch: interesting. care to elaborate?
+2  A: 

The best configuration is not so known I think. But here is:

  1. Use nginx for serving requests (dynamic to app, static content directly).
  2. Use python web server for serving dynamic content.

Two most speedy solutions for python-based web server is:

You need to look into google to find current best configuration for django (still in development).

+1  A: 

I’m using nginx (0.6.32 taken from Sid) with mod_wsgi. It works very well, though I can’t say whether it’s better than the alternatives because I never tried any. Nginx has memcached support built in, which can perhaps interoperate with the Django caching middleware (I don’t actually use it, instead I fill the cache manually using python-memcache and invalidate it when changes are made), so cache hits completely bypass Django (my development machine can serve about 3000 requests per second).

A caveat: nginx’ mod_wsgi highly dislikes named locations (it tries to pass them in SCRIPT_NAME), so the obvious ‘error_page 404 = @django’ will cause numerous obscure errors. I had to patch mod_wsgi source to fix that.

Roman Odaisky
+2  A: 

I'm struggling to understand all the options as well. In this blog post I found some benefits of mod_wsgi compared to mod_python explained.

Multiple low-traffic sites on a small VPS make RAM consumption the primary concern, and mod_python seems like a bad option there. Using lighttpd and FastCGI, I've managed to get the minimum memory usage of a simple Django site down to 58MiB virtual and 6.5MiB resident (after restarting and serving a single non-RAM-heavy request).

I've noticed that upgrading from Python 2.4 to 2.5 on Debian Etch increased the minimum memory footprint of the Python processes by a few percent. On the other hand, 2.5's better memory management might have a bigger opposite effect on long-running processes.

+3  A: 

I'm using Cherokee.

According to their benchmarks (grain of salt with them), it handles load better than both Lighttpd and nginx... But that's not why I use it.

I use it because if you type cherokee-admin, it starts a new server that you can log into (with a one-time password) and configure the whole server through a beautifully-done webmin. That's a killer feature. It has already saved me a lot of time. And it's saving my server a lot of resources!

As for django, I'm running it as a threaded SCGI process. Works well. Cherokee can keep it running too. Again, very nice feature.

The current Ubuntu repo version is very old so I'd advise you use their PPA. Good luck.

+1  A: 

Keep it simple: Django recommends Apache and mod_wsgi (or mod_python). If serving media files is a very big part of your service, consider Amazon S3 or Rackspace CloudFiles.

+1. Apache + mod_wsgi is recommended. Lacking links about claims though.
Configuring apache is not simplier than nginx/lighttpd.
+1  A: 

There are many ways, approach to do this.For that reason, I recommend to read carefully the article related to the deployment process on Eric Florenzano - Deploying Django with FastCGI: Read too: Mike Malone - Scaling Django Stochastictechnologies Blog: The perfect Django Setup Mikkel Hoegh Blog: 35 % Response-time-improvement-switching-uwsgi-nginx