php-fpm配置

和lamp不同的是,在lnmp的架构中,php-fpm作为一个独立的服务存在,既然是独立的服务存在,那他就有自己的配置文件。php-fpm的配置文件是/usr/local/php-fpm/etc/。

php-fpm的pool(池子)

nginx支持多个虚拟主机,php-fmp同样也支持配置多个pool,每一个pool可以监听一个端口,也可以监听一个socket(套接口)。比如我们的nginx有多个站点,那么每一个站点都可以使用一个pool。这样做的好处是当其中一个php显示502了(502可能是我们的php资源不够了),如果我们的所有网站都用同样的pool,当其中一个站点显示502,那么同在一个pool的站点就会全部失效。所以我们有必要将每个站点隔离开来,使用单独的pool。

设置多个pool 首先进入目录/usr/local/php-fpm/etc/。然后编辑vim php-fpm.conf [root@linletao-001 etc]# vim php-fpm.conf

[global] pid = /usr/local/php-fpm/var/run/php-fpm.pid error_log = /usr/local/php-fpm/var/log/php-fpm.log [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 我们在后面继续追加和上面一样的内容就可以了。但需要注意的是,[]中的pool要改,而且下面的listen也要和上面的名字一致。保存后我们测试看有咩有语法错误 /usr/local/php-fpm/sbin/php-fpm -t 没有错误的话我们重启一下php-fpm /etc/init.d/php-fpm reload 然后我们查看一下 ps aux|grep php-fpm php-fpm 4666 0.0 0.4 227204 4724 ? S 23:31 0:00 php-fpm: pool www php-fpm 4667 0.0 0.4 227204 4724 ? S 23:31 0:00 php-fpm: pool www php-fpm 4668 0.0 0.4 227204 4724 ? S 23:31 0:00 php-fpm: pool www php-fpm 4669 0.0 0.4 227204 4720 ? S 23:31 0:00 php-fpm: pool aming.com php-fpm 4670 0.0 0.4 227204 4720 ? S 23:31 0:00 php-fpm: pool aming.com php-fpm 4671 0.0 0.4 227204 4720 ? S 23:31 0:00 php-fpm: pool aming.com php-fpm 4672 0.0 0.4 227204 4724 ? S 23:31 0:00 php-fpm: pool aming.com php-fpm 4673 0.0 0.4 227204 4728 ? S 23:31 0:00 php-fpm: pool aming.com 这时我们发现已经有aming.com的pool了。

然后我们就可以将不同的网址配置不同的pool了 比如我们将aaa.com的pool配置成aming.com就可以这样配置 首先打开aaa.com的配置文件,然后增加以下内容。 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; access_log /tmp/test.com.log aming; }

在nginx中,它支持include vhost/.conf;,那么在php-fpm中它同样也支持。 这样保存退出就可以了。 我们也可以这样做 首先编辑php-fpm.conf 然后在global的最后一行加入 include = etc/php-fpm.d/.conf [root@linletao-001 etc]# vim php-fpm.conf [global] pid = /usr/local/php-fpm/var/run/php-fpm.pid error_log = /usr/local/php-fpm/var/log/php-fpm.log include = etc/php-fpm.d/.conf 然后将后面的内容全部复制后删除,准备粘贴到另外的两个配置文件中去。 因为 include = etc/php-fpm.d/.conf,所以我们要在/usr/local/php-fpm/etc/下建一个php-fpm.d目录。 然后将在目录下建立配置文件,比如我们要建立www.com和aming.com 然后将刚才复制后删除的配置文件分别放入到对应的两个配置文件中去。 这样的配置类似于nginx中的vhost简洁方便。

php-fpm慢执行日志

如果有一天我们的网站访问非常慢,这时我们既可以通过php-fpm的慢执行日志进行分析,在这里我们可以非常清晰的了解到php的脚本中哪里执行时间长,他可以定位到具体的行,这就是php-fpm慢执行日志的好处。
我们用刚才的www.conf做实验,首先打开配置文件

/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 (日志目录) 然后我们查询一下,看看日志是否生成 ls /usr/local/php-fpm/var/log php-fpm.log www-slow.log 日志已经生成

然后我们做一个实验,写一个脚本模拟慢执行 vim /data/wwwroot/test.com/sleep.php 然后写入内容 <?php echo “test slow log”; sleep(2); echo “done”; ?> 保存退出

然后我们运行一下 curl -x127.0.0.1:80 test.com/sleep.php 但是发现他并没有执行,这时我们要排一下错。查看错误日志。 日志上显示是语法错误,所以我们重新去编辑脚本。 重新编辑完后我们再次运行脚本,查看慢执行日志 cat /usr/local/php-fpm/var/log/www-slow.log 然后日志中生成如下内容 [root@linletao-001 php-fpm.d]# cat /usr/local/php-fpm/var/log/www-slow.log

[01-May-2018 22:09:11] [pool www] pid 7471 script_filename = /data/wwwroot/test.com/sleep.php (这段是告诉你哪个脚本慢) [0x00007f95ef40a2f8] sleep() /data/wwwroot/test.com/sleep.php:3 (这段是告诉你这个脚本的第三行导致访问慢) 而第三段正是我们故意让它慢的配置。 所以这就是慢执行日志的强大之处。他不仅可以告诉你哪个脚本出了问题,还能告诉你是具体哪个地方出现了问题。

open_basedir

open_basedir可将用户访问文件的活动范围限制在指定的区域,通常是其家目录的路径,也 

可用符号”.”来代表当前目录。注意用open_basedir指定的限制实际上是前缀,而不是目录名。 举例来说: 若”open_basedir = /dir/user”, 那么目录 “/dir/user” 和 “/dir/user1″都是 可以访问的。所以如果要将访问限制在仅为指定的目录,请用斜线结束路径名。例如设置成: “open_basedir = /dir/user/” 我们可以针对不通的pool来设定open_basedir。只要在配置文件中加一行配置就可以。 我们针对www.conf来配置open_basedi 首先进入/usr/local/php-fpm/etc/php-fpm.d目录下,编辑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 request_slowlog_timeout = 1 slowlog = /usr/local/php-fpm/var/log/www-slow.log php_admin_value[open_basedir]=/data/wwwroot/test.com:/tmp/(需要增加的配置)

(1)测试配置文件是否正确: /usr/local/nginx/sbin/nginx -t (2)加载一下配置文件: /usr/local/nginx/sbin/nginx -s reload (/etc/init.d/php-fpm reload) 然后我么做实验 curl -x127.0.0.1:80 test.com/3.php -I HTTP/1.1 200 OK Server: nginx/1.12.1 Date: Wed, 02 May 2018 13:33:32 GMT Content-Type: text/html; charset=UTF-8 Connection: keep-alive X-Powered-By: PHP/5.6.30

如果open_basedir配置错误的话,就不能访问站点了。我们再次配置www.conf,这次将open_basedir故意的配置错误。 然后再做实验 curl -x127.0.0.1:80 test.com/3.php -I HTTP/1.1 404 Not Found Server: nginx/1.12.1 Date: Wed, 02 May 2018 13:56:57 GMT Content-Type: text/html; charset=UTF-8 Connection: keep-alive X-Powered-By: PHP/5.6.30 这次就没有连接上。 所以我们针对的站点一定要和下面新加配置的open_basedir一致才可以。如多定义的路径不正确,那他就不能去访问。 要查询它所对应的站点。去/usr/local/nginx/conf/vhost/目录下查找。

我们也可以查看错误日志。 首先我们要配置错误日志。 vim /usr/local/php-fpm/etc/php.ini 搜索/display_errors display_errors = Off 然后将display_errors后面改成Off,如果不改的话,错误日志将会显示在网页上。

将log_errors改为On log_errors = On

我们要将错误日志记录在服务器的某个文件中。 error_log = 指定错误日志文件路径 ; Example: ;error_log = php_errors.log ; Log errors to syslog (Event Log on Windows). ;error_log = syslog /usr/local/php-fpm/var/log/php_errors.log(新追加的配置)

error_reporting 定义日志级别 #error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT error_reporting = E_ALL 将上面那行注释掉,然后增加下面这行。

然后手动生成日志,并且权限改为777 touch /usr/local/php-fpm/var/log/php_errors.log chmod 777 /usr/local/php-fpm/var/log/php_errors.log

然后从新加载php-fpm /etc/init.d/php-fpm reload

开始做实验 curl -x127.0.0.1:80 test.com/3.php -I HTTP/1.1 404 Not Found Server: nginx/1.12.1 Date: Wed, 02 May 2018 14:42:05 GMT Content-Type: text/html; charset=UTF-8 Connection: keep-alive X-Powered-By: PHP/5.6.30 然后查看错误日志 [root@linletao-001 php-fpm.d]# cat /usr/local/php-fpm/var/log/php_errors.log [02-May-2018 14:41:13 UTC] PHP Deprecated: Comments starting with '#' are deprecated in Unknown on line 1 in Unknown on line 0 [02-May-2018 14:41:50 UTC] PHP Warning: Unknown: open_basedir restriction in effect. File(/data/wwwroot/test.com/3.php) is not within the allowed path(s): (/data/wwwroot/aming.com:/tmp/) in Unknown on line 0 [02-May-2018 14:41:50 UTC] PHP Warning: Unknown: failed to open stream: Operation not permitted in Unknown on line 0 [02-May-2018 14:42:05 UTC] PHP Warning: Unknown: open_basedir restriction in effect. File(/data/wwwroot/test.com/3.php) is not within the allowed path(s): (/data/wwwroot/aming.com:/tmp/) in Unknown on line 0 [02-May-2018 14:42:05 UTC] PHP Warning: Unknown: failed to open stream: Operation not permitted in Unknown on line 0 我们通过日志可以发现,我们访问的文件是 test.com/3.php,而我们定义的open dasedir却是 aming.com:/tmp/,所以肯定是访问不到的。只有将它改回来才能继续访问。

php-fpm进程管理

pm = dynamic //动态进程管理,也可以是static 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的子进程最多可以处理这么多请求,当达到这个数值时,它会自动退出