一 php-fpm的pool
pool叫做池子,比如下图中的www就是一个池子,目前在php-fpm中只定义了这一个pool,其实php-fpm是支持定义多个pool的,每一个池子可以监听不同的socket或者IP+端口,比如nginx有多个站点,那么每一个站点就可以使用一个pool,这样做的好处是,当其中一个php出现502了,502很有可能是php资源不够了,如果所有的网站使用的是同一个pool,那么其中一个网站发生了一些故障,比如一些程序员写的程序有问题,它就会把php资源耗尽,那这样就会造成一个结果是其他的站点也会502,所有我们有必要把每一个站点隔离开来,每一个站点使用单独的pool
如何写多个pool呢,php里面可以在配置文件中继续增加pool
1、编辑配置文件
# vi /usr/local/php-fpm/etc/php-fpm.conf
我们在配置文件中新增一个池子lijie.com
[lijie.com]
listen = /tmp/lijie.sock
#listen = 127.0.0.1:9000
listen.mode = 666
user = php-fpm
group = php-fpm
#listen.owner = nobody
#listen.group = nobody
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、检查语法错误
# /usr/local/php-fpm/sbin/php-fpm -t
3、重新加载php-fpm服务
# /etc/init.d/php-fpm reload
4、查看新增pool是否生效
# ps aux |grep pool //下图可以看到pool中已经存在lijie.com了
5、pool的使用
如果想给网站aaa.com配置上面新增的pool,可以在网站对应的nginx虚拟主机配置文件/usr/local/nginx/conf/vhost/aaa.com.conf中做如下配置:
上面的配置中要求监听的路径(socket或者IP)与在php-fpm.conf中配置的pool监听的路径一致
配置完成后,就实现了test.com请求的是www这个pool,aaa.com请求的是lijie.com这个pool,这时候假如test.com的请求量很大,把php-fpm的进程耗尽了,最大可以请求50个,结果当50个已经请求完,这时test.com又有新的请求来的时候,结果就会报502,因为它没有多余的php进程再来提供服务了,此时呢 aaa.com这个站点不受影响,因为它用到的pool是另外一个
6、include vhost/*.conf
在nginx.conf中我们支持include vhost/*.conf的写法来将不同虚拟主机的配置文件分开写在不同的文件中,同样的在php-fpm中也支持这种写法,这样写了后,可以将不同的pool分开写在不同的文件中
首先创建一个目录用于存放所有的pool
# mkdir /usr/local/php-fpm/etc/php-fpm.d
然后在/usr/local/php-fpm/etc/php-fpm.conf 的[global]中加入以下语句:
include = etc/php-fpm.d/*.conf
同时,将原来的两个pool分别写入到两个新建的文件中,并将这两个文件放到/usr/local/php-fpm/etc/php-fpm.d/目录下,
修改后的结果如下:
1)php-fpm.conf中的内容如下:
2)php-fpm.d目录下的文件有以下两个:
3)其中www.conf中的内容如下:
4)lijie.conf中的内容如下:
二 php-fpm慢执行日志
这个慢执行日志非常有用。建议使用LNMP的原因之一是我们可以分析php-fpm的慢执行日志。我们在运维工作中,经常会遇到一个问题,老板或者客户反映网站慢了,要想知道网站慢的原因,先不说java网站,php的网站是有办法查网站慢在哪里,像系统负载高,我们可以用各种工具,如vmstat、iostat、stop等,就能找到是哪个进程导致它负载高,而在这里分析网站慢,是要找出证据证明慢在哪里的,下面我们来给LNMP配置慢执行日志
1、编辑php-fpm的配置文件
# vi /usr/local/php-fpm/etc/php-fpm.d/www.conf
在上面文件中加入以下内容:
request_slowlog_timeout=1 //超过1秒就记录日志
slowlog = /usr/local/php-fpm/var/log/www-slow.log //定义日志存放路径
2、检查php-fpm配置文件语法错误及重新加载配置文件
# /usr/local/php-fpm/sbin/php-fpm -t
# /etc/init.d/php-fpm reload
3、查看日志文件是否生成
# ls /usr/local/php-fpm/var/log/
上图表示日志文件已经生成
4、查看日志文件内容
# cat /usr/local/php-fpm/var/log/www-slow.log
可以看到目前日志文件中还没有内容
5、模拟慢执行网站的日志
我们先来写一个脚本,www.conf这个pool配置文件是由test.com这个网站使用的,所以我们在这个网站的目录/data/wwwroot/test.com/下创建一个脚本文件sleep.php
# vim /data/wwwroot/test.com/sleep.php
在这个脚本文件中加入以下内容:
<?php echo
"test slow log";
sleep(2);
echo "done";
?>
6、测试验证
访问test.com/sleep.php,可以发现在执行的过程中停顿了一会后,出现了下图的结果:
# curl -x127.0.0.1:80 test.com/sleep.php
排障技巧:如果上面的访问出现问题,一般可以查看错误日志,但我们也可以在php.ini配置文件中设置display_error = on,意思是返回错误信息给用户浏览器
7、查看慢日志log
# cat /usr/local/php-fpm/var/log/www-slow.log
上图可以看到日志内容提示网站sleep.php文件的第3行慢,接下来我们来查看这个文件的第三行内容
# cat /data/wwwroot/test.com/sleep.php
这里是因为我们这个文件第三行执行的是休眠2秒,而我们php-fpm配置文件中设定执行超过1秒则会记录到日志中,因此这里就被记录下来了,在实际工作中,由于一些代码框架的原因,代码执行超过1秒的还是比较多,因此我们最好将超时时间设置为2秒
三 open_basedir
open_basedir 的作用是限制php在指定的目录里活动。前面学习的是在php.ini中去定义open_basedir,如果服务器有多个网站,再在php.ini中去定义就不合适了,所有要么在apache虚拟主机配置文件中定义,要么在php-fpm配置文件中定义,我们可以针对每一个池子去配置open_basedir,下面我们用第二种方式展开
1、编辑test.com网站的pool配置文件
# vim /usr/local/php-fpm/etc/php-fpm.d/www.conf
在上面的配置文件中加入以下内容:
php_admin_value[open_basedir]=/data/wwwroot/test.com:/tmp/
2、重新加载配置文件
# /usr/local/php-fpm/sbin/php-fpm -t
# /etc/init.d/php-fpm reload
3、测试验证
# curl -x127.0.0.1:80 test.com/3.php //测试出现如下错误
# curl -x127.0.0.1:80 test.com/3.php -I //结果报404
4、查看错误日志
1)首先需要在php.ini配置文件中打开记录错误日志的开关,下面来编辑配置文件
# vim /usr/local/php-fpm/etc/php.ini
我们先查找到display_error = Off (正常情况下是需要将显示错误信息的开关off掉,不能让别人在浏览器看到错误信息)
然后查找到log_errors,设置记录错误日志的值log_errors=on
再查找error_log,设置错误日志的记录位置error_log=/usr/local/php-fpm/var/log/php_errors.log
还有一个error_report,设置日志级别为E_ALL
2)创建错误日志文件的路径
# touch /usr/local/php-fpm/var/log/php_errors.log
3)再次curl
# curl -x127.0.0.1:80 test.com/3.php //此时执行这条命令后错误日志就会记录对应的错误信息
4)查看错误信息
# cat /usr/local/php-fpm/var/log/php_errors.log //错误信息如下
上图错误信息提示路径未知
5、根据错误提示修改对应文档
从上面的提示可以知道是open_basedir的路径有问题,我们来查看www这个pool配置文件
# vim /usr/local/php-fpm/etc/php-fpm.d/www.conf
上图可以看到我们路径确实写错误了,正确的应为下图的路径
6、修改完成后,重新加载配置文件,再来执行命令
# curl -x127.0.0.1:80 test.com/3.php -I //访问成功 200 OK
四 php-fpm进程管理
php配置文件中有一段内容如下:
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
1、pm = dynamic
这一段用于表示进程以什么样的形式启动,其中dynamic就是动态,动态就是比如我可以让它一开始先启动20个子进程,如果根据需求,比如后面访问量大了,自动的生成新的子进程,如果服务器比较闲的话,它还可以自动去销毁,当销毁到一定程度的时候,它就会自动去生成新的子进程。那么怎么去控制什么时候销毁、什么时候生成呢?靠的就是下面这些参数来定义的,只有pm = dynamic 时,下面的这些参数才会生效。
pm.max_children = 50 //最大子进程数
pm.start_servers = 20 //这行表示一开始就生成20个子进程
pm.min_spare_servers = 5 //表示在空闲时最少保留5个子进程
pm.max_spare_servers = 35 //定义在空闲时,子进程的最大数,如果高于这个数,就开始清理空闲的子进程
pm.max_requests = 500 //定义一个子进程最多可以处理500个请求,当达到这个数值时,子进程会自动退出,如果不退出而子进程又有问题时会发生异常,所以需要杀死这个进程,而由于有上面的参数,子进程是可以自动派生的
我们将lijie.conf配置如下:
重新加载配置文件后,查看进程
# ps aux |grep pool
可以看到默认启动的子进程个数为20个,但最多不会超过50个
2、pm = static
如果不想用pm = dynamic,也可以使用pm = static静态。static表示静态,如果pm = static,那就只有pm.max_children = 50这行配置生效,这时候启动的时候就会直接生成50个子进程,我们现在来按照这种方案配置如下:
小技巧:注释使用分号“;”来表示
重新加载配置文件后,查看进程
# ps aux |grep pool
上面两张图可以看到有50个www的子进程生成
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
推荐链接
nginx中的root和alias区别 http://blog.csdn.net/21aspnet/article/details/6583335
nginx的alias和root配置 http://www.ttlsa.com/nginx/nginx-root_alias-file-path-configuration/
http://www.iigrowing.cn/shi-yan-que-ren-nginx-root-alias-location-zhi-ling-shi-yong-fang-fa.html 这个更详细