PHP无法写入错误日志 - 权限被拒绝

时间:2016-03-01 19:30:51

标签: php

在我多年的第一个PHP脚本中,我试图记录错误:

error_log("my error message", 3, $error_log);

我在常规Apache错误日志中收到错误:

  

PHP警告:error_log(/var/log/apache2/my_php_errors.log):无法打开流:第88行/var/www/html/blahblah/my_script.php中的权限被拒绝

这是我经过检查和尝试的内容:

  • 使用与Apache错误日志相同的所有权($error_log)和权限(root.adm)创建640
  • 将所有者更改为www-data,这是PHP正在运行的用户。
  • log_errorsOn
  • open_basedir未设置。
  • 使用PHP 5.5.x,因此不存在安全模式。

我错过了什么?

编辑:它能够写入常规的Apache错误日志。这个谜团是为什么它不能写入具有相同所有权和权限的同一目录中的另一个文件。

编辑2:另一位开发人员告诉我,这适用于他的WAMP,因此它是我的LAMP堆栈或配置特有的。

2 个答案:

答案 0 :(得分:2)

我遇到了同样的问题。 https://serverfault.com/questions/831444/php-error-log-per-vhost/831666#831666

touch /path/to/php_error.log
chown www-data:www-data php_error.log
chmod 755 php_error.log

感谢您的回答!

答案 1 :(得分:0)

TL; DR :检查所有祖先目录是否允许Web服务器进行读取/列出。

在我的系统上,我等效的/var/log/apache2/my_php_errors.log给出了同样的错误。我最终在路径的每个级别(ls -ld//var//var/log//var/log/apache2/)上都做了一个/var/log/apache2/my_php_errors.log

其中四个具有权限,使其可以被Web服务器读取。其中之一/var/log/apache2/没有。当我将文件移出apache2目录时,一切开始正常工作。例如。 /var/log/php/并在新目录上设置适当的权限/所有权(例如,www-data.adm设置为750)。

prompt> ls -ld /var/log/php/
drwxr-x--- 2 www-data adm 4096 Nov  1 13:31 /var/log/php/

您还可以更改/var/log/apache2/的权限,但这似乎是一个安全/隐私问题。创建新目录并保留现有结构是更安全的。

必须更改权限的原因是,它不再使用某个版本的syslog来发布到日志文件。 syslog变体以root身份运行,并接受来自非root用户的消息。但就我而言,我是从Web服务器指定文件的,这导致权限错误。

有一个fix使用syslog,因此可以保留相同的所有权。我没有尝试进行这项工作,因为这是针对测试服务器的。

这可能不是您遇到的问题,但是我很确定我使用的是/var/log/apache2/的默认权限。因此很有可能是问题所在。即使不是,这也是我一直在寻找故障排除建议的地方之一。因此,下次我发生这种情况时,我会提醒您要检查的内容。