php-fpm的pool12.22 php-fpm慢执行日志

摘要:12.21 php-fpm的pool 知识点 pool 池子,每一个池子都可以监听不同的sock或者是TCP/IP,nginx如果有多个站点,那么每个站点都能去使用一个独立的pool,这样做的好处是,当其中一个php发生错误了(资源不够),所以就有必要让每一个站点使用独立的pool 例如:php程序编写时发生了错误,就会导致整个php资源耗尽,因为pool只支持57个进程,当进程满的时候,如果再有

12.21 php-fpm的pool 知识点

pool 池子,每一个池子都可以监听不同的sock或者是TCP/IP,nginx如果有多个站点,那么每个站点都能去使用一个独立的pool,这样做的好处是,当其中一个php发生错误了(资源不够),所以就有必要让每一个站点使用独立的pool

例如:php程序编写时发生了错误,就会导致整个php资源耗尽,因为pool只支持57个进程,当进程满的时候,如果再有新的请求,将会发现资源被耗尽,就会反馈用户502

增加pool并指定让那个站点使用

1 (17).jpg

配置方法一:

在php-fpm.conf下直接添加一段

[aming.com] listen = /tmp/aming.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 配置方法二:

使用类似配置vhost的办法,创建目录,单个文件对单个站点(这样的办法看起来不急干净,便于维护) 创建存放的目录

[root@aminglinux-02 vhost]# cd /usr/local/php-fpm/etc/ [root@aminglinux-02 etc]# mkdir php-fpm.d [root@aminglinux-02 etc]# ls pear.conf php-fpm.conf php-fpm.conf.default php-fpm.d php.ini

在php-fpm.conf主配置文件下添加配置,并删除之前的pool的配置;删除前cat一次文件,以便拷贝pool的配置到新的配置文件里

[root@aminglinux-02 etc]# vim php-fpm.conf include = etc/php-fpm.d/*.conf

在新创建的目录下,创建对应站点的pool

[root@aminglinux-02 php-fpm.d]# pwd /usr/local/php-fpm/etc/php-fpm.d [root@aminglinux-02 php-fpm.d]# ls aming.conf www.conf

配置好以后,检查语法并重启

[root@aminglinux-02 ~]# /usr/local/php-fpm/sbin/php-fpm -t [root@aminglinux-02 ~]# /etc/init.d/php-fpm reload Reload service php-fpm done

查看新增的pool是否被使用

[root@aminglinux-02 ~]# ps aux |grep php-fpm root 2723 0.0 0.2 226700 4960 ? Ss 01:17 0:00 php-fpm: master process (/usr/local/php-fpm/etc/php-fpm.conf) php-fpm 2724 0.0 0.2 226640 4704 ? S 01:17 0:00 php-fpm: pool www php-fpm 2725 0.0 0.2 226640 4704 ? S 01:17 0:00 php-fpm: pool www php-fpm 2726 0.0 0.2 226640 4704 ? S 01:17 0:00 php-fpm: pool www php-fpm 2727 0.0 0.2 226640 4704 ? S 01:17 0:00 php-fpm: pool www php-fpm 2728 0.0 0.2 226640 4708 ? S 01:17 0:00 php-fpm: pool www php-fpm 2729 0.0 0.2 226640 4708 ? S 01:17 0:00 php-fpm: pool www php-fpm 2730 0.0 0.2 226640 4708 ? S 01:17 0:00 php-fpm: pool www php-fpm 2731 0.0 0.2 226640 4708 ? S 01:17 0:00 php-fpm: pool www php-fpm 2732 0.0 0.2 226640 4708 ? S 01:17 0:00 php-fpm: pool www php-fpm 2733 0.0 0.2 226640 4708 ? S 01:17 0:00 php-fpm: pool www php-fpm 2734 0.0 0.2 226640 4708 ? S 01:17 0:00 php-fpm: pool www php-fpm 2735 0.0 0.2 226640 4712 ? S 01:17 0:00 php-fpm: pool www php-fpm 2736 0.0 0.2 226640 4712 ? S 01:17 0:00 php-fpm: pool www php-fpm 2737 0.0 0.2 226640 4712 ? S 01:17 0:00 php-fpm: pool www php-fpm 2738 0.0 0.2 226640 4712 ? S 01:17 0:00 php-fpm: pool www php-fpm 2739 0.0 0.2 226640 4712 ? S 01:17 0:00 php-fpm: pool www php-fpm 2740 0.0 0.2 226640 4712 ? S 01:17 0:00 php-fpm: pool www php-fpm 2741 0.0 0.2 226640 4712 ? S 01:17 0:00 php-fpm: pool www php-fpm 2742 0.0 0.2 226640 4712 ? S 01:17 0:00 php-fpm: pool www php-fpm 2743 0.0 0.2 226640 4712 ? S 01:17 0:00 php-fpm: pool www php-fpm 2744 0.0 0.2 226640 4708 ? S 01:17 0:00 php-fpm: pool aming.com php-fpm 2745 0.0 0.2 226640 4708 ? S 01:17 0:00 php-fpm: pool aming.com php-fpm 2746 0.0 0.2 226640 4708 ? S 01:17 0:00 php-fpm: pool aming.com php-fpm 2747 0.0 0.2 226640 4708 ? S 01:17 0:00 php-fpm: pool aming.com php-fpm 2748 0.0 0.2 226640 4712 ? S 01:17 0:00 php-fpm: pool aming.com php-fpm 2749 0.0 0.2 226640 4712 ? S 01:17 0:00 php-fpm: pool aming.com php-fpm 2750 0.0 0.2 226640 4712 ? S 01:17 0:00 php-fpm: pool aming.com php-fpm 2751 0.0 0.2 226640 4716 ? S 01:17 0:00 php-fpm: pool aming.com php-fpm 2752 0.0 0.2 226640 4716 ? S 01:17 0:00 php-fpm: pool aming.com php-fpm 2753 0.0 0.2 226640 4716 ? S 01:17 0:00 php-fpm: pool aming.com php-fpm 2754 0.0 0.2 226640 4716 ? S 01:17 0:00 php-fpm: pool aming.com php-fpm 2755 0.0 0.2 226640 4716 ? S 01:17 0:00 php-fpm: pool aming.com php-fpm 2756 0.0 0.2 226640 4716 ? S 01:17 0:00 php-fpm: pool aming.com php-fpm 2757 0.0 0.2 226640 4716 ? S 01:17 0:00 php-fpm: pool aming.com php-fpm 2758 0.0 0.2 226640 4716 ? S 01:17 0:00 php-fpm: pool aming.com php-fpm 2759 0.0 0.2 226640 4716 ? S 01:17 0:00 php-fpm: pool aming.com php-fpm 2760 0.0 0.2 226640 4716 ? S 01:17 0:00 php-fpm: pool aming.com php-fpm 2761 0.0 0.2 226640 4716 ? S 01:17 0:00 php-fpm: pool aming.com php-fpm 2762 0.0 0.2 226640 4716 ? S 01:17 0:00 php-fpm: pool aming.com php-fpm 2763 0.0 0.2 226640 4716 ? S 01:17 0:00 php-fpm: pool aming.com root 2765 0.0 0.0 112664 976 pts/0 R+ 01:17 0:00 grep --color=auto php-fpm

发现新增了pool 名字为 aming.com

在nginx里启用

配置新的虚拟主机配置文件

[root@aminglinux-02 vhost]# pwd /usr/local/nginx/conf/vhost [root@aminglinux-02 vhost]# vim aaa.com.conf server { listen 80 default_server; server_name aaa.com; index index.html index.htm index.php; root /data/wwwroot/default; location ~ .php$ //新增解析php 下面这一整段 { include fastcgi_params; fastcgi_pass unix:/tmp/aming.sock; //指定新添加的pool里面配置的sock fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /data/wwwroot/default$fastcgi_script_name; } } 12.22 php-fpm慢执行日志

做 php 的网站,建议使用lnmp,主要原因就是可以去分析慢执行; 查询办法 1、系统负载,可以通过各种工具查,查出是哪个进程导致 2、PHP网站访问慢,通过慢日志

配置方法:

配置pool文件

[root@aminglinux-02 php-fpm.d]# vim www.conf [www] listen = /tmp/php-fcgi.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 request_slowlog_timeout = 1 //新增;超过一秒钟记录一次;一般用2秒比较合适,因为很多脚本都会超过1秒 slowlog = /usr/local/php-fpm/var/log/www-slow.log //新增;日志存放路径

配置完成,检查语法&&重新加载服务

[root@aminglinux-02 php-fpm.d]# /usr/local/php-fpm/sbin/php-fpm -t [17-Aug-2017 01:48:30] NOTICE: configuration file /usr/local/php-fpm/etc/php-fpm.conf test is successful [root@aminglinux-02 php-fpm.d]# /etc/init.d/php-fpm reload Reload service php-fpm don

查看一下是否生成日志文件,是否有内容

[root@aminglinux-02 php-fpm.d]# ls /usr/local/php-fpm/var/log/www-slow.log /usr/local/php-fpm/var/log/www-slow.log [root@aminglinux-02 php-fpm.d]# cat !$ cat /usr/local/php-fpm/var/log/www-slow.log

日志文件并没有内容,因为还没有发生超过1秒的php执行的情况

模拟一个慢执行的php

到www pool的所支持的站点下,创建一个慢执行的php

[root@aminglinux-02 test.com]# pwd /data/wwwroot/test.com [root@aminglinux-02 test.com]# vim sleep.php <?php echo “test slow log”; sleep(2); echo “done”; ?>

检查语法&&重新加载服务

[root@aminglinux-02 test.com]# /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@aminglinux-02 test.com]# /usr/local/nginx/sbin/nginx -s reload

测试

[root@aminglinux-02 test.com]# curl -x127.0.0.1:80 test.com/sleep.php -I HTTP/1.1 500 Internal Server Error Server: nginx/1.12.1 Date: Wed, 16 Aug 2017 17:56:11 GMT Content-Type: text/html; charset=UTF-8 Connection: keep-alive X-Powered-By: PHP/5.6.30

提示500 表示有错

打开在浏览器查看错误信息

[root@aminglinux-02 test.com]# vim /usr/local/php-fpm/etc/php.ini

搜索 display_err ,on 这个配置,将能在浏览器上查看错误信息

[root@aminglinux-02 test.com]# curl -x127.0.0.1:80 test.com/sleep.php <br /> <b>Parse error</b>: syntax error, unexpected \'slow\' (T_STRING), expecting \',\' or \';\' in <b>/data/wwwroot/test.com/sleep.php</b> on line <b>2</b><br />

提示:解析错误< / b >:语法错误,意外的“慢”(T_STRING),期望“,”或“;在< b > /数据/ wwwroot /test.com/sleep.php < / b > < b > 2行< / b > 检查sleep.php文件

发现里面的标点用的是中文标点,更改后重启配置

再次测试

[root@aminglinux-02 test.com]# curl -x127.0.0.1:80 test.com/sleep.php test slow logdone

发现会慢2秒才输出结果

这时候可以去查看是否生成了慢日志

[root@aminglinux-02 test.com]# cat /usr/local/php-fpm/var/log/www-slow.log [17-Aug-2017 02:07:35] [pool www] pid 3133 script_filename = /data/wwwroot/test.com/sleep.php //提示:是哪个文件慢 [0x00007ff86b542298] sleep() /data/wwwroot/test.com/sleep.php:3 //提示:是文件里的那一行慢

查看相关的文件

[root@aminglinux-02 test.com]# cat sleep.php <?php echo "test slow log"; sleep(2); // 这一行因为执行了sleep 2 ,将暂停2秒,就是这个导致慢,所以被日志记录 echo "done"; ?> 12.23 open_basedir 知识点

因为如果服务器管理多个网站,在php.ini里定义多个open_basedir就不合适了,所以使用针对pool定义对应的open_basedir

配置open_basedir

对www的pool进行配置,在最末行加多一行配置

[root@aminglinux-02 php-fpm.d]# vim www.conf php_admin_value[open_basedir]=/data/wwwroot/test.com:/tmp/ 如果路径出错,会导致404页面 curl直接连会提示“No input file specified.” 开启错误日志记录

定义错误日志

;error_log = php_errors.log ; Log errors to syslog (Event Log on Windows). ;error_log = syslog error_log = /usr/local/php-fpm/var/log/php_errors.log //这一段定义错误日志

定义错误日志的级别

error_reporting = E_ALL //所有

查看刚更改的路径是否存在

[root@aminglinux-02 php-fpm.d]# grep error_log /usr/local/php-fpm/etc/php.ini ; server-specific log, STDERR, or a location specified by the error_log ; Set maximum length of log_errors. In error_log information about the source is ;error_log = php_errors.log ;error_log = syslog error_log = /usr/local/php-fpm/var/log/php_errors.log ; OPcache error_log file name. Empty string assumes "stderr". ;opcache.error_log= [root@aminglinux-02 php-fpm.d]# ls /usr/local/php-fpm/var/log/ php-fpm.log www-slow.log

为了保证能正常的写入日志,需要进行以下操作 创建好一个错误日志文件

[root@aminglinux-02 php-fpm.d]# touch /usr/local/php-fpm/var/log/php_errors.log

将它的权限设置为777,以便写入

[root@aminglinux-02 php-fpm.d]# chmod 777 !$ chmod 777 /usr/local/php-fpm/var/log/php_errors.log [root@aminglinux-02 php-fpm.d]# ls -lhtr /usr/local/php-fpm/var/log/ 总用量 16K -rw------- 1 root root 480 8月 17 02:07 www-slow.log -rw------- 1 root root 9.1K 8月 17 02:07 php-fpm.log -rwxrwxrwx 1 root root 0 8月 17 02:30 php_errors.log 12.24 php-fpm进程管理

[root@aminglinux-02 php-fpm.d]# cat www.conf [www] listen = /tmp/php-fcgi.sock listen.mode = 666 user = php-fpm group = php-fpm pm = dynamic //表示进程以什么形式启动,dynamic就是动态,动态就是一开始为一个数值,根据需求再自动生成,服务器比较闲的时候还会去销毁,销毁到一定程度还有自动生成 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的子进程最多可以处理这么多请求,当达到这个数值时,它会自动退出。 rlimit_files = 1024 request_slowlog_timeout = 1 slowlog = /usr/local/php-fpm/var/log/www-slow.log php_admin_value[open_basedir]=/data/wwwroot/test.com:/tmp/

pm = dynamic //表示进程以什么形式启动,dynamic就是动态,动态就是一开始为一个数值,根据需求再自动生成,服务器比较闲的时候还会去销毁,销毁到一定程度还有自动生成;根据下面的设置去进行设定“start_servers ”、“min_spare_servers ”、“max_spare_servers ”、“max_requests ”

==pm 还有一个选择是 static ,一旦选择这个设置,下面的pm的各种设置只会有一个max_children生效==