php-fpm的pool、php-fpm慢执行日志、open_basedir、php-fpm进程管理
6月13日任务
12.21 php-fpm的pool
12.22 php-fpm慢执行日志
12.23 open_basedir
12.24 php-fpm进程管理
12.21 php-fpm的pool
php-fpm可以支持定义多个pool,分别监听不同的sock或IP和端口,比如Nginx有好几个站点,每一个站点都可以去使用一个pool,这样的好处是当其中一个php页面502了,这很有可能是资源不够了,如果所有的网站都使用了一个pool,其中一个网站发了一些故障,例如程序员写的程序有问题,就会把php资源耗尽,那么其他的站点也会502,所以有必要把每一个站点隔离开,每一个站点使用单独的pool。
添加多个pool的方法:
1、进入指定目录,编辑php-fpm.conf文件。
[root@jimmylinux-001 ~]# cd /usr/local/php-fpm/etc/ 进入指定目录
[root@jimmylinux-001 etc]# ls
pear.conf php-fpm.conf php-fpm.conf.default php.ini
[root@jimmylinux-001 etc]# vim php-fpm.conf 编辑配置文件
添加以下内容
[jimmy]
listen = /tmp/jimmy.sock
#listen = 127.0.0.1:9000
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
2、-t检查语法是否正确,然后重启php-fpm或者重新加载。
[root@jimmylinux-001 etc]# /usr/local/nginx/sbin/nginx -t 检查语法是否正确
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@jimmylinux-001 etc]# /etc/init.d/php-fpm reload 重新加载php-fpm
Reload service php-fpm done
[root@jimmylinux-001 etc]# ps aux |grep php-fpm 查看pool信息
3、如何去使用自定义的pool
[root@jimmylinux-001 etc]# cd /usr/local/nginx/conf/vhost/
[root@jimmylinux-001 vhost]# ls
aaa.com.conf ld.conf proxy.conf ssl.conf test.com.conf
[root@jimmylinux-001 vhost]# vim test.com.conf 可以把test.com.conf定义成php-fcgi.sock
[root@jimmylinux-001 vhost]# vim aaa.com.conf 再把aaa.com.conf定义成jimmy.sock
假如现在test.com.conf请求量很大,最终把php-fpm(www的pool进程耗尽了)最多可以启动50个,当50个启动完后所有的都在忙,又有新的请求来的时候就会把502,因为没有多的php-fpm进程提供服务了,而另外的站点不受影响,因为使用的是另外的pool,这就是为什么要定义多个pool的原因。
在Nginx.conf里面加了一条include,那php-fpm也是同样支持加include的。
[root@jimmylinux-001 vhost]# cd /usr/local/php-fpm/etc/
[root@jimmylinux-001 etc]# ls
pear.conf php-fpm.conf php-fpm.conf.default php.ini
[root@jimmylinux-001 etc]# vim php-fpm.conf 在php-fpm.conf 主配置文件中也同样支持添加include
在global里面加入include,其他的内容都删除掉。
创建目录,然后新建配置文件。
[root@jimmylinux-001 etc]# mkdir php-fpm.d 创建目录
[root@jimmylinux-001 etc]# cd php-fpm.d
[root@jimmylinux-001 php-fpm.d]# vim www.conf 新建配置文件
添加以下内容
[www]
listen = /tmp/php-fcgi.sock
#listen = 127.0.0.1:9000
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
[root@jimmylinux-001 php-fpm.d]# vim jimmy.conf 重新创建另一个配置文件
添加以下内容
[jimmy]
listen = /tmp/jimmy.sock
#listen = 127.0.0.1:9000
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
-t检查语法是否正确,然后重启php-fpm。
[root@jimmylinux-001 php-fpm.d]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@jimmylinux-001 php-fpm.d]# /etc/init.d/php-fpm restart
Gracefully shutting down php-fpm . done
Starting php-fpm done
12.22 php-fpm慢执行日志
做PHP网站,建议使用LNMP,其中有一个原因就是可以去分析php-fpm慢执行日志,比如网站访问慢,具体什么原因到底慢在什么地方,所以慢执行日志是非常有用的。
1、进入指定目录,编辑www.conf配置文件。
[root@jimmylinux-001 ~]# cd /usr/local/php-fpm/etc/php-fpm.d/
[root@jimmylinux-001 php-fpm.d]# vim www.conf
在配置文件最后加入以下2行内容
request_slowlog_timeout = 1 表示时间只要超过1秒的都记录
slowlog = /usr/local/php-fpm/var/log/www-slow.log 记录日志存放路径
2、重新加载php-fpm,然后查看日志文件路径。
3、模拟一个慢执行的php
如果遇到500报错,可以把php.ini配置文件中display_errors报告设置成on显示错误信息。
[root@jimmylinux-001 php-fpm.d]# vi /usr/local/php-fpm/etc/php.ini
把sleep.php配置文件中的标点符号全部改成半角的英文状态符合就可以了
[root@jimmylinux-001 php-fpm.d]# vim /data/wwwroot/test.com/sleep.php
<?php
echo "test slow log";
sleep(2);
echo "done";
?>
4、重新执行curl就会看见执行过程中会有停顿
12.23 open_basedir
在php-fpm里面也可以定义open_basedir,之前讲过在php.ini定义open_basedir,如果服务器上有多个网站,在php.ini里面定义就不合适了,要么在Apache虚拟主机配置文件里面定义,要么就在php-fpm配置文件里面定义,我们可以针对每一个pool去定义不同的open_basedir。
1、编辑www.conf配置文件
[root@jimmylinux-001 php-fpm.d]# vim www.conf
在最后一行加入以下内容
php_admin_value[open_basedir]=/data/wwwroot/jimmy.com:/tmp/
2、重启php-fpm,然后curl访问,如果出现如下报错,可以分析并解决。
[root@jimmylinux-001 php-fpm.d]# ls /data/wwwroot/test.com/
1.gif 2.js 3.php admin index.html sleep.php upload
[root@jimmylinux-001 php-fpm.d]# curl -x127.0.0.1:80 test.com/3.php
No input file specified. 主要是因为open_basedir做了限制,所以会报错。
[root@jimmylinux-001 php-fpm.d]# vim www.conf 重新编辑配置文件
修改最后一行为正确的路径test.com
php_admin_value[open_basedir]=/data/wwwroot/test.com:/tmp/
3、再次重启php-fpm,然后访问就正常了。
[root@jimmylinux-001 php-fpm.d]# /etc/init.d/php-fpm restart
如上操作,如果open_basedir定义不对,就会出问题。
生成环境中的服务器,php.ini的display_errors一定要设置成Off,不能够把错误信息显示到网站上来,而是把错误信息记录到日志存放到服务器指定的路径。
还要定义错误级别
在重启php-fpm之前,我们再故意改成一个错的路径。
[root@jimmylinux-001 php-fpm.d]# vim www.conf
php_admin_value[open_basedir]=/data/wwwroot/11test.com:/tmp/ 故意把路径写错
[root@jimmylinux-001 php-fpm.d]# touch /usr/local/php-fpm/var/log/php_errors.log 创建一个错误日志文件
[root@jimmylinux-001 php-fpm.d]# chmod 777 /usr/local/php-fpm/var/log/php_errors.log 设置成777权限
重启php-fpm,再访问看看结果。
查看日志
[root@jimmylinux-001 php-fpm.d]# vim www.conf
php_admin_value[open_basedir]=/data/wwwroot/test.com:/tmp/ 修改成正确路径
这个时候重启php-fpm,再访问就正常了。
12.24 php-fpm进程管理