網關協議

CGIphp

CGI即通用網關接口(Common Gateway Interface),是外部應用程序(CGI程序)與Web服務器之間的接口標準,是在CGI程序和Web服務器之間傳遞信息的規程。CGI規範容許Web服務器執行外部程序,並將它們的輸出發送給Web瀏覽器,CGI將Web的一組簡單的靜態超媒體文檔變成一個完整的新的交互式媒體。通俗的講CGI就像是一座橋,把網頁和WEB服務器中的執行程序鏈接起來,它把HTML接收的指令傳遞給服務器的執行程序,再把服務器執行程序的結果返還給HTML頁。CGI 的跨平臺性能極佳,幾乎能夠在任何操做系統上實現。python

CGI方式在遇到鏈接請求(用戶請求)先要建立cgi的子進程,激活一個CGI進程,而後處理請求,處理完後結束這個子進程。這就是fork-and-execute模式。因此用cgi方式的服務器有多少鏈接請求就會有多少cgi子進程,子進程反覆加載是cgi性能低下的主要緣由。當用戶請求數量很是多時,會大量擠佔系統的資源如內存,CPU時間等,形成效能低下。web

CGI腳本工做流程:數據庫

  1. 瀏覽器經過HTML表單或超連接請求指向一個CGI應用程序的URL。
  2. 服務器收發到請求。
  3. 服務器執行所指定的CGI應用程序。
  4. CGI應用程序執行所須要的操做,一般是基於瀏覽者輸入的內容。
  5. CGI應用程序把結果格式化爲網絡服務器和瀏覽器可以理解的文檔(一般是HTML網頁)。
  6. 網絡服務器把結果返回到瀏覽器中。

 

FastCGI瀏覽器

FastCGI是一個可伸縮地、高速地在HTTP server和動態腳本語言間通訊的接口。多數流行的HTTP server都支持FastCGI,包括Apache、Nginx和lighttpd等,同時,FastCGI也被許多腳本語言所支持,其中就有PHP。服務器

FastCGI是從CGI發展改進而來的。傳統CGI接口方式的主要缺點是性能不好,由於每次HTTP服務器遇到動態程序時都須要從新啓動腳本解析器來執行解析,而後結果被返回給HTTP服務器。這在處理高併發訪問時,幾乎是不可用的。FastCGI像是一個常駐(long-live)型的CGI,它能夠一直執行着,只要激活後,不會每次都要花費時間去fork一次(這是CGI最爲人詬病的fork-and-execute 模式)。CGI 就是所謂的短生存期應用程序,FastCGI 就是所謂的長生存期應用程序。因爲 FastCGI 程序並不須要不斷的產生新進程,能夠大大下降服務器的壓力而且產生較高的應用效率。它的速度效率最少要比CGI 技術提升 5 倍以上。它還支持分佈式的運算, 即 FastCGI 程序能夠在網站服務器之外的主機上執行而且接受來自其它網站服務器來的請求。網絡

FastCGI是語言無關的、可伸縮架構的CGI開放擴展,其主要行爲是將CGI解釋器進程保持在內存中並所以得到較高的性能。衆所周知,CGI解釋器的反覆加載是CGI性能低下的主要緣由,若是CGI解釋器保持在內存中並接受FastCGI進程管理器調度,則能夠提供良好的性能、伸縮性、Fail-Over特性等等。FastCGI接口方式採用C/S結構,能夠將HTTP服務器和腳本解析服務器分開,同時在腳本解析服務器上啓動一個或者多個腳本解析守護進程。當HTTP服務器每次遇到動態程序時,能夠將其直接交付給FastCGI進程來執行,而後將獲得的結果返回給瀏覽器。這種方式可讓HTTP服務器專注地處理靜態請求或者將動態腳本服務器的結果返回給客戶端,這在很大程度上提升了整個應用系統的性能。架構

FastCGI的工做流程:併發

  1. Web Server啓動時載入FastCGI進程管理器(PHP-CGI或者PHP-FPM或者spawn-cgi)
  2. FastCGI進程管理器自身初始化,啓動多個CGI解釋器進程(可見多個php-cgi)並等待來自Web Server的鏈接。
  3. 當客戶端請求到達Web Server時,FastCGI進程管理器選擇並鏈接到一個CGI解釋器。Web server將CGI環境變量和標準輸入發送到FastCGI子進程php-cgi。
  4. FastCGI子進程完成處理後將標準輸出和錯誤信息從同一鏈接返回Web Server。當FastCGI子進程關閉鏈接時,請求便告處理完成。FastCGI子進程接着等待並處理來自FastCGI進程管理器(運行在Web Server中)的下一個鏈接。 在CGI模式中,php-cgi在此便退出。

FastCGI 的特色app

  1. 打破傳統頁面處理技術。傳統的頁面處理技術,程序必須與 Web 服務器或 Application 服務器處於同一臺服務器中。這種歷史已經早N年被FastCGI技術所打破,FastCGI技術的應用程序能夠被安裝在服務器羣中的任何一臺服務器,而經過 TCP/IP 協議與 Web 服務器通信,這樣作既適合開發大型分佈式 Web 羣,也適合高效數據庫控制。
  2. 明確的請求模式。CGI 技術沒有一個明確的角色,在 FastCGI 程序中,程序被賦予明確的角色(響應器角色、認證器角色、過濾器角色)。

 

 

WSGI

Web服務器網關接口(Python Web Server Gateway Interface,縮寫爲WSGI)是爲Python語言定義的Web服務器和Web應用程序或框架之間的一種簡單而通用的接口。自從WSGI被開發出來之後,許多其它語言中也出現了相似接口。WSGI是做爲Web服務器與Web應用程序或應用框架之間的一種低級別的接口,以提高可移植Web應用開發的共同點。WSGI是基於現存的CGI標準而設計的。

WSGI區分爲兩個部份:一爲「服務器」或「網關」,另外一爲「應用程序」或「應用框架」。在處理一個WSGI請求時,服務器會爲應用程序提供環境資訊及一個回呼函數(Callback Function)。當應用程序完成處理請求後,透過前述的回呼函數,將結果回傳給服務器。所謂的 WSGI 中間件同時實現了API的兩方,所以能夠在WSGI服務和WSGI應用之間起調解做用:從WSGI服務器的角度來講,中間件扮演應用程序,而從應用程序的角度來講,中間件扮演服務器。「中間件」組件能夠執行如下功能:

  1. 重寫環境變量後,根據目標URL,將請求消息路由到不一樣的應用對象。
  2. 容許在一個進程中同時運行多個應用程序或應用框架。
  3. 負載均衡和遠程處理,經過在網絡上轉發請求和響應消息。
  4. 進行內容後處理,例如應用XSLT樣式表。

之前,如何選擇合適的Web應用程序框架成爲困擾Python初學者的一個問題,這是由於,通常而言,Web應用框架的選擇將限制可用的Web服務器的選擇,反之亦然。那時的Python應用程序一般是爲CGI,FastCGI,mod_python中的一個而設計,甚至是爲特定Web服務器的自定義的API接口而設計的。WSGI沒有官方的實現, 由於WSGI更像一個協議。只要遵守這些協議,WSGI應用(Application)均可以在任何服務器(Server)上運行, 反之亦然。WSGI就是Python的CGI包裝,相對於Fastcgi是PHP的CGI包裝。

WSGI將 web 組件分爲三類: web服務器,web中間件,web應用程序, wsgi基本處理模式爲 : WSGI Server -> (WSGI Middleware)* -> WSGI Application 。

wsgi

一、WSGI Server/gateway

wsgi server能夠理解爲一個符合wsgi規範的web server,接收request請求,封裝一系列環境變量,按照wsgi規範調用註冊的wsgi app,最後將response返回給客戶端。文字很難解釋清楚wsgi server究竟是什麼東西,以及作些什麼事情,最直觀的方式仍是看wsgi server的實現代碼。以python自帶的wsgiref爲例,wsgiref是按照wsgi規範實現的一個簡單wsgi server。它的代碼也不復雜。

wsgi-gateway

  1. 服務器建立socket,監聽端口,等待客戶端鏈接。
  2. 當有請求來時,服務器解析客戶端信息放到環境變量environ中,並調用綁定的handler來處理請求。
  3. handler解析這個http請求,將請求信息例如method,path等放到environ中。
  4. wsgi handler再將一些服務器端信息也放到environ中,最後服務器信息,客戶端信息,本次請求信息所有都保存到了環境變量environ中。
  5. wsgi handler 調用註冊的wsgi app,並將environ和回調函數傳給wsgi app
  6. wsgi app 將reponse header/status/body 回傳給wsgi handler
  7. 最終handler仍是經過socket將response信息塞回給客戶端。

二、WSGI Application

wsgi application就是一個普通的callable對象,當有請求到來時,wsgi server會調用這個wsgi app。這個對象接收兩個參數,一般爲environ,start_response。environ就像前面介紹的,能夠理解爲環境變量,跟一次請求相關的全部信息都保存在了這個環境變量中,包括服務器信息,客戶端信息,請求信息。start_response是一個callback函數,wsgi application經過調用start_response,將response headers/status 返回給wsgi server。此外這個wsgi app會return 一個iterator對象 ,這個iterator就是response body。這麼空講感受很虛,對着下面這個簡單的例子看就明白不少了。

三、WSGI MiddleWare

有些功能可能介於服務器程序和應用程序之間,例如,服務器拿到了客戶端請求的URL, 不一樣的URL須要交由不一樣的函數處理,這個功能叫作 URL Routing,這個功能就能夠放在兩者中間實現,這個中間層就是 middleware。middleware對服務器程序和應用是透明的,也就是說,服務器程序覺得它就是應用程序,而應用程序覺得它就是服務器。這就告訴咱們,middleware須要把本身假裝成一個服務器,接受應用程序,調用它,同時middleware還須要把本身假裝成一個應用程序,傳給服務器程序。

其實不管是服務器程序,middleware 仍是應用程序,都在服務端,爲客戶端提供服務,之因此把他們抽象成不一樣層,就是爲了控制複雜度,使得每一次都不太複雜,各司其職。

相關文章
相關標籤/搜索