SlideShare a Scribd company logo
uWSGI
Swiss army knife for your Python web apps
TOMISLAV RAŠETA
@traseta
me
 scribbling and doodling on *IX operating systems for 10+ years
 working as sysadmin/DevOps with a hint of networking
 tools of the trade
 nginx apache tomcat (ugh!)
 python php java (ugh!)
 postgresql mysql
 memcached redis mongo
 not a developer, sorry :)
before we begin
 know your environment
 server specs (cores, memory, bandwidth)
 virtualenv or global
 know your application
 database pooling agents and latencies
 python version requirements (!)
 Linux kernel tunables
 limits.conf (file descriptors)
 ipv4.tcp_tw_reuse (not recycle)
 kernel.shmmax
 ipv4.ip_local_port_range
what it is
 full stack for building hosting services
 pluggable architecture
 mostly used as application server for Python apps using WSGI
 “WSGI is the Web Server Gateway Interface. It is a specification that
describes how web server communicates with web applications, and how
web applications can be chained together to process one request.”
 rules
 versatility
 performance
 low-resource usage
 reliability
 developed by @unbit (Italy)
 awesome docs
installation
 PyPI
 most recent versions, maintained by devs
 pip install uwsgi
 use virtualenv when possible
 watch out for dependencies - check what you actually need, the
compile errors/warnings are very descriptive
 distro packed versions are *always* outdated
 “from source” - please avoid :)
configuration
 choice of xml, ini, command-line arguments etc.
 read the docs carefully
 don’t reinvent the wheel
 "Please, turn on your brain and try to adapt shown configs to your
needs, or invent new ones."
configuration example (xml), start from ve
<uwsgi>
<chdir>/home/user/ve/app</chdir>
<wsgi-file>project.wsgi</wsgi-file>
<uid>user</uid>
<gid>user</gid>
<uwsgi-socket>/home/user/uwsgi/uwsgi.sock</uwsgi-socket>
<chmod-socket>600</chmod-socket>
<pidfile>/home/user/uwsgi/uwsgi.pid</pidfile>
<stats>/home/user/uwsgi/uwsgistats.sock</stats>
<buffer-size>8192</buffer-size>
<post-buffering>4096</post-buffering>
<memory-report/>
<daemonize>/home/user/uwsgi/daemon.log</daemonize>
<reload-mercy>20</reload-mercy>
<max-requests>500</max-requests>
<max-worker-lifetime>86400</max-worker-lifetime>
<socket-timeout>5</socket-timeout>
<disable-logging/>
<reload-on-rss>256</reload-on-rss>
<touch-reload>/home/user/ve/app/project.wsgi</touch-reload>
<enable-threads/>
<threads>1</threads>
<processes>100</processes>
<single-interpreter/>
<vacuum/>
</uwsgi>
start it up
 activate ve
 uwsgi --xmlconfig /home/user/uwsgi/uwsgi.xml
 configure and start nginx
location / {
include uwsgi_params;
uwsgi_pass unix:/home/wmaster/uwsgi/uwsgi.sock;
}
 ta-daa!
 tip: socket based pass doesn’t consume server TCP port usage = less
SYSCPU time on your server; you can use TCP but check your kernel
tunables before! (tcp_tw_reuse, ip_local_port_range
 tip2: you can also use mod_uwsgi and apache
cool conf stuff (I)
 harakiri (timeout)
 every request is timestamped
 If a master process finds a worker with a timestamp running more than
specified timeout it will kill it
 logs: “F*CK !!! i must kill myself (pid: 9984 app_id: 0)”
 reload-on-rss
 gracefully reload a worker after the memory consumption of the worker
goes above this threshold
 you’re alive even if you have a nasty memory leak
 max-requests - gracefully reload a process after n requests
 max-worker-lifetime – gracefully reload a process after n seconds
 logs: “...The work of process PID is done. Seeya!"
cool conf stuff (II)
 reload-mercy
 wait for n seconds for worker to die during reload/shutdown
 touch-reload
 reload your app by touching a single file (your main project file)
 attach-daemon
 attach-daemon = memcached -p 11911 -u user
 when uWSGI is stopped or reloaded, memcahed is destroyed
 smart-attach-daemon
 smart-attach-daemon = /tmp/memcached.pid memcached -p 11911 -d -P
/tmp/memcached.pid -u user
 memcached survives
production settings
 processes
 “There is no magic rule for setting the number of processes or threads to use.
It is very much application and system dependent. Simple math like
processes = 2 * cpucores will not be enough. You need to experiment with
various setups and be prepared to constantly monitor your apps.”
 threads
 “If you need threads, remember to enable them with enable-threads.”
 start with: processes = n, threads = 1
 multi-threading should be thoroughly tested! (debugging is very hard)
 rule of thumb for avoiding OOM when using threads=1:
 available memory = process n * reload-on-rss value
 suspect everything, test everything, log everything
performance testing
 get URLs which your applications deliver
 run siege / apachebench while keeping your eye on
monitoring/logging
 hardware is cheap
 buy more memory
 get a faster CPU
 scaling up is always easier than optimizing your app
production deployment
 keep a single project file
 touch it when updating
 art of graceful reloading
 https://github.com/unbit/uwsgi-
docs/blob/master/articles/TheArtOfGracefulReloading.rst
 “Some applications or frameworks (like Django) may load the vast
majority of their code only at the first request.” – causes timeouts if
you have high requests/second rate
 keep multiple application servers with reverse-proxy (or LB in front)
 update one server at the time, warm it up with siege/ab
monitor all the things!
 New Relic
 uwsgitop
 Sentry
 Cacti
 dstat, iostat, htop etc.
uwsgitop
 <stats>/home/user/uwsgi/uwsgistats.sock</stats>
 pip install uwsgitop
 uwsgitop /home/user/uwsgi/uwsgistats.sock
New Relic
 pip install newrelic
 uwsgi start script
newrelic-admin generate-config <LICENSE> newrelic.ini
NEW_RELIC_CONFIG_FILE=/home/user/uwsgi/newrelic.ini
export NEW_RELIC_CONFIG_FILE
newrelic-admin run-program uwsgi --xmlconfig /home/user/uwsgi/uwsgi.xml
 tip: newrelic is sometimes buggy (memory leak)
 tip!
things not mentioned
 emperor
 router
 metrics (snmp, statsd, alarms etc.)
 signal framework
 caching framework
 autostarting (supervisor, upstart)
 …
other WSGI app servers
 mod_wsgi
 Python version hell
 Green Unicorn (Gunicorn)
 Passenger (requires Ruby even if you don’t use it)
 etc.
conclusion
 very active project with a fast release cycle
 bunch of configuration options
 modular
 awesome docs
 mailing list support
 FTW!
thanks
 Questions?

More Related Content

PPTX
EuroPython 2014 - How we switched our 800+ projects from Apache to uWSGI
Max Tepkeev
 
PPTX
nginx + uwsgi emperor + bottle
Jordi Soucheiron
 
PPTX
Simple webapps with nginx, uwsgi emperor and bottle
Jordi Soucheiron
 
PDF
Helpful pre commit hooks for Python and Django
roskakori
 
PDF
Docker
Kamil Grabowski
 
PDF
[Js hcm] Deploying node.js with Forever.js and nginx
Nicolas Embleton
 
PDF
Using Nagios to monitor your WO systems
WO Community
 
PDF
Provisioning with Puppet
Joe Ray
 
EuroPython 2014 - How we switched our 800+ projects from Apache to uWSGI
Max Tepkeev
 
nginx + uwsgi emperor + bottle
Jordi Soucheiron
 
Simple webapps with nginx, uwsgi emperor and bottle
Jordi Soucheiron
 
Helpful pre commit hooks for Python and Django
roskakori
 
[Js hcm] Deploying node.js with Forever.js and nginx
Nicolas Embleton
 
Using Nagios to monitor your WO systems
WO Community
 
Provisioning with Puppet
Joe Ray
 

What's hot (20)

PDF
Build and deployment
WO Community
 
PPTX
Journey to Microservice architecture via Amazon Lambda
Axilis
 
PPTX
Ansible intro
Hsi-Kai Wang
 
PDF
OSDC.no 2015 introduction to node.js workshop
leffen
 
PDF
Building and Testing from Scratch a Puppet Environment with Docker - PuppetCo...
Puppet
 
PDF
Docker puppetcamp london 2013
Tomas Doran
 
PDF
@arzumy Dev Setup #klxrb
Arzumy MD
 
PDF
Introduction to ansible
Mukul Malhotra
 
PDF
170112
robo_lab
 
PPTX
How did puppet change our system's life?
Hung Phung Dac
 
PDF
DevOps Series: Extending vagrant with Puppet for configuration management
Felipe
 
PDF
Deploying PHP Applications with Ansible
Orestes Carracedo
 
PDF
Experiences from Running Masterless Puppet - PuppetConf 2014
Puppet
 
PPT
Python virtualenv & pip in 90 minutes
Larry Cai
 
PDF
Ansible Oxford - Cows & Containers
jonatanblue
 
ZIP
Deploying Rails applications with Moonshine
Robot Mode
 
PPTX
Vagrant to-aws-flow
Kimberly Macias
 
PDF
Docker to the Rescue of an Ops Team
Rachid Zarouali
 
ODP
Tool it Up! - Session #1 - Xhprof
toolitup
 
PPT
Newgenlib Installation on Ubuntu 12.04
Rajendra Singh
 
Build and deployment
WO Community
 
Journey to Microservice architecture via Amazon Lambda
Axilis
 
Ansible intro
Hsi-Kai Wang
 
OSDC.no 2015 introduction to node.js workshop
leffen
 
Building and Testing from Scratch a Puppet Environment with Docker - PuppetCo...
Puppet
 
Docker puppetcamp london 2013
Tomas Doran
 
@arzumy Dev Setup #klxrb
Arzumy MD
 
Introduction to ansible
Mukul Malhotra
 
170112
robo_lab
 
How did puppet change our system's life?
Hung Phung Dac
 
DevOps Series: Extending vagrant with Puppet for configuration management
Felipe
 
Deploying PHP Applications with Ansible
Orestes Carracedo
 
Experiences from Running Masterless Puppet - PuppetConf 2014
Puppet
 
Python virtualenv & pip in 90 minutes
Larry Cai
 
Ansible Oxford - Cows & Containers
jonatanblue
 
Deploying Rails applications with Moonshine
Robot Mode
 
Vagrant to-aws-flow
Kimberly Macias
 
Docker to the Rescue of an Ops Team
Rachid Zarouali
 
Tool it Up! - Session #1 - Xhprof
toolitup
 
Newgenlib Installation on Ubuntu 12.04
Rajendra Singh
 
Ad

Viewers also liked (15)

PDF
Djangoday lt 20120420
WEBdeBS
 
PDF
Deploying flask with nginx & uWSGI
정주 김
 
PDF
Symantec 2011 CIP Survey Global Results
Symantec
 
PPTX
Getting Started with ASP.net Core 1.0
joescars
 
PPTX
Performance Tuning and Optimization
MongoDB
 
PDF
nginx入門
Takashi Takizawa
 
PDF
Unbit djangoday 20120419
WEBdeBS
 
PDF
12-Step Program for Scaling Web Applications on PostgreSQL
Konstantin Gredeskoul
 
PDF
Best Practices for Becoming an Exceptional Postgres DBA
EDB
 
PPTX
An Introduction to OAuth 2
Aaron Parecki
 
PDF
Scalable Django Architecture
Rami Sayar
 
PPTX
ASP.NET Core 1.0 Overview
Shahed Chowdhuri
 
PDF
Access Control Presentation
Wajahat Rajab
 
PDF
containerd and CRI
Docker, Inc.
 
PDF
5 Steps to PostgreSQL Performance
Command Prompt., Inc
 
Djangoday lt 20120420
WEBdeBS
 
Deploying flask with nginx & uWSGI
정주 김
 
Symantec 2011 CIP Survey Global Results
Symantec
 
Getting Started with ASP.net Core 1.0
joescars
 
Performance Tuning and Optimization
MongoDB
 
nginx入門
Takashi Takizawa
 
Unbit djangoday 20120419
WEBdeBS
 
12-Step Program for Scaling Web Applications on PostgreSQL
Konstantin Gredeskoul
 
Best Practices for Becoming an Exceptional Postgres DBA
EDB
 
An Introduction to OAuth 2
Aaron Parecki
 
Scalable Django Architecture
Rami Sayar
 
ASP.NET Core 1.0 Overview
Shahed Chowdhuri
 
Access Control Presentation
Wajahat Rajab
 
containerd and CRI
Docker, Inc.
 
5 Steps to PostgreSQL Performance
Command Prompt., Inc
 
Ad

Similar to uWSGI - Swiss army knife for your Python web apps (20)

PDF
Containerization is more than the new Virtualization: enabling separation of ...
Jérôme Petazzoni
 
PDF
Linux Server Deep Dives (DrupalCon Amsterdam)
Amin Astaneh
 
PDF
Testing kubernetes and_open_shift_at_scale_20170209
mffiedler
 
PDF
Sanger OpenStack presentation March 2017
Dave Holland
 
PPTX
Salting new ground one man ops from scratch
Jay Harrison
 
PDF
Nodejs a-practical-introduction-oredev
Felix Geisendörfer
 
PPTX
Go Faster with Ansible (AWS meetup)
Richard Donkin
 
PPTX
NGINX Installation and Tuning
NGINX, Inc.
 
PDF
LibOS as a regression test framework for Linux networking #netdev1.1
Hajime Tazaki
 
PDF
Minimal OpenStack LinuxCon NA 2015
Sean Dague
 
PPTX
Introduction to node.js
Su Zin Kyaw
 
PPTX
Scaling an ELK stack at bol.com
Renzo Tomà
 
PDF
NodeJS
LinkMe Srl
 
PDF
Network Stack in Userspace (NUSE)
Hajime Tazaki
 
PDF
Running php on nginx
Harald Zeitlhofer
 
PDF
Containerization Is More than the New Virtualization
C4Media
 
PPTX
introduction to node.js
orkaplan
 
PPT
Multicore
Birgit Plötzeneder
 
PPT
Extending Piwik At R7.com
Leo Lorieri
 
PPTX
Seastar at Linux Foundation Collaboration Summit
Don Marti
 
Containerization is more than the new Virtualization: enabling separation of ...
Jérôme Petazzoni
 
Linux Server Deep Dives (DrupalCon Amsterdam)
Amin Astaneh
 
Testing kubernetes and_open_shift_at_scale_20170209
mffiedler
 
Sanger OpenStack presentation March 2017
Dave Holland
 
Salting new ground one man ops from scratch
Jay Harrison
 
Nodejs a-practical-introduction-oredev
Felix Geisendörfer
 
Go Faster with Ansible (AWS meetup)
Richard Donkin
 
NGINX Installation and Tuning
NGINX, Inc.
 
LibOS as a regression test framework for Linux networking #netdev1.1
Hajime Tazaki
 
Minimal OpenStack LinuxCon NA 2015
Sean Dague
 
Introduction to node.js
Su Zin Kyaw
 
Scaling an ELK stack at bol.com
Renzo Tomà
 
NodeJS
LinkMe Srl
 
Network Stack in Userspace (NUSE)
Hajime Tazaki
 
Running php on nginx
Harald Zeitlhofer
 
Containerization Is More than the New Virtualization
C4Media
 
introduction to node.js
orkaplan
 
Extending Piwik At R7.com
Leo Lorieri
 
Seastar at Linux Foundation Collaboration Summit
Don Marti
 

Recently uploaded (20)

PPT
Introduction to dns domain name syst.ppt
MUHAMMADKAVISHSHABAN
 
PDF
LOGENVIDAD DANNYFGRETRRTTRRRTRRRRRRRRR.pdf
juan456ytpro
 
PPTX
The Monk and the Sadhurr and the story of how
BeshoyGirgis2
 
PDF
Slides: PDF Eco Economic Epochs for World Game (s) pdf
Steven McGee
 
PPTX
Crypto Recovery California Services.pptx
lionsgate network
 
PDF
BGP Security Best Practices that Matter, presented at PHNOG 2025
APNIC
 
PDF
DNSSEC Made Easy, presented at PHNOG 2025
APNIC
 
PPTX
dns domain name system history work.pptx
MUHAMMADKAVISHSHABAN
 
PDF
Data Protection & Resilience in Focus.pdf
AmyPoblete3
 
PPTX
Blue and Dark Blue Modern Technology Presentation.pptx
ap177979
 
PPTX
Slides Powerpoint: Eco Economic Epochs.pptx
Steven McGee
 
PPTX
LESSON-2-Roles-of-ICT-in-Teaching-for-learning_123922 (1).pptx
renavieramopiquero
 
PPTX
Unlocking Hope : How Crypto Recovery Services Can Reclaim Your Lost Funds
lionsgate network
 
PPTX
Microsoft PowerPoint Student PPT slides.pptx
Garleys Putin
 
PPTX
Artificial-Intelligence-in-Daily-Life (2).pptx
nidhigoswami335
 
PPTX
B2B_Ecommerce_Internship_Simranpreet.pptx
LipakshiJindal
 
PDF
UI/UX Developer Guide: Tools, Trends, and Tips for 2025
Penguin peak
 
PDF
The Internet of Things (IoT) refers to a vast network of interconnected devic...
chethana8182
 
PPTX
AI ad its imp i military life read it ag
ShwetaBharti31
 
PPT
1965 INDO PAK WAR which Pak will never forget.ppt
sanjaychief112
 
Introduction to dns domain name syst.ppt
MUHAMMADKAVISHSHABAN
 
LOGENVIDAD DANNYFGRETRRTTRRRTRRRRRRRRR.pdf
juan456ytpro
 
The Monk and the Sadhurr and the story of how
BeshoyGirgis2
 
Slides: PDF Eco Economic Epochs for World Game (s) pdf
Steven McGee
 
Crypto Recovery California Services.pptx
lionsgate network
 
BGP Security Best Practices that Matter, presented at PHNOG 2025
APNIC
 
DNSSEC Made Easy, presented at PHNOG 2025
APNIC
 
dns domain name system history work.pptx
MUHAMMADKAVISHSHABAN
 
Data Protection & Resilience in Focus.pdf
AmyPoblete3
 
Blue and Dark Blue Modern Technology Presentation.pptx
ap177979
 
Slides Powerpoint: Eco Economic Epochs.pptx
Steven McGee
 
LESSON-2-Roles-of-ICT-in-Teaching-for-learning_123922 (1).pptx
renavieramopiquero
 
Unlocking Hope : How Crypto Recovery Services Can Reclaim Your Lost Funds
lionsgate network
 
Microsoft PowerPoint Student PPT slides.pptx
Garleys Putin
 
Artificial-Intelligence-in-Daily-Life (2).pptx
nidhigoswami335
 
B2B_Ecommerce_Internship_Simranpreet.pptx
LipakshiJindal
 
UI/UX Developer Guide: Tools, Trends, and Tips for 2025
Penguin peak
 
The Internet of Things (IoT) refers to a vast network of interconnected devic...
chethana8182
 
AI ad its imp i military life read it ag
ShwetaBharti31
 
1965 INDO PAK WAR which Pak will never forget.ppt
sanjaychief112
 

uWSGI - Swiss army knife for your Python web apps

  • 1. uWSGI Swiss army knife for your Python web apps TOMISLAV RAŠETA @traseta
  • 2. me  scribbling and doodling on *IX operating systems for 10+ years  working as sysadmin/DevOps with a hint of networking  tools of the trade  nginx apache tomcat (ugh!)  python php java (ugh!)  postgresql mysql  memcached redis mongo  not a developer, sorry :)
  • 3. before we begin  know your environment  server specs (cores, memory, bandwidth)  virtualenv or global  know your application  database pooling agents and latencies  python version requirements (!)  Linux kernel tunables  limits.conf (file descriptors)  ipv4.tcp_tw_reuse (not recycle)  kernel.shmmax  ipv4.ip_local_port_range
  • 4. what it is  full stack for building hosting services  pluggable architecture  mostly used as application server for Python apps using WSGI  “WSGI is the Web Server Gateway Interface. It is a specification that describes how web server communicates with web applications, and how web applications can be chained together to process one request.”  rules  versatility  performance  low-resource usage  reliability  developed by @unbit (Italy)  awesome docs
  • 5. installation  PyPI  most recent versions, maintained by devs  pip install uwsgi  use virtualenv when possible  watch out for dependencies - check what you actually need, the compile errors/warnings are very descriptive  distro packed versions are *always* outdated  “from source” - please avoid :)
  • 6. configuration  choice of xml, ini, command-line arguments etc.  read the docs carefully  don’t reinvent the wheel  "Please, turn on your brain and try to adapt shown configs to your needs, or invent new ones."
  • 7. configuration example (xml), start from ve <uwsgi> <chdir>/home/user/ve/app</chdir> <wsgi-file>project.wsgi</wsgi-file> <uid>user</uid> <gid>user</gid> <uwsgi-socket>/home/user/uwsgi/uwsgi.sock</uwsgi-socket> <chmod-socket>600</chmod-socket> <pidfile>/home/user/uwsgi/uwsgi.pid</pidfile> <stats>/home/user/uwsgi/uwsgistats.sock</stats> <buffer-size>8192</buffer-size> <post-buffering>4096</post-buffering> <memory-report/> <daemonize>/home/user/uwsgi/daemon.log</daemonize> <reload-mercy>20</reload-mercy> <max-requests>500</max-requests> <max-worker-lifetime>86400</max-worker-lifetime> <socket-timeout>5</socket-timeout> <disable-logging/> <reload-on-rss>256</reload-on-rss> <touch-reload>/home/user/ve/app/project.wsgi</touch-reload> <enable-threads/> <threads>1</threads> <processes>100</processes> <single-interpreter/> <vacuum/> </uwsgi>
  • 8. start it up  activate ve  uwsgi --xmlconfig /home/user/uwsgi/uwsgi.xml  configure and start nginx location / { include uwsgi_params; uwsgi_pass unix:/home/wmaster/uwsgi/uwsgi.sock; }  ta-daa!  tip: socket based pass doesn’t consume server TCP port usage = less SYSCPU time on your server; you can use TCP but check your kernel tunables before! (tcp_tw_reuse, ip_local_port_range  tip2: you can also use mod_uwsgi and apache
  • 9. cool conf stuff (I)  harakiri (timeout)  every request is timestamped  If a master process finds a worker with a timestamp running more than specified timeout it will kill it  logs: “F*CK !!! i must kill myself (pid: 9984 app_id: 0)”  reload-on-rss  gracefully reload a worker after the memory consumption of the worker goes above this threshold  you’re alive even if you have a nasty memory leak  max-requests - gracefully reload a process after n requests  max-worker-lifetime – gracefully reload a process after n seconds  logs: “...The work of process PID is done. Seeya!"
  • 10. cool conf stuff (II)  reload-mercy  wait for n seconds for worker to die during reload/shutdown  touch-reload  reload your app by touching a single file (your main project file)  attach-daemon  attach-daemon = memcached -p 11911 -u user  when uWSGI is stopped or reloaded, memcahed is destroyed  smart-attach-daemon  smart-attach-daemon = /tmp/memcached.pid memcached -p 11911 -d -P /tmp/memcached.pid -u user  memcached survives
  • 11. production settings  processes  “There is no magic rule for setting the number of processes or threads to use. It is very much application and system dependent. Simple math like processes = 2 * cpucores will not be enough. You need to experiment with various setups and be prepared to constantly monitor your apps.”  threads  “If you need threads, remember to enable them with enable-threads.”  start with: processes = n, threads = 1  multi-threading should be thoroughly tested! (debugging is very hard)  rule of thumb for avoiding OOM when using threads=1:  available memory = process n * reload-on-rss value  suspect everything, test everything, log everything
  • 12. performance testing  get URLs which your applications deliver  run siege / apachebench while keeping your eye on monitoring/logging  hardware is cheap  buy more memory  get a faster CPU  scaling up is always easier than optimizing your app
  • 13. production deployment  keep a single project file  touch it when updating  art of graceful reloading  https://github.com/unbit/uwsgi- docs/blob/master/articles/TheArtOfGracefulReloading.rst  “Some applications or frameworks (like Django) may load the vast majority of their code only at the first request.” – causes timeouts if you have high requests/second rate  keep multiple application servers with reverse-proxy (or LB in front)  update one server at the time, warm it up with siege/ab
  • 14. monitor all the things!  New Relic  uwsgitop  Sentry  Cacti  dstat, iostat, htop etc.
  • 15. uwsgitop  <stats>/home/user/uwsgi/uwsgistats.sock</stats>  pip install uwsgitop  uwsgitop /home/user/uwsgi/uwsgistats.sock
  • 16. New Relic  pip install newrelic  uwsgi start script newrelic-admin generate-config <LICENSE> newrelic.ini NEW_RELIC_CONFIG_FILE=/home/user/uwsgi/newrelic.ini export NEW_RELIC_CONFIG_FILE newrelic-admin run-program uwsgi --xmlconfig /home/user/uwsgi/uwsgi.xml  tip: newrelic is sometimes buggy (memory leak)  tip!
  • 17. things not mentioned  emperor  router  metrics (snmp, statsd, alarms etc.)  signal framework  caching framework  autostarting (supervisor, upstart)  …
  • 18. other WSGI app servers  mod_wsgi  Python version hell  Green Unicorn (Gunicorn)  Passenger (requires Ruby even if you don’t use it)  etc.
  • 19. conclusion  very active project with a fast release cycle  bunch of configuration options  modular  awesome docs  mailing list support  FTW!