我正在将我的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-)