tornado cgi wsgi uwsgi之間的關係?

分不清tornado算cgi還是wsgi了。。

還是說前面做反向代理的nginx是cgi?

好像Python其他web框架都使用wsgi的。

難道tornado算什麼,自成一派嗎?

後面還有個uwsgi....


Tornado可以當作HTTP server,直接TCP開始實現HTTP服務,這也就是為啥說Tornado可以不經過WSGI。實際上它也不是CGI,CGI是指通過stdin和stdout進行HTTP的請求處理,WSGI則是包裹成一個Python對象來傳遞請求和響應。

WSGI是寫入PEP的python的HTTP介面,然而缺點是這個借口是完全同步的,Tornado最大的特點是可以非同步處理請求,然而如果使用WSGI,那就不能做到了。官方文檔明確指出,將Tornado應用作為WSGI應用時非同步介面全部不可用。

相反,Tornado可以作為HTTP server向其它框架提供WSGI容器,所以可以用Tornado來做apache/nginx/guicorn之類的事情。

所以對Tornado而言,如果還要使用nginx之類做前置,正確的姿勢應當是通過反向代理來做負載均衡。


Tornado: HTTP 伺服器、WSGI 框架(很少用)

CGI: 古老的動態 HTTP 服務方式,極其低效、容易出漏洞。Perl 盛行的時代很常用。

WSGI: Python 的 HTTP 介面協議

FastCGI: PHP 等的介面協議。PHP 也是唯一一個把 FastCGI 實現得像 CGI 的 FastCGI 實現(HTTP 頭可通過環境變數訪問)

uwsgi: 它是一個軟體。是 WSGI、PSGI 等等的容器。也就是它實現了這些協議。同樣實現了 WSGI 的還有 gunicorn 之類的。

nginx: 可以作為代理,把 HTTP 傳給 Tornado。也可以作為網關,把 HTTP 轉成 FastCGI、uwsgi 協議傳給後邊的程序。


1 首先,tornado是什麼?

官方文檔上的解釋是tornado是一個web框架和非同步網路庫:

Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed. By using non-blocking network I/O, Tornado can scale to tens of thousands of open connections, making it ideal for long polling, WebSockets, and other applications that require a long-lived connection to each user.

實際用途可參見如何理解 Tornado ? - 羅伊的回答 - 知乎,所以tornado被作為

  • web框架(使用wsgi),可以和Django,flask,pyramid類比;

  • wsgi伺服器,可以和Gunicorn,Waitress,uWSGI類比;
  • web伺服器,可以和Nginx類比;
  • 非同步網路庫,可以和twisted類比;

2 其次,web伺服器,wsgi伺服器,web框架之間是什麼關係?

  • 完整的流程

  • web伺服器與wsgi伺服器

  • wsgi伺服器和web框架

3 補充

  • CGI,FastCGI是差不多的層面上的(*)
  • wsgi和上述的介面不是同一層面上的(*),其中uWSGI一個基於uwsgi協議的wsgi伺服器(*)。另外wsgi之於python,類似rack之於ruby(rack是ruby的wsgi,它的靈感來源於python的wsgi)
  • 如果使用python開發web,wsgi可以用,也可以不用

4 材料

  • 一起寫一個 Web 伺服器(2) - Python - 伯樂在線

  • Web Applications

  • Deployment - Full Stack Python

  • WSGI Servers - Full Stack Python

  • Web Server Gateway Interface

5 最後

本人知道python語言,使用過一些flask,但題主提出的概念其實我並不是很理解,本人沒有使用過tornado,更沒有實際去部署過伺服器,所以有什麼不對的地方請大家指正,其中(*)表示我不是很理解地方



一篇總結的很好的文檔 CGI FastCGI WSGI 學習筆記

結合這篇文檔加上上面Coldwings的回答

以及uWSGI 伺服器的 uwsgi 協議究竟用在何處?

就可以了解這些名詞了.


wsgi(Web Server Gateway Interface)是Web伺服器和Web應用程序之間的介面協議(參見PEP333、PEP3333)。

uwsgi是uWSGI伺服器(注意大小寫)所使用的原生協議。它是一個二進位協議。uWSGI本身也是兼容wsgi協議的。


推薦閱讀:

用C寫Python擴展時哪些地方容易導致內存泄露?
2017年,Web 後端出現了哪些新的思想和技術?
(做生物信息的)你們是怎麼知道Python裡面sys.argv和getopt這種函數的?
想入生物信息學這個行業,python學習要達到什麼程度???
怎麼評價新發布的odoo 11 ?

TAG:Python | Tornado | WSGI |