Now there's a better solution -> gunicorn.
What is a gunicorn?
Gunicorn 'Green Unicorn' is a Python WSGI HTTP Server for UNIX. It's a pre-fork worker model ported from Ruby's Unicorn project. The Gunicorn server is broadly compatible with various web frameworks, simply implemented, light on server resources, and fairly speedy.If you are a fastcgi user, please check gunicorn asap. I'm sure you will get much more from your hardware :-)
Ps: Note that you get the most if database is not the bottleneck. That's why you should use cache everywhere if possible.
Here's my script for gunicorn + daemontools for supervising:
#!/bin/sh
# SITE_PATH is a directory where settings.py is stored
SITE_PATH=/var/www/django/projects/my_project/; export SITE_PATH
USER=www-data
TCP=127.0.0.1:8888
exec setuidgid $USER /usr/bin/gunicorn_django -b ${TCP} -w 3 --max-requests=1000 ${SITE_PATH}settings.py 2>&1
Seems like wsgi is also recommended with the new 1.4 version of Django
If you’re new to deploying Django and/or Python, we’d recommend you try mod_wsgi first. In most cases it’ll be the easiest, fastest, and most stable deployment choice.Check django site for more information.
UPDATE:
Forgot to mention that I've switched from lighttpd to Nginx.
You can use the script above with the following nginx config:
server {
listen xx.xx.xx.xx:80;
server_name domain.com www.domain.com;
root /var/www/django/projects/my_project/public;
access_log /var/log/nginx/domain-access.log;
rewrite ^/admin(.*) https://domain.com/admin$1 permanent;
location = /favicon.ico { access_log off; log_not_found off; }
location /media {
root /var/www/django/projects/my_project/django/contrib/admin;
}
location /static {
root /var/www/django/projects/my_project/site_media;
access_log off;
}
location /site_media {
root /var/www/django/projects/my_project;
}
location / {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_connect_timeout 10;
proxy_read_timeout 10;
proxy_pass http://127.0.0.1:8888/;
}
}
There's a trick you need to apply to get the real ip of the request source as seen in the line:
proxy_set_header X-Forwarded-For $remote_addr;
Here's a code I'm using:
class XForwardedForMiddleware(object):
def process_request(self, request):
if "HTTP_X_FORWARDED_FOR" in request.META:
ip = request.META["HTTP_X_FORWARDED_FOR"]
if ip.startswith('::ffff:'):
ip = ip[len('::ffff:'):]
request.META["REMOTE_ADDR"] = ip
request.META["REMOTE_HOST"] = None
Add XForwardedForMiddleware to your settings.py MIDDLEWARE_CLASSES setting.