Nginx解析PHP腳本的過程

1、什么是CGI

CGI是Common Gateway Interface(公共網(wǎng)關(guān)接口)的縮寫,它有什么用呢?我們知道瀏覽器訪問一個(gè)含有動(dòng)態(tài)數(shù)據(jù)的頁面,瀏覽器使用HTTP協(xié)議發(fā)送請(qǐng)求。數(shù)據(jù)包經(jīng)過路由器和交換機(jī),到達(dá)目標(biāo)web服務(wù)器,web服務(wù)器收到這個(gè)請(qǐng)求,需要和PHP通信,才能拿到含有動(dòng)態(tài)數(shù)據(jù)的頁面。為什么要通信?因?yàn)樗麄冋Z言不通(nginx等web服務(wù)器和php語言和語法不一樣,沒法直接溝通)

那么,要怎么通信呢?最早是用CGI協(xié)議來通信。通過CGI協(xié)議,nginx能夠?qū)TTP請(qǐng)求轉(zhuǎn)化為PHP可以理解的語言(uri,post數(shù)據(jù)和get的數(shù)據(jù),HTTP header等數(shù)據(jù))。CGI規(guī)定了要傳哪些數(shù)據(jù)、以什么樣的格式傳遞給后方處理。

1、傳統(tǒng)的使用CGI協(xié)議的工作方式

web服務(wù)器本身只是內(nèi)容的分發(fā)者,比如請(qǐng)求/index.html,web服務(wù)器就會(huì)去尋找這個(gè)文件,然后返回給瀏覽器,這里指的只是靜態(tài)文件。如果是請(qǐng)求/index.php會(huì)怎么樣?web服務(wù)器知道這不是個(gè)靜態(tài)資源,需要解析后再返回給瀏覽器,于是web服務(wù)器就啟動(dòng)一個(gè)php解釋器進(jìn)程,這個(gè)解釋器實(shí)現(xiàn)了CGI協(xié)議,能夠完成和后端語言PHP的溝通,PHP把該返回的動(dòng)態(tài)數(shù)據(jù)還給web服務(wù)器,然后web服務(wù)器再發(fā)給瀏覽器。

2、傳統(tǒng)的CGI協(xié)議的弊端

為什么傳統(tǒng)的CGI工作方式會(huì)有弊端?因?yàn)?b>每請(qǐng)求一個(gè)PHP腳本,web服務(wù)器就得為一個(gè)請(qǐng)求開啟一個(gè)PHP解釋器(早期是php-cgi)進(jìn)程來完成解析。這意味著:每來一個(gè)請(qǐng)求,解釋器就得初始化php.ini并加載php擴(kuò)展,等環(huán)境初始化完了,再解析,解析完成后進(jìn)程自動(dòng)結(jié)束(即fork-and-execute模式)。

所以用cgi方式的服務(wù)器有多少連接請(qǐng)求就會(huì)有多少cgi子進(jìn)程,子進(jìn)程反復(fù)加載是cgi性能低下的主要原因。都會(huì)當(dāng)用戶請(qǐng)求數(shù)量非常多時(shí),會(huì)大量擠占系統(tǒng)的資源如內(nèi) 存,CPU時(shí)間等,造成效能低下。

2、什么是fastCGI

fastCGI,通俗的翻譯為快速的CGI。FastCGI,顧名思義為更快的 CGI,它允許在一個(gè)進(jìn)程內(nèi)處理多個(gè)請(qǐng)求,而不是一個(gè)請(qǐng)求處理完畢就直接結(jié)束進(jìn)程,web服務(wù)器性能上有了很大的提高。

1、關(guān)于php-fpm

php-fpm,即專門為php打造的fastCGI process manager(PHP的fastCGI管理器)。nginx使用這些php-fpm進(jìn)程來和PHP進(jìn)行通信,你可以理解把php-fpm理解為php解釋器。

和傳統(tǒng)的php-cgi的解釋器不同,php-fpm實(shí)現(xiàn)了fastCGI協(xié)議,而且還新增了不少特性。比如php-fpm能夠平滑重啟php環(huán)境配置:我們知道在修改了php.ini之后,wamp和phpstudy需要重啟服務(wù)器才能重新加載php.ini里的內(nèi)容。如果是php-fpm,則不用重啟web服務(wù)器,原先正在工作的php-fpm繼續(xù)工作,等原先工作的php-fpm完成自己的工作后,就結(jié)束掉自己。新增加的php-fpm就使用修改后的php.ini即可。

2、實(shí)現(xiàn)了fastCGI的工作方式

實(shí)現(xiàn)了fastCGI協(xié)議的nginx,第一次啟動(dòng)時(shí),會(huì)啟動(dòng)一個(gè)php-fpm的master進(jìn)程,該master進(jìn)程初始化環(huán)境后,啟動(dòng)多個(gè)worker進(jìn)程(即php-fpm進(jìn)程池中的php-fpm),如下圖:

當(dāng)請(qǐng)求發(fā)來后,master進(jìn)程把請(qǐng)求分發(fā)到進(jìn)程池中的php-fpm,分發(fā)完后,就可以接下一個(gè)請(qǐng)求了,避免了重復(fù)勞動(dòng)(重復(fù)加載php.ini初始化環(huán)境),效率自然提升了。當(dāng)請(qǐng)求多的時(shí)候,master會(huì)啟動(dòng)更多的php-fpm子進(jìn)程,當(dāng)請(qǐng)求少的時(shí)候,master也會(huì)停掉一些子進(jìn)程。既提高了性能,也節(jié)省資源。

當(dāng)然,當(dāng)php-fpm設(shè)定的上限,不足以支持更高的并發(fā)請(qǐng)求時(shí),nginx只能返回502錯(cuò)誤了,因?yàn)闆]有更多的php-fpm進(jìn)程可用了。

在這種協(xié)議下,php-fpm成為了和PHP溝通的PHP解釋器。

3、nginx是如何和php-fpm進(jìn)程交流的

到目前為止,我們知道了實(shí)現(xiàn)了fastCGI的php-fpm是如何工作的,但是nginx是怎么啟動(dòng)php-fpm進(jìn)程的呢?

Nginx 不僅僅是一個(gè) Web 服務(wù)器,也是一個(gè)功能強(qiáng)大的 Proxy 服務(wù)器,除了進(jìn)行 http 請(qǐng)求的代理,也可以進(jìn)行許多其他協(xié)議請(qǐng)求的代理,包括本文與 fpm 相關(guān)的 fastcgi 協(xié)議。為了能夠使 Nginx 理解 fastcgi 協(xié)議,Nginx 提供了 fastcgi 模塊來將 http 請(qǐng)求映射為對(duì)應(yīng)的 fastcgi 請(qǐng)求。

下面是一個(gè)nginx的配置文件,用來把nginx中的變量,解釋為PHP能夠理解的變量:

下面是nginx把php請(qǐng)求交給fastCGI模塊來處理的配置(在nginx.conf中可以查到此項(xiàng)配置)

在這個(gè)配置文件中,我們新建了一個(gè)虛擬主機(jī),監(jiān)聽在 80 端口,Web 根目錄為 /home/rf/projects/wordpress。通過location配置,我們把所有.php文件的處理,交給了fastCGI模塊。之后就是fastCGI模塊啟動(dòng)php-fpm(實(shí)現(xiàn)fastCGI模塊),并通過php-fpm來解釋動(dòng)態(tài)請(qǐng)求。

下面是我總結(jié)的一個(gè)流程圖,如果有不正確的地方,歡迎指正。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,491評(píng)論 3 416
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,263評(píng)論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,708評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,186評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,409評(píng)論 0 288
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,939評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,774評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,976評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,209評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評(píng)論 1 286
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,650評(píng)論 3 391
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,958評(píng)論 2 373

推薦閱讀更多精彩內(nèi)容