python中cgi\fcgi\scgi\wsgi\及其實現的理解

python之禪裏說「而是儘可能找一種,最好是惟一一種明顯的解決方案」,java只有一種servlet規範,可是被Python的cgi規範和接口搞煩了,cgi\fcgi\scgi\wsgi\還有對應的多個實現,如wsgi的mod_wsgi\flup....php

前面說了cgi這個玩意,原本就是提供統一接口標準的東西,卻由於這樣那樣的問題(效率,適用性)等等,逐漸被人拋棄。java

因而fcgi/scgi(scgi,simple cgi)出現。與cgi的具體差異就不太清楚了,但能夠肯定的是與cgi作的事情差很少。 不過這兩個東西一樣存在一些問題(資源消耗)python

這就讓人納悶了,cgi所想要扮演的角色的確很重要,可是到目前爲止也沒有誰真的作好了。但工做仍是要繼續啊,不能由於cgi/fcgi有問題網頁什麼的就停擺了吧? 能夠之後要是有新的cgi又粗線的話怎麼辦?nginx

因而python比別人多想了一步:既然cgi這種本該不變的東西結果常常在變,那乾脆我本身來定個只適合python用的"cgi「那總行了吧?因而wsgi閃亮登場。web

wsgi從python語言層面作了和cgi相似的事情,只不過跟cgi的方向剛好相反。cgi就從http服務器角度看語言擴展,而wsgi則是從語言角度看服務器/cgi變動。apache

使用wsgi標準編寫的python web程序/中間件能保證在wsgi過期前有着很好的兼容性---------換句話說,不管後端是cgi仍是fcgi仍是別的目前能碰到的接口,均可以無差異對待。django

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安裝.

相關文章
相關標籤/搜索