網(wǎng)絡(luò)上有很多關(guān)于如何配置 Nginx + FPM 的文章,但它們更多從操作的角度出發(fā),告訴我們?cè)趺醋?,但卻沒(méi)有告訴我們?yōu)槭裁匆@么做,本文從 Nginx 與 FPM 的工作機(jī)制出發(fā),探討配置背后的原理,讓我們真正理解 Nginx 與 PHP 是如何協(xié)同工作的。
要說(shuō) Nginx 與 PHP 是如何協(xié)同工作的,首先得說(shuō) CGI (Common Gateway Interface) 和 FastCGI 這兩個(gè)協(xié)議。
CGI 是 Web Server 與后臺(tái)語(yǔ)言交互的協(xié)議,有了這個(gè)協(xié)議,開(kāi)發(fā)者可以使用任何語(yǔ)言處理 Web Server 發(fā)來(lái)的請(qǐng)求,動(dòng)態(tài)的生成內(nèi)容。但 CGI 有一個(gè)致命的缺點(diǎn),那就是每處理一個(gè)請(qǐng)求都需要 fork 一個(gè)全新的進(jìn)程,隨著 Web 的興起,高并發(fā)越來(lái)越成為常態(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)聽(tīng)端口,接收來(lái)自 Web Server 的請(qǐng)求,而 worker 進(jìn)程則一般有多個(gè) (具體數(shù)量根據(jù)實(shí)際需要配置),每個(gè)進(jìn)程內(nèi)部都嵌入了一個(gè) PHP 解釋器,是 PHP 代碼真正執(zhí)行的地方