為什麼 Nginx 已經這麼成熟,Python 還有各種如 web.py 等 web 架構?
來源:互聯網
上載者:User
回複內容:
nginx是伺服器,web.py是web應用程式框架。
簡言之,前者封裝對網路io的處理,後者負責具體應用的邏輯,解決的問題是不一樣的。形象點呢,一個請求來了,nginx先把請求攔下來,發現要的是現成的東西(靜態檔案),它就直接把現成的靜態檔案返回給用戶端,這樣速度非常快,如果是其他的請求,再交給web.py解決,web.py解決完了之後,只是產生要返回的內容,並不自己做網路io,而是由nginx處理的。
這樣多好,一個安心處理網路、並發,順便把遇到簡單的請求直接ko掉。另一個專心處理應用的邏輯。
當然nginx能做的不只是這些,而為了開發方便web.py等架構都是內建簡單的web伺服器的。
至於tornado,它裡面既有web應用程式框架,也有web伺服器,而且這個伺服器用的還是高效能單線程非阻塞非同步模型,是個例外。Nginx 是以靜態內容和前端代理為主的伺服器,Python 的各種架構用來實現動態邏輯。
常見搭配是 Nginx 監聽用戶端串連,直接響應靜態請求(圖片、css、js 等),然後將動態請求通過 FastCGI (web.py) 或者 proxy (Tornado) 轉寄給後端的伺服器進行處理。Nginx 本身是 C 寫的,代碼效率高,支援動態平衡,比直接用 Python 面對大規模請求要穩定高效一些。
Web.py 這些架構有時候會內建一個伺服器用作開發,但是這個伺服器(與 Python 標準庫的 SimpleHTTPServer 一樣)無法很好應對高負載情況,不應用於生產環境。
真正與 Nginx 形成競爭關係的是 Tornado 和基於 Twisted 的一些伺服器。這些伺服器本身就是為直接連接用戶端設計的,並且支援 WebSocket 等一些 Nginx 反向 Proxy不支援的協議。在一個足夠複雜的、模組繁多的項目中,可能出現 Nginx 支援靜態檔案,Tornado 支援 comet 服務,然後某一端代理更多的商務邏輯的組合形式。nginx更多想做代理和均衡負載,而不大可能執行過於強大的邏輯。它就像一個家長,只有權力但是不具體做事情,然後它做好家長的角色。
而衆多邏輯實現的架構比如web.py就是具體在後面跑的兒子,處理各種業務邏輯。
爲什麼nginx不也把兒子的事情做了呢?估計做不好,因爲很難用一個程式來解決所有的業務,那時候就變成另外一個語言解釋器了……龐大而複雜,不大可行。而兒子也不大可能做了家長的事情,因爲處理業務邏輯重要的是擴展性和表達力。
所以他們就分開了。。。。一般使用 flask 或者 django這種
應用程式框架都會使用uswgi這種
伺服器部署,但是uswgi本身並沒有對
直連用戶端做最佳化,因此一般都會nginx+uswgi,使用nginx串連用戶端向uswgi分發請求提高效率,這樣對uswgi來說就不存在
慢io問題,也可以做動靜分離等等各種。關於Tornado之類高排名答案也說清楚了。網頁伺服器? nginx 的作者要哭了!!!!!!人家是一個好效能的io的東西把內建的開發用的伺服器當成生產用的了?