LNMP架构(六)

一 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 这个更详细

猜你喜欢

转载自my.oschina.net/u/3746774/blog/1635516