聊聊CGI、FastCGI徒扶、WSGI

CGI

CGI(Common Gateway Interface根穷,通用網(wǎng)關接口 ),描述了服務器和客戶端請求處理程序(通常就是瀏覽器)之間傳輸數(shù)據(jù)的一種標準溶浴。

它最初是在1993年由NCSA(美國國家超級電腦應用中心)為NCSA HTTPd Web服務器開發(fā)的管引。

CGI的第一個實現(xiàn)是采用Perl編寫的。Perl被廣泛用于編寫CGI程序褥伴,但CGI本身是獨立于任何語言的重慢。事實上饥臂,CGI程序可以使用任何腳本語言甚至是編譯型語言分別獨立實現(xiàn)隅熙,比如Unix Shell核芽、Python、Ruby轧简、PHP、C/C++等拳芙。


CGI的工作方式大致可以描述為:

  • Step0 普通用戶通過瀏覽器(或者是表單提交、或者是直接訪問URL)發(fā)送請求給Web服務器
  • Step1 Web服務器接收到請求后分飞,啟動CGI程序浆竭,通過環(huán)境變量惨寿、標準輸入等傳遞數(shù)據(jù),將請求轉交給對應的CGI進程
  • Step2 CGI進程啟動解析器裂垦,或者訪問數(shù)據(jù)庫蕉拢、或者完成相關計算、或者與其它第三方進行交互
  • Step3 在CGI程序處理完成后晕换,通過標準輸出將處理結果返回給Web服務器
  • Step4 Web服務器收到結果后,構建Response返回給客戶端益愈,并殺死CGI進程

總結來說夷家,CGI采用的是“fork-and-execute”的工作模式,其缺點在于:效率低下摸袁,每個請求都需要fork一個新的CGI進程去處理义屏。當請求量增大時服務器很快將被壓垮。

為了提升CGI工作性能闽铐,有一種辦法是,將腳本解釋器直接作為模塊集成在Web服務器中添谊,例如:Apache的mod_perl模塊察迟,這樣就能夠避免重復載入和初始化解釋器耳高。不過這只是針對那些解釋型語言而言的所踊,使用諸如C一類的編譯型語言則可以避免這種額外負荷。由于C及其他編譯語言的程序與解釋語言程序相比碌燕,前者的運行速度更快继薛、對操作系統(tǒng)的負荷更小,使用編譯語言程序是可能達到更高執(zhí)行效率的遏考。然而因為開發(fā)效率等因素,在目前解釋型語言還是最合適的青团。

另一個辦法就是FastCGI技術咖楣。

FastCGI

FastCGI(快速通用網(wǎng)關接口),是CGI的增強版本娃肿。其目的在于瘪松,減少Web服務器與CGI程序之間交互的開銷,使得服務器可以同時處理更多的請求宵睦。

與CGI“fork-and-execute”的工作模式不同,F(xiàn)astCGI像是一個常駐型的CGI桐智,它使用持續(xù)的進程來處理一連串的請求烟馅。這些進程由FastCGI進程管理器管理,而不是Web服務器刊驴。當進來一個請求時,Web服務器把環(huán)境變量和這個頁面請求通過一個unix domain socket(比如FastCGI進程與Web服務器都位于本地)或者一個TCP連接(FastCGI進程部署在遠端)傳遞給FastCGI進程舅柜。

  • Step1 Web服務器啟動時躲惰,初始化FastCGI執(zhí)行環(huán)境,例如apache mod_fastcgi础拨、nginx ngx_http_fastcgi_module、lighttpd mod_fastcgi
  • Step2 FastCGI進程管理器自身初始化滔蝉,啟動多個CGI解釋器進程并等待來自Web服務器的連接
  • Step3 當客戶端請求到達Web服務器時僚焦,Web服務器將請求通過socket方式轉發(fā)到FastCGI主進程曙痘,主進程選擇并連接到一個CGI解釋器。Web服務器將CGI環(huán)境變量和標準輸入發(fā)送到FastCGI子進程
  • Step4 FastCGI子進程完成處理后名扛,將標準輸出和錯誤信息通過同一socket返回給Web服務器茧痒,并關閉連接
  • Step5 FastCGI子進程接著等待下一個新的連接

不足之處:

PHP-CGI

PHP-CGI是PHP自帶的FastCGI管理器。

不足之處:

  1. 變更php.ini配置后弄企,需重啟PHP-CGI才能生效区拳,不能平滑重啟
  2. 直接殺死PHP-CGI進程,PHP就不能運行了(PHP-FPM和Spawn-FCGI就沒有這個問題了樱调,守護進程會平滑地重新生成新的子進程)

PHP-FPM

PHP-FPM是一個PHP FastCGI管理器笆凌,最初它只是PHP源碼的一個補丁,而從PHP 5.3.3開始乞而,已經(jīng)被集成到了PHP源碼中。與原生的PHP-CGI相比欠啤,它提供了更加友好的管理方式,可以有效控制內存和進程跪妥、可以平滑重載PHP配置眉撵。

Spawn-FCGI

Spawn-FCGI是一個通用的FastCGI管理器,起初它是lighttpd的一部分纽疟。目前,Spawn-FCGI已經(jīng)獨立成為一個項目散吵,性能較以往更加穩(wěn)定蟆肆。

WSGI

But,事情總是還有改進的余地的枚冗,F(xiàn)astCGI這套工作模式實際上沒有什么太大缺陷蛇损,但是有些不安分的Python程序猿覺得,F(xiàn)astCGI標準下寫異步的Web服務還是不太方便淤齐,如果能夠收到請求后CGI端去處理,處理完畢后通過Callback回調來返回結果稚疹,那樣豈不是很Coooool锈死?!所以WSGI就被創(chuàng)造出來了:

以上引文很好地說明了WSGI的來歷其屏。WSGI(Web Server Gateway Interface)是專門為Python定義的Web服務器和Web應用程序或框架之間的一種簡單而通用的接口缨该。

其工作方式大致是:當Web服務器接收到一個請求后,可以通過Socket把環(huán)境變量和一個callback回調函數(shù)傳遞給后端Web應用程序蛤袒,Web應用程序處理完成后,調用callback函數(shù)妙真,把結果返回給WebServer。

這種方式的優(yōu)點有:

  1. 異步化练般,通過callback將Web請求的工作拆解開锈候,可以很方便地在一個線程空間里同時處理多個Web請求
  2. 方便進行各種負載均衡和請求轉發(fā),不會造成后端Web應用阻塞

參考資料:

  1. 通用網(wǎng)關接口-維基百科
  2. CGI入門
  3. Python CGI編程
  4. FastCGI-維基百科
  5. Nginx + CGI/FastCGI + C/Cpp
  6. 搞不清FastCgi與PHP-fpm之間是個什么樣的關系
  7. 什么是CGI摄职、FastCGI获列、PHP-CGI蛛倦、PHP-FPM、Spawn-FCGI溯壶?
  8. 漫談 CGI FastCGI WSGI
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末且改,一起剝皮案震驚了整個濱河市板驳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌慨蓝,老刑警劉巖端幼,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異此熬,居然都是意外死亡,警方通過查閱死者的電腦和手機犀忱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門阴汇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吉执,你說我怎么就攤上這事地来。” “怎么了未斑?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵蜡秽,是天一觀的道長。 經(jīng)常有香客問我试浙,道長寞蚌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任壹哺,我火速辦了婚禮艘刚,結果婚禮上,老公的妹妹穿的比我還像新娘攀甚。我一直安慰自己,他們只是感情好炸庞,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布燕雁。 她就那樣靜靜地躺著,像睡著了一般拐格。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上懂衩,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天金踪,我揣著相機與錄音冕茅,去河邊找鬼坷衍。 笑死苫亦,一個胖子當著我的面吹牛怨咪,可吹牛的內容都是我干的。 我是一名探鬼主播唉匾,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼巍膘,長吁一口氣:“原來是場噩夢啊……” “哼油啤!你這毒婦竟也來了?” 一聲冷哼從身側響起益咬,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤幽告,失蹤者是張志新(化名)和其女友劉穎裆甩,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嗤栓,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年锭弊,在試婚紗的時候發(fā)現(xiàn)自己被綠了擂错。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡剑鞍,死狀恐怖蚁署,靈堂內的尸體忽然破棺而出蚂四,到底是詐尸還是另有隱情,我是刑警寧澤证杭,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布解愤,位于F島的核電站,受9級特大地震影響送讲,放射性物質發(fā)生泄漏。R本人自食惡果不足惜监右,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一异希、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧扣癣,春花似錦憨降、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽莱衩。三九已至,卻和暖如春操骡,著一層夾襖步出監(jiān)牢的瞬間赚窃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工是掰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留辱匿,地道東北人。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓絮短,卻偏偏與公主長得像昨忆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子邑贴,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內容