location ~ \.php { root /nginx; fastcgi_pass 127.0.0.1:9000; //ip+port方式 ; fastcgi_pass unix:/tmp/php-cgi.sock;【unxi domain socket形式】 這種是進程之間的訪問,比tcp/ip的要快 fastcgi_index index.php; fastcgi_split_path_info ^(.+\.php)(.*)$; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; include /usr/local/etc/nginx/fastcgi.conf; } 從上面能夠看出來 ,nginx經過fastcgi_pass命令將請求轉發給fastcgi 即php-fpm; 當web server收到/index.php這個請求後,會啓動對應的CGI程序,這裏就是PHP的解析器。接下來PHP解析器會解析php.ini文件,(php-fpm 如何解析php.ini 文件的? 新版PHP已經集成php-fpm了,再也不是第三方的包了,推薦使用。 只須要在安裝的時候/configure --prefix=/usr/local/php --enable-fpm 開啓支持php-fpm就能夠了)初始化執行環境,而後處理請求,再以規定CGI規定的格式返回處理後的結果,退出進程。web server再把結果返回給瀏覽器。
CGI是爲了保證web server傳遞過來的數據是標準格式的,標準的CGI對每一個請求都會解析php.ini文件,初始化執行環境,因此處理每一個時間的時間會比較長。php
Fastcgi是用來提升CGI程序性能的,是CGI開放擴展,其主要行爲是將CGI解釋器進程保持在內存中並所以得到較高的性能。是優化版的cgi;fastcgi 是一個與平臺無關,與語言無關,任何語言只要按照它的接口來實現,就能實現本身語言的fastcgi能力和web server 通信。前端
首先,Fastcgi會先啓一個master,解析配置文件,初始化執行環境,而後再啓動多個worker。當請求過來時,master會傳遞給一個worker,而後當即能夠接受下一個請求。這樣就避免了重複的勞動,效率天然是高。並且當worker不夠用時,master能夠根據配置預先啓動幾個worker等着;固然空閒worker太多時,也會停掉一些,這樣就提升了性能,也節約了資源。這就是fastcgi的對進程的管理。當HTTP服務器遇到動態請求時,會將請求轉發給FastCGI進程,FastCGI進程執行動態腳本後再將結果返回給HTTP服務器,nginx
--------------------以上,fastcig ,cgi都是獨立於語言的;web
php-cgi 就是php的解釋器 php-cgi只是個CGI程序,php-cgi是php提供給web serve也就是http前端服務器的cgi協議接口程序,,他本身自己只能解析請求,返回結果,不會進程管理.因此就出現了一些可以調度php-cgi進程的程序,好比說由lighthttpd分離出來的spawn-fcgi。好了PHP-FPM也是這麼個東東,apache
php-fpm是一個實現了FastCGI(協議)的程序,php-fpm是php提供給web serve也就是http前端服務器的fastcgi協議接口程序,管理對象是php-cgi,PHP內核集成了PHP-FPM以後就方便多了,使用--enalbe-fpm這個編譯參數便可。
瀏覽器
整個過程 nginx接收php文件的請求後,經過fastcgi_pass命令將請求發送給php-fpm---php-cgi的進程管理器(在這中間,必須經過fastCGI進程管理器,是優化後的cgi,經過master主進程和work子進程,其實就是將請求的格式規範化),就是php-cgi的進程管理者,最後仍是有php-cgi去完成解析bash
瞭解apache如何調用php 請移步https://blog.csdn.net/u011280342/article/details/78121132服務器