深入理解PHP之:Nginx 與 FPM 的工作機(jī)制


著作權(quán)歸作者所有。

商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)糠溜,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處淳玩。

作者:仁風(fēng)H

鏈接:http://zhuanlan.zhihu.com/p/20694204

來源:知乎

網(wǎng)絡(luò)上有很多關(guān)于如何配置 Nginx + FPM 的文章,但它們更多從操作的角度出發(fā)非竿,告訴我們?cè)趺醋鐾勺牛珔s沒有告訴我們?yōu)槭裁匆@么做,本文從 Nginx 與 FPM 的工作機(jī)制出發(fā),探討配置背后的原理承匣,讓我們真正理解 Nginx 與 PHP 是如何協(xié)同工作的蓖乘。

要說 Nginx 與 PHP 是如何協(xié)同工作的,首先得說 CGI (Common Gateway Interface) 和 FastCGI 這兩個(gè)協(xié)議韧骗。

CGI 是 Web Server 與后臺(tái)語言交互的協(xié)議嘉抒,有了這個(gè)協(xié)議,開發(fā)者可以使用任何語言處理 Web Server 發(fā)來的請(qǐng)求袍暴,動(dòng)態(tài)的生成內(nèi)容些侍。但 CGI 有一個(gè)致命的缺點(diǎn),那就是每處理一個(gè)請(qǐng)求都需要 fork 一個(gè)全新的進(jìn)程政模,隨著 Web 的興起岗宣,高并發(fā)越來越成為常態(tài),這樣低效的方式明顯不能滿足需求淋样。就這樣耗式,F(xiàn)astCGI 誕生了,CGI 很快就退出了歷史的舞臺(tái)趁猴。FastCGI刊咳,顧名思義為更快的 CGI,它允許在一個(gè)進(jìn)程內(nèi)處理多個(gè)請(qǐng)求躲叼,而不是一個(gè)請(qǐng)求處理完畢就直接結(jié)束進(jìn)程,性能上有了很大的提高企巢。

至于 FPM (FastCGI Process Manager)枫慷,它是 FastCGI 的實(shí)現(xiàn),任何實(shí)現(xiàn)了 FastCGI 協(xié)議的 Web Server 都能夠與之通信浪规。FPM 之于標(biāo)準(zhǔn)的 FastCGI或听,也提供了一些增強(qiáng)功能,具體可以參考官方文檔:PHP: FPM Installation笋婿。

FPM 是一個(gè) PHP 進(jìn)程管理器誉裆,包含 master 進(jìn)程和 worker 進(jìn)程兩種進(jìn)程:master 進(jìn)程只有一個(gè),負(fù)責(zé)監(jiān)聽端口缸濒,接收來自 Web Server 的請(qǐng)求足丢,而 worker 進(jìn)程則一般有多個(gè) (具體數(shù)量根據(jù)實(shí)際需要配置),每個(gè)進(jìn)程內(nèi)部都嵌入了一個(gè) PHP 解釋器庇配,是 PHP 代碼真正執(zhí)行的地方斩跌,下圖是我本機(jī)上 fpm 的進(jìn)程情況,1一個(gè) master 進(jìn)程捞慌,3個(gè) worker 進(jìn)程:

從 FPM 接收到請(qǐng)求耀鸦,到處理完畢,其具體的流程如下:

FPM 的 master 進(jìn)程接收到請(qǐng)求

master 進(jìn)程根據(jù)配置指派特定的 worker 進(jìn)程進(jìn)行請(qǐng)求處理啸澡,如果沒有可用進(jìn)程袖订,返回錯(cuò)誤氮帐,這也是我們配合 Nginx 遇到502錯(cuò)誤比較多的原因。

worker 進(jìn)程處理請(qǐng)求洛姑,如果超時(shí)上沐,返回504錯(cuò)誤

請(qǐng)求處理結(jié)束,返回結(jié)果

FPM 從接收到處理請(qǐng)求的流程就是這樣了吏口,那么 Nginx 又是如何發(fā)送請(qǐng)求給 fpm 的呢奄容?這就需要從 Nginx 層面來說明了。

我們知道产徊,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)求塘娶。

Nginx 的 fastcgi 模塊提供了 fastcgi_param 指令來主要處理這些映射關(guān)系,下面 Ubuntu 下 Nginx 的一個(gè)配置文件痊夭,其主要完成的工作是將 Nginx 中的變量翻譯成 PHP 中能夠理解的變量刁岸。

除此之外,非常重要的就是 fastcgi_pass 指令了她我,這個(gè)指令用于指定 fpm 進(jìn)程監(jiān)聽的地址虹曙,Nginx 會(huì)把所有的 php 請(qǐng)求翻譯成 fastcgi 請(qǐng)求之后再發(fā)送到這個(gè)地址。下面一個(gè)簡單的可以工作的 Nginx 配置文件:

在這個(gè)配置文件中番舆,我們新建了一個(gè)虛擬主機(jī)酝碳,監(jiān)聽在 80 端口,Web 根目錄為 /home/rf/projects/wordpress恨狈。然后我們通過 location 指令疏哗,將所有的以 .php 結(jié)尾的請(qǐng)求都交給 fastcgi 模塊處理,從而把所有的 php 請(qǐng)求都交給了 fpm 處理禾怠,從而完成 Nginx 到 fpm 的閉環(huán)返奉。

如此以來女器,Nginx 與 FPM 通信的整個(gè)流程應(yīng)該比較清晰了吧侍咱。

以上

2016年4月2日

北京

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市末患,隨后出現(xiàn)的幾起案子牲证,更是在濱河造成了極大的恐慌哮针,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異十厢,居然都是意外死亡等太,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門蛮放,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缩抡,“玉大人,你說我怎么就攤上這事包颁≌跋耄” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵娩嚼,是天一觀的道長蘑险。 經(jīng)常有香客問我,道長岳悟,這世上最難降的妖魔是什么佃迄? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮贵少,結(jié)果婚禮上呵俏,老公的妹妹穿的比我還像新娘。我一直安慰自己滔灶,他們只是感情好普碎,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著录平,像睡著了一般麻车。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上萄涯,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天绪氛,我揣著相機(jī)與錄音唆鸡,去河邊找鬼涝影。 笑死,一個(gè)胖子當(dāng)著我的面吹牛争占,可吹牛的內(nèi)容都是我干的燃逻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼臂痕,長吁一口氣:“原來是場噩夢啊……” “哼伯襟!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起握童,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤姆怪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體稽揭,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡俺附,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了溪掀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片事镣。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖揪胃,靈堂內(nèi)的尸體忽然破棺而出璃哟,到底是詐尸還是另有隱情,我是刑警寧澤喊递,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布随闪,位于F島的核電站,受9級(jí)特大地震影響册舞,放射性物質(zhì)發(fā)生泄漏蕴掏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一调鲸、第九天 我趴在偏房一處隱蔽的房頂上張望盛杰。 院中可真熱鬧,春花似錦藐石、人聲如沸即供。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逗嫡。三九已至,卻和暖如春株依,著一層夾襖步出監(jiān)牢的瞬間驱证,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國打工恋腕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留抹锄,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓荠藤,卻偏偏與公主長得像伙单,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子哈肖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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