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 需求而设计:

特性WSGIASGI
同步/异步同步同步 + 异步
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 应用

为什么这样设计?

  1. uWSGI ↔ Python 应用之间用 WSGI:因为 WSGI 是 Python Web 开发的标准接口,所有框架都支持
  2. 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 = 2

Daphne 服务器

是什么

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 :8080socket = :8080uwsgi 协议(二进制)高 ⭐生产推荐
proxy_pass http://:8080http = :8080HTTP 协议测试/通用

部署流程

① 环境准备       → 关闭 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 Gatewayps aux | grep uwsgi + 检查 uWSGI 日志
数据库连接失败检查 MySQL 状态、密码、数据库是否存在
ModuleNotFoundError检查 requirements.txt 是否全部安装
静态文件 404执行 collectstatic + 配置 Nginx 静态路径
uWSGI 安装报错gcc 版本过低 → 升级或启用 devtoolset-7

参见