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
再来查看下进程
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
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 的子进程最多可以处理这么多请求, 当达到这个数值时, 它会自动退出.
来源: http://www.bubuko.com/infodetail-2585117.html