1. 程式人生 > >cgi、wsgi、uwsgi 與 uWSGI都是啥?

cgi、wsgi、uwsgi 與 uWSGI都是啥?

相信大家在學習web開發的過程中一定會遇到 cgi、 wsgi 之類的名詞,然後看著他們十分相似的解釋估計還沒開始寫程式碼就暈了,這都什麼鬼?

反正我最開始學習那會兒就不知道這些都是個啥,我也推薦學習過程不要糾結於某個詞語的解釋。當你擁有一定開發經驗,對 web 開發有一個更系統的認識後回過頭來看之前的疑惑也許就迎刃而解了,今天我就談談當初對這些看著十分相似的名詞的淺見:

CGI(Common Gateway Inteface): 字面意思就是通用閘道器介面,我覺得之所以看字面意思跟沒看一樣是因為這個稱呼本身很學術,所以對於通俗的理解就存在一定困難,這裡我覺得直接把 Gateway 當作 server 理解就好。

它是外部應用程式與Web伺服器之間的介面標準

意思就是它用來規定一個程式該如何與web伺服器程式之間通訊從而可以讓這個程式跑在web伺服器上。當然,CGI 只是一個很基本的協議,在現代常見的伺服器結構中基本已經沒有了它的身影,更多的則是它的擴充套件和更新。

在講更進一步之前首先我們要了解目前比較常見的服務端結構:

假設我們使用 python 的 Django 框架寫了一個網站,現在要將它掛在網上執行,我們一般需要:

nginx 做為代理伺服器:負責靜態資源傳送(js、css、圖片等)、動態請求轉發以及結果的回覆uWSGI 做為後端伺服器:負責接收 nginx 請求轉發並處理後發給 Django 應用以及接收 Django 應用返回資訊轉發給 nginx

;Django 應用收到請求後處理資料並渲染相應的返回頁面給 uWSGI 伺服器。####接下來的協議及介面就是應用在以上三者之間:

FastCGI: CGI的一個擴充套件, 提升了效能,廢除了 CGI fork-and-execute (來一個請求 fork 一個新程序處理,處理完再把程序 kill 掉)的工作方式,轉而使用一種長生存期的方法,減少了程序消耗,提升了效能。

這裡 FastCGI 就應用於前端 server(nginx)與後端 server(uWSGI)的通訊中,制定規範等等,讓前後端伺服器可以順利理解雙方都在說什麼(當然 uWSGI 本身並不用 FastCGI, 它有另外的協議)

WSGI(Python Web Server GateWay Interface):它是用在 python web 框架編寫的應用程式與後端伺服器之間的規範(本例就是 Django 和 uWSGI 之間),讓你寫的應用程式可以與後端伺服器順利通訊。在 WSGI 出現之前你不得不專門為某個後端伺服器而寫特定的 API,並且無法更換後端伺服器,而 WSGI 就是一種統一規範, 所有使用 WSGI 的伺服器都可以執行使用 WSGI 規範的 web 框架,反之亦然。

uWSGI: 是一個Web伺服器,它實現了WSGI協議、uwsgi、http等協議。用於接收前端伺服器轉發的動態請求並處理後發給 web 應用程式

uwsgi: 是uWSGI伺服器實現的獨有的協議, 網上沒有明確的說明這個協議是用在哪裡的,我個人認為它是用於前端伺服器與 uwsgi 的通訊規範,相當於 FastCGI的作用。當然這只是個人見解,我在知乎進行了相關提問,歡迎共同討論。

簡單來講,這些名詞的關係就是下圖:

對於 CGI ,我認為在 CGI 制定的時候也許沒有考慮到現代的架構,所以他只是一個通用的規範,而後來的 WSGI 也好 Fastcgi 也好等等這些都是在 CGI 的基礎上擴充套件並應用於現代Web Server 不同地方的通訊規範, 所以我在圖中將 CGI 標註在整個流程之上。

做為一個 Python Web 開發者,相信以上流程我們最關注的莫過於 WSGI 這裡所做的事,瞭解熟悉這裡的規範不僅可以讓我們更快速的開發 Web 應用同時我們也可以自己實現一個後端 Server 。