php-fpm的pool
- 在LNMP架构中,php-fpm作为独立的一个服务。既然是独立服务,那么就必须拥有自己的配置文件。php-fpm的配置文件为/usr/local/php-fpm/etc/php-fpm.conf。
- nginx可以配置多个虚拟主机,php-fpm同样也支持配置多个pool,每一个pool可以监听一个端口,也可以监听一个socket。nginx有多个站点,每个站点都可以使用一个pool,这样的好处是当其中一个PHP出现502状态码(很有可能是php资源不够了),如果多个网站使用同一个池子,那么其中一个网站出现问题,会耗尽php的资源,导致其他的网站也会502。这样就很有必要使每一个网站单数使用一个pool。
- 设置多个pool,在php-fpm.conf中继续增加
定义第2个pool
- 检查语法是否正确,然后从重启或者reload
/usr/local/php-fpm/sbin/php-fpm -t
/etc/init.d/php-fpm reload
- 使用ps aux |grep php-fpm查看是否成功。
- pool的使用
在zcy.com.conf中配置成如下这样,就可以将2个站点隔离开
一个池子pool不干涉另一个池子pool 。 - 将php-fpm.conf中的2个pool拆分开2个子配置文件
1 . 在php-fpm.conf中[global]里面增加include = etc/php-fpm.d/*.conf
并删除下面的2个池子
2 . 创建这个php-fpm.d目录
mkdir /usr/local/php-fpm/etc/php-fpm.d
3 进入到php-fpm.d目录中创建www.conf 和zchuny.conf ,将之前php-fpm中删除的内容分别写入这2个文件中即可
[root@chunt php-fpm.d]# mv www.com www.conf
[root@chunt php-fpm.d]# mv zchuny.com zchuny.conf
[root@chunt php-fpm.d]#
这样就有2个子配置文件,也就是说有2个pool。这样可以在nginx不同的虚拟主机中调用不同的pool,从而达到相互隔离的目的。2个pool互不影响。
php-fpm慢执行日志
- 做php的网站,最好使用LNMP,其中原因在于可以分析php的慢执行日志。如果网站突然很卡,又找不到问题所在,那么可以通过php-fpm的慢执行日志,了解到php的脚本哪里执行时间长,它可以定位到具体的行
- 开启php-fmp慢执行日志。
- 在www.conf 中加入以下内容
request_slowlog_timeout = 1 //定义超时时间,既php的脚本执行时间超过1秒就会记录日志
slowlog = /usr/local/php-fpm/var/log/www-slow.log //定义慢执行日志的路径和名字
2 . 检查并重新加载
[root@chunt php-fpm.d]# /usr/local/php-fpm/sbin/php-fpm -t
[20-Mar-2018 01:05:04] NOTICE: configuration file /usr/local/php-fpm/etc/php-fpm.conf test is successful
[root@chunt php-fpm.d]# /etc/init.d/php-fpm reload
Reload service php-fpm done
[root@chunt php-fpm.d]#
3 . 查看日志是否生成
[root@chunt php-fpm.d]# ls /usr/local/php-fpm/var/log/
php-fpm.log www-slow.log
[root@chunt php-fpm.d]#
4 .写一个脚本用来模拟,因为www使用的是test的/tmp/php-fcig.sock。所以需要在/data/wwwroot/test.com目录中进行操作。
创建sleep.php,并写入以下内容
<?php echo "test slow log";sleep(2);echo "done"; ?>
5 .测试
[root@chunt php-fpm.d]# curl -x127.0.0.1:80 test.com/sleep.php -I
HTTP/1.1 200 OK
Server: nginx/1.12.2
Date: Mon, 19 Mar 2018 17:20:14 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.6.30
[root@chunt php-fpm.d]#
如果出现错误,可以打开/usr/local/php-fpm/etc/php.ini中的display_errors = off改为on ,这样就可以才浏览器中查看到错误所在。
6 . 查看日志
[root@chunt php-fpm.d]# cat /usr/local/php-fpm//var//log/www-slow.log
[20-Mar-2018 01:20:13] [pool www] pid 1966
script_filename = /data/wwwroot/test.com/sleep.php //哪个脚本慢
[0x00007fcb7eafe2e8] sleep() /data/wwwroot/test.com/sleep.php:1 //慢在第几行
[20-Mar-2018 01:26:54] [pool www] pid 1961
script_filename = /data/wwwroot/test.com/sleep.php
[0x00007fcb7eafe2e8] sleep() /data/wwwroot/test.com/sleep.php:1
[root@chunt php-fpm.d]#
注:很多额PHP监本执行时间介于1到2秒之间。
open_basedir
- 关于它的定义可以在php-fpm里面或者是zchuny.conf里面,当服务器上有多个网站,那么在php.ini中去定义就有些不太合适了。
- 配置过程
- 在zhuny.conf中最后加入以下内容
php_admin_value[open_basedir]=/data/wwwroot/zchuny.com:/tmp/
2 .测试
[root@chunt php-fpm.d]# curl -x127.0.0.1:80 test.com/3.php -I
HTTP/1.1 200 OK
Server: nginx/1.12.2
Date: Mon, 19 Mar 2018 18:03:47 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.6.30
这一小节没有看懂
php-fpm进程管理
- 含义
pm = dynamic //定义php-fpm子进程的启动模式。dynamic为动态模式;一开启只启动少量的子进程,根据实际需要,动态的增加或减少子进程,最少不超过pm.max_children定义的值。另一模式是static,这种模式下进程数由pm.max_children确定,一次性启动这么多,不会减少或者增加
pm.max_children = 50
pm.start_servers = 20 //针对dynamic模式,它定义php-fpm服务在启动服务时产生的子进程数量。
pm.min_spare_servers = 5 //针对dynamic模式 它定义在空闲时段的子进程的最少数量,如果达到这个数值时,php-fpm服务会自动派生新的子进程
pm.max_spare_servers = 35 //针对dynamic模式,它定义在空闲时段子进程数的最大值,如果高于这个数值就开始清理空闲的子进程
pm.max_requests = 500 //针对dynamic模式,定义一个子进程最多处理的请求数,也就是说在一个php-fpm的子进程中最多可以处理这么多请求,当达到这个数值时,它会自动退出。