WSGI的“前世今生”
前面有一篇文章介绍了WSGI接口规范,这里把与WSGI相关的一系列协议与规范进行了梳理,可以更好的理解WSGI的概念。本文章涉及到的相关内容有:
- cgi
- Fastcgi
- WSGI【mod_wsgi】
- uWSGI/uwsgi
1、cgi
cgi全称是"公共网关接口"(Common Gateway Interface),它是一个古老的通信接口协议;可以适用于所有的脚本语言。其工作方式是当用户有请求到达时,前端的WEB服务器会启动一个cgi的进程(该进程的启动文件在WEB服务器的配置文件中预先进行了配置),并把请求相关的信息【path、header】传递给cgi进程。cgi进程执行完之后返回对应html内容给WEB服务器,WEB服务在返回给浏览器。
优点:
支持所有语言、跨平台
缺点:
开销大、并发处理能力低
2、Facecgi
Fastcgi顾名思义,是cgi的快速版本;即原理与cgi类似,但比Fastcgi要更快。原因是使用了新的响应和通信机制。与cgi的fork_and_exec模式不同,fastcgi使用的是类pre-fork的模式。它会在WEB服务器刚启动的时候预先启动若干常驻进程,当用户有请求需要处理时,直接从常驻进程中选取一个来执行即可;因为它无需反复的启动和销毁进程,所以在效率上cgi更快。
另外,Fastcgi会启动一个master管理进程,负责管理启动和管理Fastcgi的worker进程;当有新的用户请求过来,master会选择一个woker来处理该请求;与worker的通信是基于TCP/IP的,所以可以支持跨机器部署WEB环境。
优点:
处理能力提高
支持跨服务器通信
缺点:
并发能力还是有限
没有统一的接口规范
3、WSGI
WSGI则是Python专有的一个接口规范协议。它没有具体的实现,只是规定了具体的规范内容。它的出现让WEB服务器与WEB应用之间的通信有了规范可参照。只要符合WSGI规范的WEB服务器与WEB应用都可以进行轻易的替换,大大降低的后期的运维难度。
同时WSGI的通信方式是接口调用,所以它支持多进程、多线程等方式来处理用户请求,从而进一步提高了并发效率。
优点:
规范了接口定义,达到程序解耦的目的
轻松支持多进程,多线程
缺点:
不支持跨服务器通信
4、uWSGI
uWSGI是一个WSGI服务器,即uWSGI是一个实现了WSGI规范的服务器,它可以与支持WSGI接口的app进行通信。另外uWSGI服务器还实现了uwsgi、http协议,这2个协议主要与WEB服务器进行通信。比较常用的一个uWSGI服务器搭建架构如下:
优点:
由于使用uwsgi协议,其通信效率更好,并发处理能力更强
缺点:
不支持跨服务器通信