CGI 簡介
CGI全稱是“通用網(wǎng)關(guān)接口”(Common Gateway Interface),它可以讓一個客戶端怎栽,從網(wǎng)頁瀏覽器向執(zhí)行在Web服務(wù)器上的程序請求數(shù)據(jù)丽猬。 CGI描述了客戶端和這個程序之間傳輸數(shù)據(jù)的一種標(biāo)準(zhǔn)。 CGI的一個目的是要獨(dú)立于任何語言的熏瞄,所以CGI可以用任何一種語言編寫脚祟,只要這種語言具有標(biāo)準(zhǔn)輸入、輸出和環(huán)境變量强饮。 如php由桌,perl,tcl等。
CGI 的運(yùn)行原理
客戶端訪問某個 URL 地址之后行您,通過 GET/POST/PUT 等方式提交數(shù)據(jù)铭乾,并通過 HTTP 協(xié)議向 Web 服務(wù)器發(fā)出請求。
服務(wù)器端的 HTTP Daemon(守護(hù)進(jìn)程)啟動一個子進(jìn)程娃循。然后在子進(jìn)程中炕檩,將 HTTP 請求里描述的信息通過標(biāo)準(zhǔn)輸入 stdin 和環(huán)境變量傳遞給 URL 指定的 CGI 程序,并啟動此應(yīng)用程序進(jìn)行處理捌斧,處理結(jié)果通過標(biāo)準(zhǔn)輸出 stdout 返回給 HTTP Daemon 子進(jìn)程笛质。
再由 HTTP Daemon 子進(jìn)程通過 HTTP 協(xié)議返回給客戶端。
上面的這段話理解可能還是比較抽象捞蚂,下面我們就通過一次 GET 請求為例進(jìn)行詳細(xì)說明妇押。
如圖所示,本次請求的流程如下:
1:客戶端訪問 http://127.0.0.1:9003/cgi-bin/user?id=1
2:127.0.0.1 上監(jiān)聽 9003 端口的守護(hù)進(jìn)程接受到該請求姓迅,通過解析 HTTP 頭信息舆吮,得知是 GET 請求,并且請求的是 /cgi-bin/目錄下的 user文件队贱。
3:將 uri 里的 id=1通過存入 QUERY_STRING環(huán)境變量色冀。
4:http守護(hù)進(jìn)程 fork 一個子進(jìn)程,然后在子進(jìn)程中執(zhí)行 user 程序柱嫌,通過環(huán)境變量獲取到id锋恬。
5:執(zhí)行完畢之后,將結(jié)果通過標(biāo)準(zhǔn)輸出返回到子進(jìn)程编丘。
6:子進(jìn)程將結(jié)果返回給客戶端与学。
所以cgi模式下,一個客戶端進(jìn)行一次web服務(wù)器請求的流程為:
客戶端---->web服務(wù)器----->cgi(由web子進(jìn)程創(chuàng)建的cgi程序)------>應(yīng)用程序(比如php)
處理完這次請求后web子進(jìn)程退出嘉抓,cgi進(jìn)程也退出索守。
FastCGI 簡介
FastCGI是Web服務(wù)器和處理程序之間通信的一種協(xié)議, 是CGI的一種改進(jìn)方案抑片,FastCGI像是一個常駐(long-lived)型的CGI卵佛, 它可以一直執(zhí)行,在請求到達(dá)時(shí)不會花費(fèi)時(shí)間去fork一個進(jìn)程來處理(這是CGI最為人詬病的fork-and-execute模式)敞斋。 正是因?yàn)樗皇且粋€通信協(xié)議截汪,它還支持分布式的運(yùn)算,所以 FastCGI 程序可以在網(wǎng)站服務(wù)器以外的主機(jī)上執(zhí)行植捎,并且可以接受來自其它網(wǎng)站服務(wù)器的請求衙解。
FastCGI 是與語言無關(guān)的、可伸縮架構(gòu)的 CGI 開放擴(kuò)展焰枢,將 CGI 解釋器進(jìn)程保持在內(nèi)存中蚓峦,以此獲得較高的性能舌剂。 CGI 程序反復(fù)加載是 CGI 性能低下的主要原因,如果 CGI 程序保持在內(nèi)存中并接受 FastCGI 進(jìn)程管理器調(diào)度暑椰, 則可以提供良好的性能霍转、伸縮性、Fail-Over 特性等干茉。
FastCGI 工作流程如下:
1:FastCGI 進(jìn)程管理器自身初始化谴忧,啟動多個 CGI 解釋器進(jìn)程,并等待來自 Web Server 的連接角虫。
2:Web 服務(wù)器與 FastCGI 進(jìn)程管理器進(jìn)行 Socket 通信沾谓,通過 FastCGI 協(xié)議發(fā)送 CGI 環(huán)境變量和標(biāo)準(zhǔn)輸入數(shù)據(jù)給 CGI 解釋器進(jìn)程。
3:CGI 解釋器進(jìn)程完成處理后將標(biāo)準(zhǔn)輸出和錯誤信息從同一連接返回 Web Server戳鹅。
4:CGI 解釋器進(jìn)程接著等待并處理來自 Web Server 的下一個連接均驶。
所以fast-cgi模式下,一個客戶端進(jìn)行一次web服務(wù)器請求的流程為:
客戶端---->web服務(wù)器---->fast-cgi進(jìn)程管理器--->cgi解釋器--->應(yīng)用程序枫虏。
FastCGI 與傳統(tǒng) CGI 模式的區(qū)別之一則是 Web 服務(wù)器不是直接執(zhí)行 CGI 程序了妇穴,而是通過 Socket 與 FastCGI 響應(yīng)器(FastCGI 進(jìn)程管理器)進(jìn)行交互,也正是由于 FastCGI 進(jìn)程管理器是基于 Socket 通信的隶债,所以也是分布式的腾它,Web 服務(wù)器可以和 CGI 響應(yīng)器服務(wù)器分開部署。Web 服務(wù)器需要將數(shù)據(jù) CGI/1.1 的規(guī)范封裝在遵循 FastCGI 協(xié)議包中發(fā)送給 FastCGI 響應(yīng)器程序死讹。
參考:cgi與fast-cgi