原文 http://blog.100dos.com/http-server-how-nginx-php-work/
Nginx (“engine x”) 是一個(gè)高性能的 HTTP 和 反向代理 服務(wù)器,也是一個(gè) IMAP/POP3/SMTP 代理服務(wù)器憋他。 Nginx 是由 Igor Sysoev 為俄羅斯訪問(wèn)量第二的 Rambler.ru 站點(diǎn)開(kāi)發(fā)的进陡,第一個(gè)公開(kāi)版本0.1.0發(fā)布于2004年10月4日。其將源代碼以類BSD許可證的形式發(fā)布萝衩,因它的穩(wěn)定性回挽、豐富的功能集、示例配置文件和低系統(tǒng)資源的消耗而聞名猩谊∏— 百度百科
當(dāng)nginx接收到一個(gè)http請(qǐng)求時(shí),通過(guò)配置文件找到對(duì)應(yīng)的server牌捷。然后匹配server中的所有l(wèi)ocation墙牌,找到最匹配的涡驮。而在location中的命令會(huì)啟動(dòng)不同的模塊去完成工作,比如rewrite模塊喜滨、index模塊捉捅。因此在nginx中模塊可以看作真正的勞動(dòng)工作者。nginx的模塊是被編譯到nginx中的虽风,屬于靜態(tài)方式棒口。啟動(dòng)nginx時(shí),模塊被自動(dòng)加載辜膝。不像apache无牵,把模塊單獨(dú)編譯成so文件,在配置文件中指定是否加載内舟。所以合敦,單比模塊加載方面,nginx也比apache速度上有提升验游。
那nginx是怎么調(diào)用php的呢充岛?先看下面的nginx中關(guān)于php的配置
location ~ \.php$ {
root /webpath;
fastcgi_pass 127.0.0.1:9000;
…
...
}
這個(gè)location指令把以php為文件后綴的請(qǐng)求,交給127.0.0.1:9000處理耕蝉。我想你看到這個(gè)應(yīng)該猜到了崔梗,這是一個(gè)C/S架構(gòu)東西。 而這里的IP地址和端口(127.0.0.1:9000)就是fastcgi進(jìn)程監(jiān)聽(tīng)的IP地址和端口垒在。fastcgi是一個(gè)可伸縮地蒜魄、高速地在http server和動(dòng)態(tài)腳本語(yǔ)言間通信的接口。多數(shù)流行的http server都支持fastcgi场躯,包括apache谈为、nginx和lighttpd等。同時(shí)踢关,fastcgi也被許多腳本語(yǔ)言支持伞鲫,其中就有php。
那這個(gè)fastcgi的配置IP和端口從何而來(lái)呢签舞?在php-fpm.conf中可以看到如下:
listen = 127.0.0.1:9000 #這個(gè)表示php的fastcgi進(jìn)程監(jiān)聽(tīng)的ip地址以及端口
pm.start_servers = 2
php-fpm作為fastcgi的進(jìn)程管理器秕脓,可以有效控制內(nèi)存和進(jìn)程,并且平滑重載php配置儒搭。php5.3以后吠架,php-fpm被集成到php的core中,默認(rèn)安裝搂鲫,無(wú)須配置傍药。
fastcgi進(jìn)程管理器php-fpm自身初始化,啟動(dòng)主進(jìn)程php-fpm和啟動(dòng)start_servers個(gè)fastcgi子進(jìn)程。主進(jìn)程php-fpm主要是管理fastcgi子進(jìn)程怔檩,監(jiān)聽(tīng)9000端口褪秀,fastcgi子進(jìn)程等待請(qǐng)求。當(dāng)客戶端請(qǐng)求到達(dá)nginx時(shí)薛训,nginx通過(guò)location指令媒吗,將所有以php為后綴的文件都交給 127.0.0.1:9000 來(lái)處理。php-fpm選擇并連接到一個(gè)fastcgi子進(jìn)程乙埃,并將環(huán)境變量和標(biāo)準(zhǔn)輸入發(fā)送到fastcgi子進(jìn)程闸英。fastcgi子進(jìn)程完成處理后將標(biāo)準(zhǔn)輸出和錯(cuò)誤信息返回。當(dāng)fastcgi子進(jìn)程關(guān)閉連接時(shí)介袜,請(qǐng)求便告處理完成甫何,等待下次處理。