一文搞懂 CGI、 FastCGI、WSGI、uWSGI、ASGI
一、CGI
1、通用网关接口(Common Gateway Interface/CGI)
可以让一个客户端,从网页浏览器向执行在网络服务器上的程序请求数据
CGI描述了服务器和请求处理程序之间传输数据的一种标准。
2、CGI程序可以用任何脚本语言或者是完全独立编程语言实现,只要这个语言可以在这个系统上运行。
3、用来规范web服务器传输到php解释器中的数据类型以及数据格式,包括URL、查询字符串、POST数据、HTTP header等,也就是为了保证web server传递过来的数据是标准格式的
4、一句话总结: 一个标准,定义了客户端服务器之间如何传数据
二、FastCGI
1、快速通用网关接口(Fast Common Gateway Interface/FastCGI)是一种让交互程序与Web服务器通信的协议。
FastCGI是早期通用网关接口(CGI)的增强版本。
2、FastCGI致力于减少网页服务器与CGI程序之间互动的开销,从而使服务器可以同时处理更多的网页请求。
3、使用FastCGI的服务器:
Apache HTTP Server (部分) Cherokee HTTP Server Hiawatha Webserver Lighttpd Nginx LiteSpeed Web Server Microsoft IIS
4、一句话总结: CGI的升级版
FastCGI 是一种通信协议,用于在 Web 服务器(如 Nginx 或 Apache)与应用服务器(如 PHP-FPM、Python、Ruby 等)之间传递请求和响应信息。
它的本质是提高动态内容生成的效率和性能。为了更好地理解 FastCGI,可以从以下几个方面进行解释:
1. 历史背景: - FastCGI 是作为 CGI(Common Gateway Interface)的增强版开发的。传统 CGI 在处理每个请求时会启动一个新的进程,这样效率不高,尤其是在面临大量并发请求时。 - FastCGI 改进了这个模型,通过持久化进程来处理多个请求,从而避免了频繁的进程启动和销毁。 2. 工作原理: - FastCGI 将应用程序进程和 Web 服务器进程分离。Web 服务器处理静态内容(如 HTML、CSS、JavaScript 文件),而将动态请求(例如 PHP 脚本)传递给 FastCGI 进程处理。 - FastCGI 进程常驻内存,并能处理多个请求,如此一来,启动进程的开销大大降低。 3. 性能提升: - 由于 FastCGI 进程是长时间运行的,它们可以重用并保持对数据库连接等资源的利用,提高了动态内容处理的速度。 - 对于高并发请求,FastCGI 显著提高了 Web 应用的吞吐量。 4. 协议特性: - FastCGI 使用二进制的请求和响应格式,相较于 CGI 的纯文本格式更高效。 - 它支持多路复用,允许同时处理多个独立的请求,通过 TCP/IP 或 Unix 套接字进行通信。 5. 典型应用: - FastCGI 常用于 PHP 的运行环境 PHP-FPM(PHP FastCGI Process Manager),这是 PHP 官方推荐的处理 PHP 请求的方式。 - 也被其他许多语言和框架支持,用于提升 Web 应用的性能和可伸缩性。
通过使用 FastCGI,Web 服务器能够更好地管理动态请求的处理,提供了灵活的配置和扩展性,以满足不同应用场景下的性能要求。
它既保留了 CGI 模型的简单性,又克服了其性能不足的缺点,因此广泛应用于现代 Web 服务架构中。

三、WSGI(协议规范或接口标准)
1、WSGI (Web Server Gateway Interface )是为 Python 定义的一套 Web 服务器与 Web 框架/应用之间的标准接口 。
Client → Nginx → uWSGI → (通过 WSGI) → Django → 返回响应
作用 :
是 Web 服务器 (如 uWSGI、Gunicorn)和 Python Web 应用/框架 (如 Django、Flask)之间通信的标准规范。
提升 Python Web 应用的可移植性,使不同服务器和框架可以无缝对接。
设计背景 :
借鉴自 CGI,但更灵活、高效。
出现后,其他语言也出现了类似机制(如 Rack for Ruby, PSGI for Perl)。
工作方式 :
Web 服务器接收请求后,按照 WSGI 规范调用 Python 应用。
应用处理请求并返回响应,交由服务器发送给客户端。
四、uWSGI(既是协议规范也是服务器软件)
1、uWSGI 是实现了WSGI协议、uwsgi协议、http等协议的一个Web服务器。
它旨在提供全栈服务,用以部署Python Web应用。uWSGI 既是一个软件,也是一个协议,但在大多数情况下,当提到uWSGI时,指的是uWSGI服务器。
2、使用场景
- 大型和高性能Web应用:uWSGI 提供了大量的配置选项、优化功能和插件,非常适合构建大型或者要求高性能的Web应用。
- 企业环境:需要与nginx等Web服务器结合使用,因为uWSGI可以作为应用服务器,处理Python应用的执行,并与Web服务器进行通信。
3、优点
- 性能优秀:uWSGI是一个C程序,为性能进行了优化。
- 功能丰富:uWSGI支持热更新、日志记录、负载均衡等高级功能。
- 高度可配置:uWSGI提供了非常多的配置选项,可以非常精细地控制Web服务器的行为。
4、WSGI的具体实现
wsgiref
- 简介:
wsgiref是Python标准库的一部分,提供了WSGI规范的参考实现。主要用于开发和测试环境,而不是生产环境,因为它比较基础和简单。 - 组件:
wsgiref包括服务器、验证器、工具和引用实现等组件,方便开发者对WSGI应用进行测试和开发。
Werkzeug
- 简介:
Werkzeug是一个WSGI工具库,不仅实现了WSGI接口规范,还提供了大量有用的Web开发工具。它可以看作是开发Python Web应用的底层库,被许多其他Python Web框架广泛使用,如Flask。 - 特点:提供了一套灵活的工具集,包括请求、响应对象、路由系统以及各种各样的工具函数,从而简化了Web应用的开发。
uWSGI
- 简介:
uWSGI是一个功能强大的应用服务器,用于托管Python(以及其他语言编写的)Web应用。它实现了WSGI规范,并提供了uwsgi协议,是nginx等Web服务器与Web应用或框架之间沟通的一种方式。 - 特点:具备高性能,可高度定制和扩展,支持多种语言。它专注于性能、资源使用和微服务架构,适用于各种规模的Web应用。
Gunicorn(古尼科恩, 绿色独角兽)
- 简介:
Gunicorn("Green Unicorn") 是一个Python WSGI HTTP服务器,提供了一个预分叉的工作模式,主要面向从小型到中等规模负载的Web应用。 - 特点:易于安装和使用,支持同步和异步工作模式,通过预分叉工作进程以提高性能和并发处理能力。对Django、Flask等流行Web框架支持良好。
Tornado
- 简介:
Tornado是一个Python Web框架和异步网络库,它不仅实现了WSGI接口,还提供了自己的非阻塞网络I/O处理能力。 - 特点:专为处理大量并发连接设计,适用于需要实时功能(如长连接或WebSockets)的应用。与传统的阻塞式服务器或框架相比,Tornado可以提供更高的性能和可伸缩性。

五、uwsgi
Nginx服务器配置代理请求到后端uwsgi应用服务器
方式一:
# 该方式使用uWSGI作为应用服务器,通过IP地址和端口号进行连接
location / {
include uwsgi_params; # 导入一个Nginx模块,用于和uWSGI进行通讯
uwsgi_connect_timeout 30; # 设置连接uWSGI超时时间
uwsgi_pass 101.133.225.166:8080; # 将请求转发到指定的uWSGI服务器
}
方式二:
# 该方式同样使用uWSGI作为应用服务器,通过UNIX域套接字文件进行连接
location / {
include uwsgi_params; # 导入一个Nginx模块,用于和uWSGI进行通讯
uwsgi_pass unix:///var/www/script/uwsgi.sock; # 将请求转发到指定的uWSGI服务器的sock文件
}
方式三:
# 该方式使用普通的HTTP代理方式,将请求代理到指定的后端服务器
location / {
proxy_pass http://101.133.225.166:8088; # 将请求代理转发到指定的HTTP服务器
}


六、ASGI(Asynchronous Server Gateway Interface)
1、ASGI 是“Python Web 异步服务器网关接口标准”,
是 WSGI(Web Server Gateway Interface) 的异步升级版本。
2、作用
ASGI 是 Web 服务器与 Python Web 应用之间的接口规范,
它定义了服务器和框架如何通信。
-
Web 服务器:
Uvicorn、Daphne、Hypercorn -
Web 框架:
FastAPI、Starlette、Django 3+
3、为什么要有 ASGI?
WSGI(Flask、Django传统版本)是同步的:
-
一次只能处理一个请求;
-
不支持 WebSocket;
-
不能在请求等待时处理其他任务。
ASGI 出现后带来:
✅ 异步 I/O
✅ WebSocket 支持
✅ 高并发性能
七、Gunicorn 和 Uvicorn 补充
1、Gunicorn:
Gunicorn (Green Unicorn 绿色独角兽,读作古尼科恩) 是一个基于 Python 的 WSGI HTTP 服务器。
-
类型:WSGI Server(同步)
-
主要用途:运行基于 WSGI 协议的 Python 框架(如 Flask、Django)
-
特点:
-
稳定成熟,常用于生产部署
-
多进程模型(预分叉 Prefork),每个 worker 独立
-
不支持异步框架(原生),但可以通过 ASGI worker 支持异步
-
gunicorn app:app -w 4 -b 0.0.0.0:8000
2、Uvicorn
Uvicorn 运行基于 ASGI 协议的 Python 框架(如 FastAPI、Starlette)
特点:
-
高性能、事件驱动(基于
uvloop+httptools) -
支持 WebSocket、HTTP/2
-
原生异步,适合高并发 API 服务
-
轻量、易用(开发环境常直接用它)
启动
uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4
3、Uvicorn vs Gunicorn 对比表
| 对比项 | Uvicorn | Gunicorn |
|---|---|---|
| 类型 | ASGI 异步服务器 | WSGI 同步服务器 |
| 适用框架 | FastAPI、Starlette、Django 3+ | Flask、Django |
| 并发模型 | 异步协程(基于事件循环) | 多进程(每个进程一个 worker) |
| WebSocket 支持 | ✅ 支持 | ❌ 不支持 |
| 性能 | 高并发性能强 | 稳定但同步性能较低 |
| 典型组合 | 单独运行或搭配 Gunicorn | 常搭配 UvicornWorker 运行 ASGI |
| 部署推荐 | 开发/轻量生产 | 生产级部署(多worker管理) |
4、Gunicorn 的作用:
Gunicorn 接收来自客户端的 HTTP 请求,并将这些请求按照 WSGI 标准转发给你的 Python Web 应用代码进行处理,然后将应用返回的响应发回给客户端。
5、为什么在生产环境使用 Gunicorn?
Python Web 框架自带的开发服务器(如 Flask 的 app.run())通常是单线程的,只能处理一个请求。它们不适合在生产环境中应对高并发和稳定性需求。Gunicorn 采用 Master-Worker 架构:
Master Process (主进程): 负责管理 Worker 进程的生命周期(启动、停止、重启)。它本身不处理客户端请求。
Worker Processes (工作进程): 这些是真正处理客户端 HTTP 请求的进程。Gunicorn 可以配置运行多个 Worker 进程,从而实现并发处理请求的能力。
总结: Gunicorn 是一个用于部署 Python Web 应用到生产环境的强大工具,它负责请求的管理和分发,让你的应用代码专注于业务逻辑。
6、六种工作模式
| Worker 类型 | Worker 类 | 描述 | 备注 |
|---|---|---|---|
| sync | gunicorn.workers.sync.SyncWorker | 同步阻塞模式,默认模式 | ✅ 默认 |
| eventlet | gunicorn.workers.gevent.Worker | 基于协程的异步模式,支持高并发 | ❌ 需要安装 eventlet |
| gevent | gunicorn.workers.gevent.GeventWorker | 使用 gevent 的协程,性能优秀 | ❌ 需要安装 gevent |
| tornado | gunicorn.workers.tornadog.TornadoWorker | 使用 Tornado 的 IOLoop 实现异步 | ❌ 需要安装 tornado |
| gthread | gunicorn.workers.gthread.ThreadWorker | 多线程模式,适合 I/O 密集型任务 | ❌ 可选 |
| uvicorn / hypercorn | 第三方扩展 | 支持 ASGI(异步),用于 FastAPI、Starlette 等框架 | ❌ 第三方 |
7、使用场景对比
| Worker 类型 | 运行模式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| sync | 多进程 | 简单稳定,兼容性好 | 不适合高并发、长连接 | 一般中小型项目 |
| eventlet | 协程 | 高并发、轻量资源占用 | 与某些库不兼容 | WebSocket、长轮询等异步场景 |
| gevent | 协程 | 性能强、社区活跃 | 需注意 monkey patch | 高并发 I/O 密集型服务 |
| tornado | 单线程事件循环 | 与 Tornado 框架无缝集成 | 功能较局限 | 使用 Tornado 框架时 |
| gthread | 多线程 | 适合数据库/网络 I/O | 受 GIL 限制 | I/O 密集型任务,如调用外部 API |
| uvicorn | 异步(ASGI) | 支持 async/await,高性能 | 仅适用于 ASGI 应用 | FastAPI、Starlette 等异步框架 |
补充说明:
-
GIL 限制:Python 的全局解释器锁(GIL)会影响多线程性能,但 I/O 密集型任务仍可受益。
-
Monkey Patch:
gevent需要打补丁(monkey.patch_all())来替换标准库的阻塞调用。 -
ASGI:异步服务器网关接口,适用于现代异步 Python 框架(如 FastAPI、Starlette)。
指定 Worker 模式
使用 -k 或 --worker-class 参数:
gunicorn -w 4 -k sync myapp:app # 默认同步模式 gunicorn -w 4 -k eventlet myapp:app # 使用 eventlet 异步模式 gunicorn -w 4 -k gevent myapp:app # 使用 gevent 协程模式 gunicorn -w 4 -k gthread myapp:app # 使用线程模式 # 安装依赖包 pip install gevent pip install eventlet pip install tornado
sync worker
含义:
sync worker 是 Gunicorn 提供的最简单、也是默认的 Worker 类型。sync 是 "synchronous"(同步)的缩写。
工作原理:
每个 sync worker 进程一次只能处理一个客户端请求。当一个请求到达某个 sync worker 时,该 worker 会一直忙于处理这个请求,直到它完成并发送响应。
在此期间,这个 worker 不能接受和处理任何其他请求,即使它在等待慢速的 I/O 操作(例如,等待数据库查询结果、等待外部 API 响应、读写文件等)。
并发性如何实现?
sync worker 实现并发不是通过单个 worker 同时处理多个请求,而是通过运行多个 sync worker 进程来实现的。如果有 N 个 sync worker,理论上可以同时处理 N 个独立的请求。
特点:
简单: 代码实现和行为逻辑最简单,易于理解和调试。
阻塞 (Blocking): 这是它最大的局限性。如果你的应用在处理请求时有频繁或长时间的 I/O 等待(I/O Bound),单个 sync worker 会被阻塞,影响整个系统的吞吐量,直到 I/O 操作完成。
资源消耗: 通常每个 sync worker 都需要一个独立的进程,这会消耗一定的内存和 CPU 资源。
适用场景:
sync worker 适用于那些请求处理非常快速,并且很少涉及长时间 I/O 等待的应用(即主要是 CPU Bound)。或者在并发需求不高的情况下,使用 sync worker 配合适当数量的进程也是可行的。
对于有大量 I/O 等待的应用,通常会选择 Gunicorn 提供的其他非阻塞(异步)Worker 类型,如 gevent 或 uvloop,以提高吞吐量。

浙公网安备 33010602011771号