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類比;
- 完整的流程
- web伺服器與wsgi伺服器
- wsgi伺服器和web框架
- 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 ?