原文 http://blog.100dos.com/http-server-how-nginx-php-work/
Nginx (“engine x”) 是一個高性能的 HTTP 和 反向代理 服務器,也是一個 IMAP/POP3/SMTP 代理服務器。 Nginx 是由 Igor Sysoev 為俄羅斯訪問量第二的 Rambler.ru 站點開發的,第一個公開版本0.1.0發布于2004年10月4日。其將源代碼以類BSD許可證的形式發布,因它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名。— 百度百科
當nginx接收到一個http請求時,通過配置文件找到對應的server。然后匹配server中的所有location,找到最匹配的。而在location中的命令會啟動不同的模塊去完成工作,比如rewrite模塊、index模塊。因此在nginx中模塊可以看作真正的勞動工作者。nginx的模塊是被編譯到nginx中的,屬于靜態方式。啟動nginx時,模塊被自動加載。不像apache,把模塊單獨編譯成so文件,在配置文件中指定是否加載。所以,單比模塊加載方面,nginx也比apache速度上有提升。
那nginx是怎么調用php的呢?先看下面的nginx中關于php的配置
location ~ \.php$ {
root /webpath;
fastcgi_pass 127.0.0.1:9000;
…
...
}
這個location指令把以php為文件后綴的請求,交給127.0.0.1:9000處理。我想你看到這個應該猜到了,這是一個C/S架構東西。 而這里的IP地址和端口(127.0.0.1:9000)就是fastcgi進程監聽的IP地址和端口。fastcgi是一個可伸縮地、高速地在http server和動態腳本語言間通信的接口。多數流行的http server都支持fastcgi,包括apache、nginx和lighttpd等。同時,fastcgi也被許多腳本語言支持,其中就有php。
那這個fastcgi的配置IP和端口從何而來呢?在php-fpm.conf中可以看到如下:
listen = 127.0.0.1:9000 #這個表示php的fastcgi進程監聽的ip地址以及端口
pm.start_servers = 2
php-fpm作為fastcgi的進程管理器,可以有效控制內存和進程,并且平滑重載php配置。php5.3以后,php-fpm被集成到php的core中,默認安裝,無須配置。
fastcgi進程管理器php-fpm自身初始化,啟動主進程php-fpm和啟動start_servers個fastcgi子進程。主進程php-fpm主要是管理fastcgi子進程,監聽9000端口,fastcgi子進程等待請求。當客戶端請求到達nginx時,nginx通過location指令,將所有以php為后綴的文件都交給 127.0.0.1:9000 來處理。php-fpm選擇并連接到一個fastcgi子進程,并將環境變量和標準輸入發送到fastcgi子進程。fastcgi子進程完成處理后將標準輸出和錯誤信息返回。當fastcgi子進程關閉連接時,請求便告處理完成,等待下次處理。