31
Production-grade Servers for Django DjangoDay 2012 Roberto De Ioris (Unbit) giovedì 26 aprile 12

Unbit djangoday 20120419

  • Upload
    webdebs

  • View
    1.440

  • Download
    4

Embed Size (px)

Citation preview

Page 1: Unbit djangoday 20120419

Production-grade Servers for Django

DjangoDay 2012Roberto De Ioris (Unbit)

giovedì 26 aprile 12

Page 2: Unbit djangoday 20120419

python manage.py runserver

Why not ?

giovedì 26 aprile 12

Page 3: Unbit djangoday 20120419

Availability

crash happens. always.

giovedì 26 aprile 12

Page 4: Unbit djangoday 20120419

Concurrency

there is no “premature optimization” thing in sysadmins world

giovedì 26 aprile 12

Page 5: Unbit djangoday 20120419

Users

They ignore you when things go well. They hate you when things go wrong. They want to kill you a bunch

of minutes later...

giovedì 26 aprile 12

Page 6: Unbit djangoday 20120419

Servers are a cost

...and can became the higher cost very easily

giovedì 26 aprile 12

Page 7: Unbit djangoday 20120419

The manager want to scale

...even if he does not know what it means

giovedì 26 aprile 12

Page 8: Unbit djangoday 20120419

Security

be ready for the truth

giovedì 26 aprile 12

Page 9: Unbit djangoday 20120419

WSGI

one standard to rule them all...

def application(env, start_response):

start_response(‘200 OK’, [(‘Content-Type’,‘text/html’)])

return “Hello World”

giovedì 26 aprile 12

Page 10: Unbit djangoday 20120419

Proxy servers and static contents

do not expose your app to the world. NEVERdo not serve static !les with Django. NEVER

giovedì 26 aprile 12

Page 11: Unbit djangoday 20120419

app

appwebserver

app

world

giovedì 26 aprile 12

Page 12: Unbit djangoday 20120419

Once upon a time...

Flup and mod_python

giovedì 26 aprile 12

Page 13: Unbit djangoday 20120419

Flup

FastCGI, SCGI, AJPpure python, preforking-multithread

giovedì 26 aprile 12

Page 14: Unbit djangoday 20120419

mod_python

was a bad idea ?

giovedì 26 aprile 12

Page 15: Unbit djangoday 20120419

The new generation

mod_wsgigunicorn

uWSGI

giovedì 26 aprile 12

Page 16: Unbit djangoday 20120419

mod_wsgiapache module (in C)

2 modes: embedded and daemon

preforking and multithread

mature

solid

Windows support

giovedì 26 aprile 12

Page 17: Unbit djangoday 20120419

# mod_wsgi config

WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.pyWSGIPythonPath /path/to/mysite.com

WSGIDaemonProcess pippo processes=2 threads=15

<Directory /path/to/mysite.com/mysite> <Files wsgi.py> Order deny,allow Allow from all </Files></Directory>

giovedì 26 aprile 12

Page 18: Unbit djangoday 20120419

gunicorn

pure python

do one thing do it well

preforking (+async extensions)

speaks http

easy (maybe the easiest tool ever written)

giovedì 26 aprile 12

Page 19: Unbit djangoday 20120419

PYTHONPATH=/var/www gunicorn --workers 2 --bind 127.0.0.1:8000 pippo.wsgi:application

# or add gunicorn to INSTALLED_APPS# it will bind to port 8000

python manage.py run_gunicorn

giovedì 26 aprile 12

Page 20: Unbit djangoday 20120419

uWSGIpure C

preforking + multithread + async + plugins + blah blah

feature rich (a blast beat of options)

speaks uwsgi,FastCGI,Mongrel2-zeromq,HTTP and maybe Klingon

fat-beardy-braces_equipped sysadmin friendly

high learning curve

made only for making money

Mr Wolf would wear a uWSGI t-shirt

giovedì 26 aprile 12

Page 21: Unbit djangoday 20120419

uwsgi --http-socket 127.0.0.1:8000 --wsgi-!le /var/ww/pippo/wsgi.py --processes 2 --threads 15

# or

[uwsgi]http-socket = 128.0.0.1:8000wsgi-!le = /var/ww/pippo/wsgi.pyprocesses = 2threads = 15

# or

<uwsgi> <http-socket> 128.0.0.1:8000</http-socket> <wsgi-!le> /var/ww/pippo/wsgi.py</wsgi-!le> <processes>2</processes> <threads>15</threads></uwsgi>

#or .....

giovedì 26 aprile 12

Page 22: Unbit djangoday 20120419

before you ask...

speed is not a problem

giovedì 26 aprile 12

Page 23: Unbit djangoday 20120419

Which One?

no easy answers...but...

giovedì 26 aprile 12

Page 24: Unbit djangoday 20120419

DO NOT LOOK AT BENCHMARKS

...otherwise you will directly go with uWSGI...

giovedì 26 aprile 12

Page 25: Unbit djangoday 20120419

Newbie ?

gunicorn is the easiest choice

giovedì 26 aprile 12

Page 26: Unbit djangoday 20120419

need full apache integration ?

mod_wsgi FTW

giovedì 26 aprile 12

Page 27: Unbit djangoday 20120419

want a full stack ?

uWSGI has no competitors

giovedì 26 aprile 12

Page 28: Unbit djangoday 20120419

on the cloud ?

gunicorn and uWSGI all over the place

giovedì 26 aprile 12

Page 29: Unbit djangoday 20120419

still confused ?

gunicornuWSGI

mod_wsgi

giovedì 26 aprile 12

Page 30: Unbit djangoday 20120419

other choices ?

a lot...

Tornado

Passenger

fapws3

...

giovedì 26 aprile 12

Page 31: Unbit djangoday 20120419

Questions ?

giovedì 26 aprile 12