python中cgi\fcgi\scgi\wsgi\及其实现的理解

python之禅里说“而是尽量找一种,最好是唯一一种明显的解决方案”,java只有一种servlet规范,但是被Python的cgi规范和接口搞烦了,cgi\fcgi\scgi\wsgi\还有对应的多个实现,如wsgi的mod_wsgi\flup….

前面说了cgi这个玩意,本来就是提供统一接口标准的东西,却因为这样那样的问题(效率,适用性)等等,逐渐被人抛弃。

于是fcgi/scgi(scgi,simple cgi)出现。与cgi的具体差别就不太清楚了,但可以确定的是与cgi做的事情差不多。
不过这两个东西同样存在一些问题(资源消耗)

这就让人纳闷了,cgi所想要扮演的角色的确很重要,但是到目前为止也没有谁真的做好了。但工作还是要继续啊,不能因为cgi/fcgi有问题网页什么的就停摆了吧?
可以以后要是有新的cgi又粗线的话怎么办?

于是python比别人多想了一步:既然cgi这种本该不变的东西结果经常在变,那干脆我自己来定个只适合python用的"cgi“那总行了吧?于是wsgi闪亮登场。

wsgi从python语言层面做了和cgi类似的事情,只不过跟cgi的方向恰好相反。cgi就从http服务器角度看语言扩展,而wsgi则是从语言角度看服务器/cgi变更。

使用wsgi标准编写的python web程序/中间件能保证在wsgi过时前有着很好的兼容性———换句话说,无论后端是cgi还是fcgi还是别的目前能碰到的接口,都可以无差别对待。

cgi是个标准,那么他自然面对着众多不同的实现,在apache服务器上能遇到的自然就有mod_php,mod_python等。

同样的wsgi也是个标准,那么他有些什么实现呢?在apache上能看到的就是mod_wsgi了。
此外还有个flup的实现—————-这两个有什么区别暂时没查到资料。问问八叔吧@8pm

wsgi虽然能用,但毕竟只是为了针对统一标准的,开发东西也会遇到很多不方便。django呢?一个兼容了wsgi的框架。为啥是兼容?django也许还包含了除wsgi接口以外的东西了吧?求确认。

在python的官方文档上有一点不明和一个注意事项,这里贴一下。

首先是mod_python,属于python的cgi实现,但是有不少问题存在(缓存问题,需要重启apache服务器才能清理等等,具体看官方说明吧)
mod_wsgi跟flup都是wsgi实现,但区别在哪儿?未知。代码什么的能通用吗?未知。

mod_python 已经是被淘汰的技术
将解释器作为 web server 的一个模块,那是由於历史原因,一个本身没有 standalone 解释器的语言(PHP)不得已而为之的方式,将一个语言解释器作为 web server 模块,在效率和安全上都有隐患

mod_wsgi 就是 apache 专用的 module
WSGI 另外还有不少实现
如 flup 就提供了 fastcgi 的 bridge,这样那些没有内建支持 WSGI 或 WSGI 模块的 web server,但支持 fastcgi 的(如 lighttpd),就可以使用
还有些类似 cherry py, twisted.web,gunicorn 等,一般就作为 web app 专用 server,外面再用高并发的通用 server,如 nginx 做反向代理,static files,甚至 load balancing

django 支持 wsgi 的意思就是官方提供使用 wsgi 方式 deploy 你的 web app

补充一下, uwsgi 是一个 wsgi 实现, 性能比较优秀(在各种测试中均很突出), nginx自0.9.x(好像)开始内置 uwsgi 支持. 除 python 外, uwsgi 还支持 php 等其他几种语言, 不过目前还是 beta 状态.

几个问题:
那有个nginx的疑问,apache有mod_xxx来制作专门的脚本解释器服务。那么nginx呢?针对这个问题是怎么搞的?
答:直接与后端程序通信, 通常需要加一级调度器来负载均衡/提高并发/内存管理等, 如uwsgi, 如php-fpm

但python貌似没有这样的后端程序啊?难道是需要的时候直接调用/usr/bin/python进行解释?
答::所以才需要wsgi…uwsgi是完全用c写的, 先开几个子进程, 每个把你的python程序运行(载入内存), 然后由C写的部分负责与nginx通信(通过unix socket或者tcp), 接收到的请求调度到某个运行着的python程序里(以wsgi规范), 然后经过web框架跑到你的程序, 再按wsgi规范回传给uwsgi, 再返回nginx

哦,原来就是uwsgi扮演了解释服务这样的角色啊。这样就明白了,只不过这个玩意是集成到nginx中,并且主要支持wsgi规范的,对么?
答:不能算是集成吧…怎么说呢, uwsgi 服务器还是独立的套件, 而他与nginx的通信用的是略为修改的wsgi协议"uwsgi”. 如果是 python 用, uwsgi 服务器甚至可以直接用pip安装.

你可能感兴趣的:(python中cgi\fcgi\scgi\wsgi\及其实现的理解)