cpu飙升与open_basedir

前言

近日,运维的同学说php-fpm消耗的cpu一下子飚了很多。开始我的思路是通过gdb方式去查看当时内存里的调用栈来找出有问题的代码行,经过分析业务代码并没啥问题,这时候很可能就跟open_basedir开启有关。

open_basedir介绍

open_basedir 将php所能打开的文件限制在指定的目录树中,包括文件本身。当程序要使用例如fopen()或file_get_contents()打开一个文件时,这个文件的位置将会被检查。当文件在指定的目录树之外,程序将拒绝打开。本指令不受安全模式打开或关闭的影响。每个项目中有很多写日志的地方,或者框架中总会有很多代码的引入,每次php总要读取目录树权限,速度自然就降了下来。

open_basedir设置方法

1.在php.ini 加入

open_basedir=”指定目录”

2.在程序中使用

ini_set(‘open_basedir’, ‘指定目录’);

但不建议使用这种方法

3.nginx fastcgi.conf

fastcgi_param PHP_VALUE “open_basedir=指定目录”

用open_basedir指定的限制实际上是前缀,不是目录名。

也就是说 open_basedir=/home/fdipzone 也会允许访问/home/fdipzone_abc,如果要将访问限制为目录,请使用斜线结束路径名,例如:open_basedir=”/home/fdipzone/”

如果要设置多个目录,window使用;分隔目录,linux使用:分隔目录。

用open_basedir限制目录访问

修改php.ini配置,设置open_basedir :

在上一层目录 /home/wwwroot/blog/中创建一个test.txt文件,在blog中创建index.php执行以下代码:

因为test.txt不在限定的目录范围内,因此php提示警告:

Warning: file_get_contents(): open_basedir restriction in effect. File(../test.txt) is not within the allowed path(s): (/home/wwwroot/blog/) in /home/wwwroot/blog/index.php on line 3

open_basedir的性能分析

open_basedir开启后会影响I/O,因为每个调用的文件都需要判断是否在限制目录内。测试程序,读取限制目录内同一文件10000次

关闭open_basedir测试

run time 137.237072 ms

打开open_basedir测试

run time 404.207945 ms

开启open_basedir后,执行时间是关闭的3倍。

总结

由此可见使用open_basedir可以限制程序可操作的目录和文件,提高系统安全性,但会影响I/O性能导致系统执行变慢,所以通常情况下,结合实际业务需要open_basedir对项目的部分子目录做安全性校验就好了。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注