【问题标题】:PHP can't write to error log - permission deniedPHP 无法写入错误日志 - 权限被拒绝
【发布时间】:2016-03-01 19:30:50
【问题描述】:

在我多年以来的第一个 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 中的权限被拒绝

这是我检查并尝试过的:

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

我错过了什么?

编辑:它能够写入一般的 Apache 错误日志。奥秘在于为什么它不能写入同一目录中具有相同所有权和权限的另一个文件。

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

【问题讨论】:

  • 我们需要更多关于 $error_log 变量的信息。它是日志文件的目的地。将其留空以获得默认日志文件。例如,它是在 web 根目录中还是之外。如果在外部,您可能需要检查 ini 中允许的包含路径。
  • 尝试对 PHP 需要写入的文件使用 777 看看是否可行
  • @frosty 我是我自己的服务器管理员。
  • 另外,确保 selinux 被禁用。人们总是忘记那个
  • @Xorifelse 我已经描述了如何更改该文件的权限。无论如何,我为什么希望它是可执行的?

标签: php


【解决方案1】:

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/ 的默认权限。所以很可能是问题所在。即使不是,这也是我寻找故障排除建议的地方之一。因此,下次类似的事情发生在我身上时,我会提醒我要检查的内容。

【讨论】:

    【解决方案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
    

    感谢您引导我找到答案!

    【讨论】:

    • 这似乎不适用于我的情况,因为我尝试将所有者设置为www-data,并将权限设置为更广泛的777。不幸的是,我无法再访问遇到此问题的环境。
    • PHP(或apache2)需要具备在目录中创建和写入文件的能力。将日志文件放在 html 目录中没有任何问题,但我不希望公共可查看目录中的 error_log 文件......另外,我不想扩大虚拟服务器根目录的范围......所以我创建了根目录中的文件(触摸),然后为其设置文件的更广泛的权限。
    猜你喜欢
    • 2018-02-20
    • 2011-06-11
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 2012-02-11
    • 2015-08-02
    • 2013-03-19
    相关资源
    最近更新 更多