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服务器