PHP fopen()即使具有广泛的开放权限也会失败

我正在将我的LAMP从我的 Windows Server迁移到运行Debian 6的VPS.但是,大多数工作都是正常的,但是其中一个 PHP脚本无法写入其配置的日志文件.我无法确定为什么,所以我写了一个新的,简单的,有创意的PHP脚本来测试这个问题. ?php ini_set(display_errors, 1); e

我正在将我的LAMP从我的
Windows Server迁移到运行Debian 6的VPS.但是,大多数工作都是正常的,但是其中一个
PHP脚本无法写入其配置的日志文件.我无法确定为什么,所以我写了一个新的,简单的,有创意的PHP脚本来测试这个问题.

<?php
        ini_set('display_errors',1);
        error_reporting(E_ALL);
        echo exec('whoami');
        $log = fopen('/var/log/apache2/writetest/writetest.log','a');
        if ($log != NULL)
        {
                fflush($log);
                fclose($log);
                $log = NULL;
        }
?>

但是,它失败了结果:

www-data Warning: fopen(/var/log/apache2/writetest/writetest.log): failed to open stream: Permission denied in /var/www/_admin/phpwritetest.php on line 5

>虽然我永远不会正常进行,为了帮助诊断,我将/var/log/apache2/writetest/writetest.log设置为chmod 777.
>目录和文件均由www-data:www-data拥有.
>文件是用触摸创建的.

我运行strace来验证哪个进程正在执行open:

[pid 21931] lstat("/var/log/apache2/writetest/writetest.log",0x7fff81677d30) = -1 EACCES (Permission denied)
[pid 21931] lstat("/var/log/apache2/writetest",0x7fff81677b90) = -1 EACCES (Permission denied)
[pid 21931] open("/var/log/apache2/writetest/writetest.log",O_RDWR|O_CREAT|O_TRUNC,0666) = -1 EACCES (Permission denied)

我检查并且pid 21931确实是在www数据下运行的apache2子进程之一.正如你所看到的,我还包括echo exec(‘whoami’);在脚本中确认该脚本由www-data运行.

其他说明:

> PHP没有以安全模式运行
>没有设置PHP open_basedir
>版本信息:Apache / 2.2.16(Debian)PHP / 5.3.3-7 squeeze3与Suhosin-Patch mod_ssl / 2.2.16 OpenSSL / 0.9.8o
> uname -a:2.6.32-238.19.1.el5.028stab092.2#1 SMP Thu Jul 21 19:23:22 MSD 2011 x86_64 GNU / Linux
>这是在OpenVZ下运行的VPS
> ls -l(file):-rwxrwxrwx 1 www-data www-data 0 Sep 8 18:13 writetest.log
> ls -l(目录):drwxr-xr-x 2 www-data www-data 4096 Sep 8 18:13 writetest
> Apache2的父进程以root身份运行,子进程根据www数据进行处理
> selinux没有安装(感谢Fabio提醒我提到这个)
>我已经重新启动了apache很多次,并重新启动了服务器

请记住,为了达到一个文件,所有的父目录必须可以被www-data读取.您的strace输出似乎表明即使访问/ var / log / apache2 / writetest也是失败的.确保www数据具有以下目录的权限:

> /(r-x)> / var(r-x)> / var / log(r-x)> / var / log / apache2(r-x)> / var / log / apache2 / writetest(rwx)> /var/log/apache2/writetest/writetest.log(rw-)

作者: dawei

【声明】:永州站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

为您推荐

联系我们

联系我们

0577-28828765

在线咨询: QQ交谈

邮箱: xwei067@foxmail.com

工作时间:周一至周五,9:00-17:30,节假日休息

返回顶部