1 php-fpm的进程pool

之前我们在nginx 配置文件里加入了一句 include vhost/*.conf; 然后实现了各个虚拟主机的隔离,php-fpm 作为一个独立的服务,有没有类似的操作呢? 答案是肯定的。这里我们介绍一个php-fpm的 进程pool概念。pool 在lnmp架构,是分配出来解析php的进程资源集合。php-fpm可以设置多个pool,在其中一个pool资源耗尽,会导致其他站点无法访问资源,报502错误。有必要把站点进行分离,分别使用单独的pool。我们可以在php-fpm.conf 中定义include,进而定义单独的pool。具体过程如下:
vim /usr/local/php-fpm/etc/php-fpm.conf 更改内容如下

[global]
pid = /usr/local/php-fpm/var/run/php-fpm.pid
error_log = /usr/local/php-fpm/var/log/php-fpm.log
include = etc/php-fpm.d/*.conf

cd /usr/local/php-fpm/etc/
mkdir php-fpm.d
cd php-fpm.d/
vim www.conf //写入内容如下,添加第一个pool

[www]
listen = /tmp/www.sock
listen.mode = 666
user = php-fpm
group = php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024

保存后 再编辑另外的配置文件,再创建一个pool
vim test.conf

[test]
listen = /tmp/test.sock
listen.mode = 666
user = php-fpm
group = php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024

这样有了两个子配置文件,也就是创建了两个pool了,两个pool监听了不同的socket,我们就可以在虚拟主机配置文件中给不同的虚拟主机定义不同的pool,从而达到互相隔离的目的。

测试下配置
/usr/local/php-fpm/sbin/php-fpm -t
重启下服务
/etc/init.d/php-fpm restart
查看下/tmp/下的sock文件:
ls /tmp/*.sock
Linux学习总结(四十四)lnmp之php-fpm相关配置
再来查看下进程
ps aux |grep php-fpm
发现出现了www和test 两个pool

2php-fpm慢执行日志

如果一个php网站可以访问,就是访问速度变慢了,我们如何进一步去查找原因呢?有没有办法追踪到导致php解析变慢的细节,这里就涉及到php-fpm的慢执行日志。通过php-fpm的慢执行日志,我们可以清晰的了解到php的脚本哪里执行时间长,它可以定位到具体的代码行。如何开启和查看该日志,具体操作如下:
vim /usr/local/php-fpm/etc/php-fpm.d/www.conf
在最后面加入如下内容

request_slowlog_timeout = 1
slowlog = /usr/local/php-fpm/var/log/www-slow.log

第一行定义了超时时间,单位为秒,也就是当php脚本执行时间超过1秒就会记录日志
第二行定义该日志的路径和名称
我们编写一个php脚本测试

 vim /data/wwwroot/test.com/slow.php
<?php
echo "just a slow running test";
sleep (3);
?>
curl -x127.0.0.1:80 test.com/slow.php

发现光标停顿了几秒才输出了just a slow running test
我们去查看下慢执行日志
cat /usr/local/php-fpm/var/log/www-slow.log
Linux学习总结(四十四)lnmp之php-fpm相关配置

3open_basedir

之前在lamp中已经接触到该概念。配置它的目的就是为了网站安全。httpd可以针对每个虚拟主机设置一个open_basedir,php-fpm同样也可以针对不同的pool设置不同的open_basedir

vim /usr/local/php-fpm/etc/php-fpm.d/test.conf  //在最后面加入
php_admin_value[open_basedir] = /data/wwwroot/test.com:/tmp/

4php-fpm 错误日志

在lamp中我们给php单独定义过错误日志,我们在/usr/local/php-fpm/etc/php.ini中关闭错误信息的页面显示,定义错误日志路径和名称,定义日志级别。因为该配置文件与lamp中配置文件相同,都来源于php源码包中的php.ini-production文件,所以各配置与之前的相同。这里不再赘述。

5php-fpm 进程管理

下面我们介绍下php-fpm.conf中一段配置的含义

 pm = dynamic  //动态进程管理,也可以是static,静态一次性启动最大子进程数,不会变化。
 pm.max_children = 50 //最大子进程数,ps aux可以查看
 pm.start_servers = 20 //启动服务时会启动的进程数
 pm.min_spare_servers = 5 //定义在空闲时段,子进程数的最少数量,如果达到这个数值时,php-fpm服务会自动派生新的子进程。
 pm.max_spare_servers = 35 //定义在空闲时段,子进程数的最大值,如果高于这个数值就开始清理空闲的子进程。
 pm.max_requests = 500  //定义一个子进程最多处理的请求数,也就是说在一个php-fpm的子进程最多可以处理这么多请求,当达到这个数值时,它会自动退出。