Apache、PHP 配置 open_basedir,以及性能问题

open_basedir 可将用户访问文件的活动范围限制在指定的区域,通常是htdocs目录的路径,也可用符号 "." 来代表当前目录。

当其作用于 Apache 模块时,父目录中的 open_basedir 路径自动被继承。


Linux 中的配置:

方法一:在 php.ini 里配置

open_basedir = .:/tmp/

方法二:在 Apache 配置的 VirtualHost 里设置

php_admin_value open_basedir .:/tmp/
php_admin_value open_basedir /usr/local/apache/htdocs/

设置多个目录可以参考如下:

php_admin_value open_basedir /var/www/html/:/var/tmp/

方法三:在 Apache 配置的 Direcotry 里设置

php_admin_value open_basedir .:/tmp/
php_admin_value open_basedir /usr/local/apache/htdocs/

设置多个目录可以参考如下:

php_admin_value open_basedir /usr/local/apache/htdocs/:/tmp/


A、方法二的优先级高于方法一,也就是说方法二会覆盖方法一;方法三的优先级高于方法二,也就是说方法三会覆盖方法二;

B、配置目录里加了“/tmp/”是因为 php 默认的临时文件(如上传的文件、session 等)会放在该目录,所以一般需要添加该目录,否则部分功能将无法使用;

C、配置目录里加了“.”是指运行 php 文件的当前目录,这样做可以避免每个站点一个一个设置;

D、如果站点还使用了站点目录外的文件,需要单独在对应 VirtualHost 设置该目录;


Windows 问题

Windows 中 open_basedir 多个目录的分隔符使用分号,在任何其它系统中用冒号分隔目录。

open_basedir = ".;D:/ap/tmp"
open_basedir = "D:/htdocs/;D:/ap/tmp"
session.save_path = "D:/ap/tmp"
upload_tmp_dir = "d:/ap/tmp"


错误问题

如果设置open_basedir以后,发现php程序无法上传文件,无法写入session,这是因为临时文件目录不在网站的写入权限范围内。


性能问题

最后,使用open_basedir可以限制程序可操作的目录和文件,提高系统安全性。但会影响I/O性能,导致系统执行变慢。 如果一个程序io操作比较多,执行时间可以长的不可忍受。比如,我有一个thinkphp5的程序,在限定open_basedir以后,执行时间从0.3秒直接提高到了1秒以上。而服务器响应时间,从开始的500毫秒,增加到了2-3秒。open_basedir需要在安全与性能上做平衡。


CentOS 8 FastCGI 模式下设置

参考 https://javascript.net.cn/article?id=675



参考:

http://php.net/manual/zh/ini.core.php#ini.open-basedir

http://www.cnblogs.com/ybbqg/archive/2012/05/04/2482479.html

https://stackoverflow.com/questions/16493692/windows-2008-server-iis-7-sessions-not-worked

https://serverfault.com/questions/570210/file-upload-permissions-issue-on-windows-server-2008-r2-iis-7-5-php-5-3-with-dru

https://blog.csdn.net/fdipzone/article/details/54562656


修改时间 2018-05-11

声明:本站所有文章和图片,如无特殊说明,均为原创发布。商业转载请联系作者获得授权,非商业转载请注明出处。
真诚赞赏,手留余香
赞赏
随机推荐
WordPress 分类添加自定义字段
WordPress 自定义 JWT 授权和验证
WordPress 插入文章函数 wp_insert_post()
CSS 滚动条样式修改
JavaScript 中 0.1 加 0.2 不等于 0.3 的原因和解决方法
Vue3 挂载全局方法
WordPress 语言文件
RESTful API 执行 delete 返回204无法获取 Body