Python 体系架构
架构总览
Python 体系的 Web 架构比 PHP 更复杂,因为它涉及两套协议(WSGI/ASGI)和两套通信链路。
浏览器
↕ HTTP/HTTPS
Nginx(Web 服务)
↕ uwsgi 协议(推荐)或 HTTP 协议
uWSGI 服务器(或 Daphne)
↕ WSGI 协议(或 ASGI 协议)
Python Web 应用(Django / Flask / FastAPI)
WSGI — Web Server Gateway Interface
是什么
WSGI(读作”wiz-ghee”)是 Python 专用的 Web 服务网关接口规范,定义了 Web 服务器与 Python Web 应用之间的通信标准。
- 同步协议
- 适用于传统 HTTP 请求-响应模式
- 所有主流 Python Web 框架都支持
Web 服务器 (uWSGI/Gunicorn)
↕ WSGI 协议
Django/Flask 应用
WSGI 应用示例
def application(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/plain')])
return [b'Hello, World!']ASGI — Asynchronous Server Gateway Interface
是什么
ASGI 是 WSGI 的异步升级版,专为应对现代 Web 需求而设计:
| 特性 | WSGI | ASGI |
|---|---|---|
| 同步/异步 | 同步 | 同步 + 异步 |
| WebSocket | ❌ 不支持 | ✅ 支持 |
| HTTP/2 | ❌ 不支持 | ✅ 支持 |
| 长连接 | ❌ 不支持 | ✅ 支持 |
| 并发模型 | 多线程/多进程 | 异步事件循环 |
典型应用
- Django Channels:在 Django 中实现 WebSocket
- FastAPI:原生 ASGI 支持
- Starlette:轻量级 ASGI 框架
Web 服务器 (Daphne/Uvicorn)
↕ ASGI 协议
FastAPI / Django Channels / Starlette
uWSGI 服务器
是什么
uWSGI 是一个功能完整的 Web 服务器,主要用于 Python Web 应用的部署。
协议的双层设计
uWSGI 最大的特点是协议分层:
Nginx(反向代理)
↕ uwsgi 协议(二进制、高效)
uWSGI 服务器
↕ WSGI 协议(Python 标准)
Python Web 应用
为什么这样设计?
- uWSGI ↔ Python 应用之间用 WSGI:因为 WSGI 是 Python Web 开发的标准接口,所有框架都支持
- Nginx ↔ uWSGI 之间用 uwsgi 协议:uwsgi 协议是二进制协议,比 HTTP 协议更高效(更少的解析开销)
关键能力
- 支持多种协议:uwsgi、HTTP、HTTP/2、WebSocket
- 可以独立作为 Web 服务运行(启用 HTTP 模式)
- 支持进程/线程/异步多种工作模式
- 支持 uwsgi 协议的二进制通信
配置示例
# uwsgi.ini
[uwsgi]
http = :8000
wsgi-file = myapp/wsgi.py
master = true
processes = 4
threads = 2Daphne 服务器
是什么
Daphne 是 ASGI 协议的参考实现服务器,由 Django Channels 项目开发。
Nginx
↕ HTTP/HTTPS 协议
Daphne(ASGI 服务器)
↕ ASGI 协议
ASGI 应用(Channels / FastAPI)
与 uWSGI 不同,Daphne 与 Nginx 之间使用 HTTP 协议(而非专有协议)。
Python 体系全景图
┌──────────────────────────────────────────────────┐
│ 浏览器 │
└──────────────────────┬───────────────────────────┘
↓ HTTP
┌──────────────────────┴───────────────────────────┐
│ Nginx │
│ ┌──────────────┬──────────────┬──────────────┐ │
│ │ proxy_pass │ uwsgi_pass │ 静态文件直返 │ │
│ │ (HTTP) │ (uwsgi协议) │ │ │
│ └──────┬───────┴──────┬───────┴──────────────┘ │
└─────────┼──────────────┼──────────────────────────┘
↓ ↓
┌─────┴─────┐ ┌────┴────┐
│ uWSGI │ │ Daphne │
│ (HTTP模式)│ │ (ASGI) │
└─────┬─────┘ └────┬────┘
↓ WSGI ↓ ASGI
┌─────┴─────┐ ┌────┴──────────┐
│ Django / │ │ Channels / │
│ Flask │ │ FastAPI │
└───────────┘ └───────────────┘
部署实操(Django + uWSGI + Nginx)
整体链路
浏览器
↕ HTTP :8111
Nginx(反向代理)
↕ uwsgi 协议(socket :8080)
uWSGI 服务器(4进程 × 2线程)
↕ WSGI 协议
Django 应用(djangoblog.wsgi:application)
↕ ORM
MySQL 数据库(djangoblog 库)
uWSGI 配置详解
# /blog/uwsgi.ini
[uwsgi]
socket = :8080 # 监听 uwsgi 协议(生产推荐),配合 nginx uwsgi_pass
# http = :8080 # 监听 HTTP 协议(可被浏览器直接访问,测试用,性能略低)
chdir = /blog/DjangoBlog-master/ # 项目根目录
module = djangoblog.wsgi:application # WSGI 入口文件:application 对象
processes = 4 # 工作进程数
threads = 2 # 每进程线程数
master = True # 启动主进程管理 worker
pidfile = /tmp/project-master.pid
vacuum = True # 退出时清理环境
max-requests = 5000 # 每进程处理 5000 请求后自动重启(防止内存泄漏)
daemonize = /var/log/uwsgi.log # 日志文件关键配置决策
| 配置项 | 作用 | 对比 |
|---|---|---|
socket vs http | 上游协议选择 | socket = uwsgi 协议(生产);http = HTTP 协议(测试) |
processes × threads | 并发模型 | 乘积决定并发能力,4 × 2 = 8 并发 |
max-requests | 内存泄漏防护 | 达到上限后 worker 自动重启 |
master = True | 进程管理 | 主进程负责 worker 的创建、监控、销毁 |
Nginx 配置
# /etc/nginx/conf.d/www.conf
server {
listen 8111;
server_name localhost;
location / {
include uwsgi_params; # 加载 uWSGI 标准参数
uwsgi_pass 127.0.0.1:8080; # uwsgi 协议转发
}
}uwsgi_pass vs proxy_pass
| Nginx 指令 | uWSGI 配置 | 协议 | 性能 | 场景 |
|---|---|---|---|---|
uwsgi_pass :8080 | socket = :8080 | uwsgi 协议(二进制) | 高 ⭐ | 生产推荐 |
proxy_pass http://:8080 | http = :8080 | HTTP 协议 | 中 | 测试/通用 |
部署流程
① 环境准备 → 关闭 SELinux/防火墙,安装 MySQL
② 编译 Python → 安装 OpenSSL → 编译 Python 3.10 → 配置 PATH
③ 部署 Django → 下载代码 → pip 安装依赖 → 修改 settings.py
④ 初始化数据 → makemigrations → migrate → createsuperuser → collectstatic
⑤ 配置 uWSGI → pip install uwsgi → 编写 uwsgi.ini → 启动
⑥ 配置 Nginx → 安装 nginx → 添加 server 块(uwsgi_pass)→ 重启
⑦ 测试验证 → 浏览器访问 :8111
排错速查表
| 现象 | 排查方向 |
|---|---|
| uWSGI 启动失败 | netstat -tlnp | grep 8080 检查端口占用 |
| Nginx 502 Bad Gateway | ps aux | grep uwsgi + 检查 uWSGI 日志 |
| 数据库连接失败 | 检查 MySQL 状态、密码、数据库是否存在 |
| ModuleNotFoundError | 检查 requirements.txt 是否全部安装 |
| 静态文件 404 | 执行 collectstatic + 配置 Nginx 静态路径 |
| uWSGI 安装报错 | gcc 版本过低 → 升级或启用 devtoolset-7 |
参见
- Web 应用架构基础 — CGI / FastCGI 协议原理
- 架构对比总结 — PHP vs Python vs Go
- PHP 体系架构 — PHP-FPM / FastCGI
- Go 程序部署 — 编译型语言架构
- Supervisor 进程管理 — 进程守护工具
- Nginx — Web 服务器 / 反向代理
- uWSGI — 实体页面
- Daphne — 实体页面
- Day39 资料摘要 — Python/Go 部署参考
- Python Web 部署实操 — Django + uWSGI 步进式指南