相信你們在學習web開發的過程當中必定會遇到 cgi、 wsgi 之類的名詞,而後看着他們十分類似的解釋估計還沒開始寫代碼就暈了,這都什麼鬼?css
反正我最開始學習那會兒就不知道這些都是個啥,我也推薦學習過程不要糾結於某個詞語的解釋。當你擁有必定開發經驗,對 web 開發有一個更系統的認識後回過頭來看以前的疑惑也許就迎刃而解了,今天我就談談當初對這些看着十分類似的名詞的淺見:html
CGI(Common Gateway Inteface): 字面意思就是通用網關接口,我以爲之因此看字面意思跟沒看同樣是由於這個稱呼自己很學術,因此對於通俗的理解就存在必定困難,這裏我以爲直接把 Gateway 看成 server 理解就好。前端
它是外部應用程序與Web服務器之間的接口標準python
意思就是它用來規定一個程序該如何與web服務器程序之間通訊從而可讓這個程序跑在web服務器上。固然,CGI 只是一個很基本的協議,在現代常見的服務器結構中基本已經沒有了它的身影,更多的則是它的擴展和更新。nginx
在講更進一步以前首先咱們要了解目前比較常見的服務端結構:web
假設咱們使用 python 的 Django 框架寫了一個網站,如今要將它掛在網上運行,咱們通常須要:後端
- nginx 作爲代理服務器:負責靜態資源發送(js、css、圖片等)、動態請求轉發以及結果的回覆;
- uWSGI 作爲後端服務器:負責接收 nginx 請求轉發並處理後發給 Django 應用以及接收 Django 應用返回信息轉發給 nginx;
- Django 應用收到請求後處理數據並渲染相應的返回頁面給 uWSGI 服務器。
####接下來的協議及接口就是應用在以上三者之間:服務器
FastCGI: CGI的一個擴展, 提高了性能,廢除了 CGI fork-and-execute
(來一個請求 fork 一個新進程處理,處理完再把進程 kill 掉)的工做方式,轉而使用一種長生存期的方法,減小了進程消耗,提高了性能。markdown
這裏 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 。