前言
nginx本身不能处理PHP,它只是个web服务器,当接收到请求后,如果是php请求,则发给php解释器处理,并把结果返回客户端。 nginx一般是把请求发fastcgi管理进程处理,fascgi管理进程选择cgi子进程处理结果并返回被nginx。
非常详细的解释参考链接:
segmentfault.com/q/101000000…
segmentfault.com/a/119000000…
什么是PHP-FPM
PHP-FPM是一个PHP FastCGI管理器,是只用于PHP的,可以在 php-fpm.org/download下载得…
PHP-FPM原本是PHP源代码的一个补丁,旨在将FastCGI进程管理整合进PHP包中。必须将它patch到你的PHP源代码中,在编译安装PHP后才可以使用。
新版PHP已经集成php-fpm了,不再是第三方的包了。PHP-FPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置,比spawn-fcgi具有更多优点,所以被PHP官方收录了。在./configure的时候带–enable-fpm参数即可开启PHP-FPM。
PHP FastCGI进程管理器PHP-FPM的架构
一个master进程,支持多个pool,每个pool由master进程监听不同的端口,pool中有多个worker进程。
每个worker进程都内置PHP解释器,并且进程常驻后台,支持prefork动态增加。
每个worker进程支持在运行时编译脚本并在内存中缓存生成的opcode来提升性能。
每个worker进程支持配置响应指定请求数后自动重启,master进程会重启挂掉的worker进程。
每个worker进程能保持一个到MySQL/Memcached/Redis的持久连接,实现"连接池",避免重复建立连接,对程序透明。
如果worker进程不够用,master进程会prefork更多进程, 如果prefork达到了pm.max_children上限,worker进程又全都繁忙, 这时master进程会把请求挂起到连接队列backlog里(默认值是511).
工作原理,参考:www.stelin.me/2017/06/09/…
fpm全名是FastCGI进程管理器,fpm启动后会先读php.ini,然后再读相应的conf配置文件,conf配置可以覆盖php.ini的配置。 启动fpm之后,会创建一个master进程,监听9000端口(可配置),master进程又会根据fpm.conf/www.conf去创建若干子进程,子进程用于处理实际的业务。 当有客户端(比如nginx)来连接9000端口时,空闲子进程会自己去accept,如果子进程全部处于忙碌状态,新进的待accept的连接会被master放进队列里,等待fpm子进程空闲;这个存放待accept的半连接的队列有多长,由listen.backlog配置。
三种工作模式
php-fpm(FastCGI 进程管理器)用于替换 PHP FastCGI 的大部分附加功能,对于高负载网站非常有用。php-fpm进程管理一共有三种模式:ondemand、static、dynamic(静态池、服务优先、内存优先),我们可以在同一个fpm的master配置三种模式。
php-fpm的工作模式和nginx类似,都是一个master,多个worker模型。每个worker都在accept本机pool内的监听套接字。