12.21 php-fpm的pool

php-fpmpool

Nignx可以配置多个虚拟主机,php-fpm同样也支持配置多个pool,每一个pool可以监听一个端口,也可以监听一个socket

php-fpm配置说明:

LAMP不同的是,在LNMP架构中,php-fpm作为独立的一个服务存在,既然是独立服务,那么它必然有自己的配置文件。php-fpm的配置文件为/usr/local/php-fpm/etc/php-fpm.conf,它同样也支持include语句,类似于nginx.conf里面的include

因此在Nginx中如果有多个站点,则每个站点可以使用一个pool,这样就可以避免单独的一个站点耗尽php资源导致其他站点也访问有误

1.查看我们之前定义的一个pool

 cat /usr/loacl/php-fpm/etc/php-fpm.conf

blob.png 

2.定义多个pool:(有两种方式)

cd /usr/local/php-fpm/etc/php-fpm.conf   //添加多一个pool

添加以下配置:第二个sock

[aming.com]

#listen=127.0.0.1:9000

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

 

blob.png 

2.1检测和加载配置

 /usr/local/php-fpm/sbin/php-fpm -t

/etc/init.d/php-fpm reload   //  /usr/local/nginx/sbin/nginx -s reload

blob.png 

2.2 查看pool

ps aux|grep php-fpm

blob.png 

2.3 怎么使用我们的pool,进入到虚拟主机配置文件,站点的配置文件:(不同的站点,配置对应用虚拟主机配置文件,指定不同的pool

cd /usr/local/nginx/conf/vhost/

vim test.com.conf

针对以下模块进行配置:

location ~ \.php$

    {

        include fastcgi_params;

        fastcgi_pass unix:/tmp/php-fcgi.sock;

        fastcgi_index index.php;

        fastcgi_param SCRIPT_FILENAME /data/wwwroot/test.com$fastcgi_script_name;

    }

blob.png 

对应不同的配置文件,在php模块配置相应的pool

2.4 修改完配置文件后,测试配置文件是否正确:

 /usr/local/nginx/sbin/nginx -t

3.第二种定义多个Pool的方式

/usr/local/php-fpm/etc/php-fpm.conf 配置文件中配置的pool拆分到

单独的一个文件,只需在此配置文件中使用:include = etc/php-fpm.d/*.conf

3.1修改/usr/local/php-fpm/etc/php-fpm.conf 配置文件

vim /usr/local/php-fpm/etc/php-fpm.conf

//增加一个以下配置:(删除对应的pool配置) include = etc/php-fpm.d/*.conf   //添加引入配置文件语句 //include的这一行比较特殊,请注意等号后面的路径,必须写上etc目录,然后需要创建配置文件目录和子配置文件。

blob.png 

3.2创建目录

mkdir /usr/local/php-fpm/etc/php-fpm.d/

cd  /usr/local/php-fpm/etc/php-fpm.d/

3.3 创建相应pool文件

vim 

添加以下配置:

[www]

#listen =127.0.0.1:9000 

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

 

vim aming.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

 

3.4如何把两个站点隔开

vim /usr/local/nginx/conf/vhost/test.com.conf

原有站点test.com.conf配置如下:

blob.png 

 

blob.png 

3.4.1 增加一个aaa.com.conf站点信息,操作如下

vim /usr/local/nginx/conf/vhost/aaa.com.conf

增加如下配置内容: location ~ \.php$     {         include fastcgi_params;         fastcgi_pass unix:/tmp/aming.sock;         fastcgi_index index.php;         fastcgi_param SCRIPT_FILENAME /data/wwwroot/default$fastcgi_script_name;     }

最终配置如下:

blob.png 

 

blob.png 

3.5测试语法

 /usr/local/php-fpm/sbin/php-fpm -t

blob.png 

3.6 重启php-fpm,查看pool

/etc/init.d/php-fpm restart  ///etc/init.d/php-fpm reload

ps aux |grep php-fpm

blob.png 

 

12.22 php-fpm慢执行日志

php-fpm慢执行日志(很实用)

通过php-fpm的慢执行日志,我们可以非常清晰地了解到PHP的脚本哪里执行时间长,它可以定位到具体的行。

1.编辑配置文件,针对www文件做一个测试

 vim /usr/local/php-fpm/etc/php-fpm.d/

增加如下内容: request_slowlog_timeout = 1     //超过一秒中就会记录日志 slowlog = /usr/local/php-fpm/var/log/www-slow.log    //日志存放的路径

blob.png 

2.测试语法,重启php-fpm

/usr/local/php-fpm/sbin/php-fpm -t

/etc/init.d/php-fpm restart

blob.png 

查看慢行日志是否已经创建成功:

cat /usr/local/php-fpm//var/log/www-slow.log

blob.png 

3。测试:

因为我们的www.conf这个pool文件监听的是 /tmp/php-fcgi.sock

/usr/local/nginx/conf/vhost/test.com.conf这个虚拟主机配置文件就是引用 /tmp/php-fcgi.sock文件,且是/data/wwwroot/test.com这个站点。

所以在/data/wwwroot/test.com站点下创建测试脚本:

vim /data/wwwroot/test.com/sleep.php

增加如下配置内容: <?php echo "test slow log"; sleep(2); echo "done"; ?>

blob.png 

4,使用curl做测试

curl -x127.0.0.1:80 test.com/sleep.php -I

blob.png 

如果报错500,报错处理:

进入vim /usr/local/php-fpm/etc/php.ini

找到display_error,改为On,然后访问有错误主就会有输出信息

5.查看慢执行日志

 cat /usr/local/php-fpm/var/log/www-slow.log

blob.png 

 

12.23 open_basedir

定义open_basedir

open_basedir的目的就是安全,只要在对应的Nginx虚拟主机配置文件中调用对应的pool,就可以使用open_basedir物理隔离多个站点,从而达到安全目的。

/data/wwwroot/test.com/3.php来实验:

1.配置虚拟主机文件

vim /usr/local/php-fpm/etc/php-fpm.d/www.conf  

增加如下配置内容: php_admin_value[open_basedir]=/data/wwwroot/test.com:/tmp/

最终配置如下:

blob.png 

2.使用curl测试正常

curl -x127.0.0.1:80 test.com/3.php -I

blob.png 

3.下来我们做一个错误的实验:再次更改www.conf,定义一个错误的open_basedir路径

vim /usr/local/php-fpm/etc/php-fpm.d/www.conf

php_admin_value[open_basedir]=/data/wwwroot/test.com:/tmp/

改为php_admin_value[open_basedir]=/data/wwwroot/wwwtest.com:/tmp/

blob.png 

3.1重启一下php-fpm

 /etc/init.d/php-fpm restart

3.2 curl测试

curl -x127.0.0.1:80 test.com/3.php -I

blob.png 

4.配置错误日志,我们可以查看相关的错误

4.1配置把display_errors 改为Off(正常的线上环境建议是off,不让错误日志显示在浏览器上让别人看到)

vim /usr/local/php-fpm/etc/php.ini

display_errors 改为Off

blob.png 

4.2再定义一下error_log 的路径放在哪里:

error_log = /usr/local/php-fpm/var/log/php_errors.log

blob.png 

4.3再定义error_reporting 为所有,并且把之前的error_reporting 注释掉,用分号:

blob.png 

4.4 确认一下对应的错日志文件路径有没有文件,没有的话,创建一个文件,再赋予777权限,避免不能正常写入,然后再重启一下php-fpm服务

ls /usr/local/php-fpm/var/log/

touch /usr/local/php-fpm/var/log/php_errors.log

chmod 777 /usr/local/php-fpm/var/log/php_errors.log

blob.png 

4.5curl 测试,然后查看错误日志

curl -x127.0.0.1:80 test.com/3.php -I

blob.png 

cat /usr/local/php-fpm/var/log/php_errors.log   //因为open_basedir限制的地址写错了,所有就会报错,访问出现404

blob.png 

 12.24 php-fpm进程管理

php-fpm进程管理

blob.png 

 pm = dynamic //定义php-fpm的子进程启动模式,dynamic为动态进程管理,一开始只启动少量的子进程,根据实际需求,动态地增加或者减少子进程,最多不会超过pm.max_children定义的数值。另外一种模式是static,这种模式下子进程数量由pm.max_children决定,一次性启动这么多,不会减少也不会增加。

 pm.max_children = 50 //最大子进程数,ps aux可以查看

 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的子进程最多可以处理这么多请求,当达到这个数值时,它会自动退出。