⚠️ uWSGI STATUS: MAINTENANCE MODE
uWSGI is in maintenance mode (announced 2024). For new projects, consider these actively maintained alternatives.
| Server | Protocol | Active | Best For | Docker |
|---|---|---|---|---|
| uWSGI | WSGI/ASGI | ⚠️ Maintenance | Legacy deployments | ⚠️ Community |
| Gunicorn | WSGI | ✅ Yes | General Python apps | ✅ Official |
| Uvicorn | ASGI | ✅ Yes | FastAPI, Starlette | ✅ Official |
| Granian | ASGI/WSGI | ✅ Yes | High-performance async | ✅ Official |
| Waitress | WSGI | ✅ Yes | Windows deployments | ✅ Official |
| Daphne | ASGI | ✅ Yes | Django Channels | ✅ Official |
| Hypercorn | ASGI | ✅ Yes | HTTP/2, HTTP/3 | ✅ Official |
| Gevent | WSGI | ✅ Yes | Greenlet-based async | ✅ Official |
| Aspect | WSGI | ASGI |
|---|---|---|
| Type | Synchronous | Asynchronous |
| Frameworks | Django, Flask, Pyramid | FastAPI, Starlette, Django Channels |
| Performance | Good for CPU-bound | Better for I/O-bound |
| Complexity | Simpler | More complex |
| Future | Legacy | Modern standard |
Best for: General Python web applications (WSGI)
| Feature | Gunicorn | uWSGI |
|---|---|---|
| Protocol | WSGI | WSGI/ASGI |
| Active Development | ✅ Yes | ⚠️ Maintenance |
| Official Docker | ✅ Yes | ❌ No |
| Configuration | Simple | Complex |
| Community | Large | Moderate |
| Windows Support | ❌ No | ⚠️ Limited |
Installation:
pip install gunicorn
gunicorn --bind 0.0.0.0:8000 myapp:app
Use Gunicorn when:
Best for: ASGI applications (FastAPI, Starlette)
| Feature | Uvicorn | uWSGI |
|---|---|---|
| Protocol | ASGI | WSGI/ASGI |
| Active Development | ✅ Yes | ⚠️ Maintenance |
| Official Docker | ✅ Yes | ❌ No |
| Async Support | ✅ Native | ⚠️ Limited |
| Performance | Excellent for async | Good |
Installation:
pip install uvicorn[standard]
uvicorn myapp:app --host 0.0.0.0 --port 8000
Use Uvicorn when:
Best for: High-performance async Python applications
| Feature | Granian | uWSGI |
|---|---|---|
| Protocol | ASGI/WSGI | WSGI/ASGI |
| Active Development | ✅ Yes | ⚠️ Maintenance |
| Official Docker | ✅ Yes | ❌ No |
| Performance | Excellent | Good |
| Written in | Rust | C |
Installation:
pip install granian
granian --interface asgi myapp:app
Use Granian when:
Best for: Windows deployments, simple WSGI serving
pip install waitress
waitress-serve --port=8000 myapp:app
Best for: Django Channels, ASGI applications
pip install daphne
daphne -b 0.0.0.0 -p 8000 myapp.asgi:application
Best for: HTTP/2, HTTP/3, QUIC support
pip install hypercorn
hypercorn myapp:app
Best for: Greenlet-based async WSGI
pip install gevent
gunicorn --worker-class gevent myapp:app
| uWSGI Feature | Gunicorn Equivalent | Uvicorn Equivalent |
|---|---|---|
processes = 4 |
--workers 4 |
--workers 4 |
threads = 2 |
--threads 2 |
N/A |
socket = 127.0.0.1:8000 |
--bind 127.0.0.1:8000 |
--host 127.0.0.1 --port 8000 |
module = app:app |
app:app |
app:app |
logto = /var/log/app.log |
--access-logfile |
--access-log |
From tiangolo/uwsgi-nginx:
# Old (deprecated)
FROM tiangolo/uwsgi-nginx:python3.12
# New (recommended)
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir gunicorn
COPY . .
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "app:app"]
From uWSGI:
# Old
ExecStart=/usr/bin/uwsgi --ini /etc/uwsgi/myapp.ini
# New (Gunicorn)
ExecStart=/usr/local/bin/gunicorn --workers 4 --bind 127.0.0.1:8000 myapp:app
✅ Valid reasons to continue using uWSGI:
⚠️ Consider migrating when:
| Requirement | Recommended Server |
|---|---|
| Django (WSGI) | Gunicorn |
| Flask | Gunicorn |
| FastAPI | Uvicorn or Granian |
| Django Channels | Daphne or Uvicorn |
| Windows | Waitress |
| HTTP/3 | Hypercorn |
| Maximum Performance | Granian |
| Simple Setup | Gunicorn |
| Multi-app Hosting | uWSGI (Emperor) or separate containers |
Any questions?
Feel free to contact us. Find all contact information on our contact page.