CGI(Common Gateway Interface)
如果客戶端的需求只是靜態文件(比如靜態 html), 那么服務器只需要把靜態文件傳送給客戶端就行了.
但事實上需求多種多樣, 我們需要由程序動態生成的內容. 我們當然可以把這部分功能結合在 web服務器里, 但這樣一來隨著需求日益增多, 服務器程序很快就無法維護了...
因此 web 服務器只保留最基本功能(解析http請求等), 而把具體對資源的處理放入另外的程序.這些程序根據CGI(協議)從環境變量或標準輸入得到請求信息, 并通過標準輸出返回給服務器.
但這種分離的壞處是每次CGI請求都會運行CGI程序(產生新的進程), 結束時銷毀, 增加負荷, 效率不高.因為每個 CGI 進程只處理一個請求,換句話說,每個請求都需要創建一個 CGI 進程處理,CGI 程序處理完畢后就退出了。
對一個 CGI 程序,做的工作其實只有:從環境變量(environment variables)和標準輸入(standard input)中讀取數據、處理數據、向標準輸出(standard output)輸出數據。
WSGI(Python Web Server Gateway Interface,縮寫為WSGI)
WSGI只是一份標準,一個兩邊接口方式的約定(Web服務器與Web應用程序之間)
WSGI更像一個協議。只要遵照這些協議,WSGI應用(Application)都可以在任何服務器(Server)上運行
一個符合wsgi規范的web server,接收request請求,封裝一系列環境變量,按照wsgi規范調用注冊的wsgi app,最后將response返回給客戶端。
WSGI將 web 組件分為三類: web服務器,web中間件,web應用程序, wsgi基本處理模式為 : WSGI Server -> (WSGI Middleware)* -> WSGI Application 。
WSGI 與 CGI 類似, 不過不是另外開辟一個進程, 而是調用一個 WSGI 程序(callable 對象), 其中 environ 變量(包含請求參數信息), start_response (作為回調函數使用, 讓 WSGI 程序可以設置響應頭部, 更加靈活) 作為參數.
WSGI 流程大概下面這個樣子:
服務器啟動加載一個 WSGI 程序(callable 對象, 可能由框架提供)
服務器建立連接,讀取請求并解析, 然后創建一個 environ 字典, 服務器程序還會實現一個 start_response 方法, 用于在應用內部更改響應頭部
服務器將 environ 和 start_response 作為參數, 調用 WSGI 程序, 并得到返回的數據
服務器將得到的數據和由 start_response(WSGI 程序內部調用) 設置的響應頭部來構造 HTTP 響應, 并返回給客戶端
參考:https://www.biaodianfu.com/cgi-fastcgi-wsgi.html
http://www.lxweimin.com/p/4cea972770f4