uWSGI
gunicorn is an alternative that may be simpler to use.
The documentation that likes telling stories. uWSGI has a stupid insane number of features.
uWSGI is best combined with a web-server like Nginx: better at serving static files, the reverse-proxy buffers requests before forwarding to avoid wasting app-workers' time (Slowloris DOS), and possibly better security. Other app-servers may not have the latter issue.
[uwsgi]
; Increased efficiency for larger number of processes(/threads) (no reason not to).
thunder-lock = True
; (Threads disabled)
processes = 2
harakiri = 30
; uwsgitop <stats-socket>
stats = /run/uwsgi/app/APP_NAME/stats-socket
memory-report = True
; Clear environment on exit
vacuum = True
REPLACE_ME_HOST_NAME otherwise return HTTP 421 Misdirected Request (security)
route-if-not = equal:${HTTP_HOST};REPLACE_ME_HOST_NAME return:421
- Due to uWSGI's default pre-forking behaviour, you may want
lazy-apps
or a@postfork
fix function when running more than one process. - Note on
harakiri
and "post buffering" - the web server should take entire request body before passing it on, otherwise a slow upload could be killed due to the harakiri timer. - When using threads, e.g.
threads=2
, will automatically setenable-threads = true
.
Features
- Standard HTTP/TLS/SNI/WebSocket/Static Files/Async Apps
- Notifications
- Remote Procedure Call
- Stats Server
- Metrics Collection
- App Security Jails (Namespaces)
- App Resource Limits (Cgroups)
- Auto-scaling (Zergs, Broodlord, Cheaper)
- Memory deduplication
- Custom Signals (target: workers/spoolers/mules/farms; event: custom/filesystem/timers/cron)
- Caches (SharedMemory)
- Queues
- Background tasks (mules, spoolers)
- Locks
- Routing (requests, cache)
- Legion (Failover?)
Python-Specific Configuration
uWSGI has an easy interface (uwsgidecorators) to:
- Background tasks (spooler, mules, cron, timers, and generic execute-task-in-background-thread)
- Communcation between all processes using signals
- Locks
- In-memory cache (with periodic disk sync)
They are shared only within that master uWSGI instance.
; Python
plugin = python3
virtualenv = /home/APP_NAME/virtualenv/
chdir = /home/APP_NAME/APP_DIR/
module = APP_NAME.wsgi:application
; Background Tasks
spooler = /home/APP_NAME/tasks/
import = APP_NAME.tasks
; Real time tracebacks (inc. for harakiri'd requests)
; uwsgi --connect-and-read /run/uwsgi/app/APP_NAME/tracebacker1
py-tracebacker = /run/uwsgi/app/APP_NAME/tracebacker
; Only when running application
; single-interpreter = true