一文搞懂 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 服务器:UvicornDaphneHypercorn

  • Web 框架:FastAPIStarletteDjango 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

  • 支持 WebSocketHTTP/2

  • 原生异步,适合高并发 API 服务

  • 轻量、易用(开发环境常直接用它)

启动

uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4

3、Uvicorn vs Gunicorn 对比表

对比项UvicornGunicorn
类型 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 Patchgevent 需要打补丁(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 类型,如 geventuvloop,以提高吞吐量。

 

 

 

05-CGI, FastCGI, WSGI, uWSGI, uwsgi一文搞懂 (yuque.com)

posted @ 2023-07-31 21:28  凡人半睁眼  阅读(298)  评论(0)    收藏  举报