什么是mod_php和mod_fastcgi
在lamp體系中,對(duì)于apache端的php的配置,我們最常用的就是mod_php,它把php作為apache一個(gè)內(nèi)置的模塊.讓apache http服務(wù)器本身能夠支持php語(yǔ)言,不需要每一個(gè)請(qǐng)求就啟動(dòng)php解釋器來(lái)解釋php.
和把webserver與php綁定起來(lái)的方式不同,fastcgi是http服務(wù)器與你的或其它機(jī)器上的程序進(jìn)行“交談”的一種工具,相當(dāng)于一個(gè)程序接口。它可以接受來(lái)自web服務(wù)器的請(qǐng)求,解釋輸入信息,將處理后的結(jié)果返回給服務(wù)器等。mod_fastcgi就是在apache下支持fastcgi協(xié)議的模塊。
SAPI和CLI
SAPI(Server Application Programming Interface):服務(wù)器端應(yīng)用程序接口
CLI(Command Line Interface):命令行接口
php運(yùn)行原理
對(duì)于一個(gè)基于apache的php應(yīng)用,運(yùn)行流程可以簡(jiǎn)單歸結(jié)為:
Apache -> httpd -> mod_php -> fastcgi -> sapi -> php
mod_php
在lamp體系中,mod_php是最常使用的工作方式。在這種模式下,php被編譯為apache的一個(gè)內(nèi)置模塊,在啟動(dòng)加載的時(shí)候,當(dāng)有一個(gè)php請(qǐng)求過(guò)來(lái),直接在httpd進(jìn)程里完成了php的解釋運(yùn)行,將結(jié)果返回。工作原理如圖所示:
mod_fastcgi
普通cgi的工作流程:
CGI英文全程是 Command Gateway Interface,通常翻譯為公共網(wǎng)關(guān)接口,是HTTP服務(wù)器與機(jī)器上的其他程序進(jìn)行通信的一個(gè)接口。這個(gè)“其他程序”可以是使用任何計(jì)算機(jī)語(yǔ)言進(jìn)行編寫(xiě),例如php,python,perl等等。它通過(guò)CGI這個(gè)接口從HTTP服務(wù)器取得輸入,然后把運(yùn)行結(jié)果又通過(guò)CGI這個(gè)接口交給HTTP服務(wù)器,而HTTP服務(wù)器把這個(gè)結(jié)果送給瀏覽器。
CGI的出現(xiàn)讓W(xué)EB從靜態(tài)變?yōu)閯?dòng)態(tài),隨著web的越來(lái)越普及,很多的網(wǎng)站都需要有動(dòng)態(tài)的頁(yè)面,以便與瀏覽者進(jìn)行交互。CGI的缺點(diǎn)也越來(lái)越突出,因?yàn)镠TTP要生成一個(gè)動(dòng)態(tài)頁(yè)面,系統(tǒng)就必須啟動(dòng)一個(gè)新的進(jìn)程以運(yùn)行CGI程序,不斷的fork是一項(xiàng)很消耗時(shí)間和資源的工作。
fastcgi工作原理:
(1)web server 啟動(dòng)時(shí)載入Fastcgi進(jìn)程管理器。[php的fastcgi進(jìn)程管理器是PHP-FPM(php-FastCGI Process Manager)]
(2)Fastcgi進(jìn)程管理器自身初始化,啟動(dòng)多個(gè)CGI解釋器進(jìn)程并且等待來(lái)自web server的連接。啟動(dòng)php-cgi Fastcgi進(jìn)程時(shí),可以配置TCP和unix套接字兩種方式。一般生產(chǎn)環(huán)境中采用TCP方式
(3)當(dāng)客戶端請(qǐng)求到達(dá)web server時(shí),web server 通過(guò)tcp協(xié)議或者unix套接字的方式將請(qǐng)求轉(zhuǎn)發(fā)給Fastcgi主進(jìn)程,F(xiàn)astcgi主進(jìn)程選擇并連接一個(gè)cgi進(jìn)程。
(4)Fastcgi子進(jìn)程完成php程序流程處理后將標(biāo)準(zhǔn)輸出和錯(cuò)誤信息一同返回給web server。當(dāng)Fastcgi子進(jìn)程關(guān)閉時(shí),請(qǐng)求便告處理完成。Fastcgi子進(jìn)程便接著等待來(lái)自Fastcgi進(jìn)程管理器的下一個(gè)連接。
(5)fastcgi是基于cgi架構(gòu)的擴(kuò)展,他的核心思想就是在web server和具體cgi程序之間建立一個(gè)智能的可持續(xù)的中間層,統(tǒng)管cgi程序的運(yùn)行,這樣web server只需要將請(qǐng)求提交給這個(gè)層,這個(gè)層再派生出幾個(gè)可復(fù)用的cgi程序?qū)嵗缓笤侔颜?qǐng)求分發(fā)給這些實(shí)例,這些實(shí)例是可控的,可持續(xù),可復(fù)用的。mod_fastcgi的主要優(yōu)點(diǎn)是把動(dòng)態(tài)語(yǔ)言和web server分離開(kāi)來(lái)。這種技術(shù)允許把web server 和 動(dòng)態(tài)語(yǔ)言運(yùn)行在不同的主機(jī)上,以大規(guī)模擴(kuò)展和改進(jìn)安全性而不損失生產(chǎn)效率。
基于mod_fastcgi方式的php應(yīng)用,工作流程如下:
mod_fastcgi遠(yuǎn)程配置方式
fastcgi實(shí)例和apache分離開(kāi)來(lái),這兩者可以分開(kāi)來(lái)部署。他們之間的通信通過(guò)tcp或者unix sock來(lái)完成。使用ext方式,fastcgi實(shí)例是獨(dú)立運(yùn)行的。
php-fpm
使用fastcgi,最主要的優(yōu)點(diǎn)是把應(yīng)用和web server(apache)分離開(kāi)來(lái)。這樣允許把web server 和動(dòng)態(tài)語(yǔ)言(php)運(yùn)行在不同的主機(jī)上,以大規(guī)模擴(kuò)展和改進(jìn)安全性而不損失效率。
這樣情況下,對(duì)于php-cgi程序,由于從apache中分離出來(lái),就需要一個(gè)單獨(dú)的工具來(lái)對(duì)這些進(jìn)程進(jìn)行管理,幸運(yùn)的就是php-fpm的出現(xiàn)。
特性
(1)php守護(hù)進(jìn)程:pid file,log file,setsid(),setuid(),setgid(),chroot()
(2)進(jìn)程控制,可以平滑的重啟,重新載入配置和二進(jìn)制模塊而不丟失請(qǐng)求
(3)限制ip地址,可以滿足web server的要求
(4)使用用不同的uid/gid/chroot/環(huán)境變量,不同的php.ini選項(xiàng),不需要safe mode
(5)記錄word process的stdout和stderr
(6)如果set_time_limit沒(méi)有起作用,強(qiáng)制結(jié)束過(guò)期進(jìn)程
特色功能:
(1)fastcgi_finish_request()函數(shù):響應(yīng)完成,關(guān)閉連接
(2)優(yōu)化上傳支持
(3)特色功能Error header
參考文獻(xiàn):
mod_php對(duì)比mod_fastcgi