【问题标题】:Laravel 5 permission denied when writing in log file写入日志文件时Laravel 5权限被拒绝
【发布时间】:2015-08-02 10:55:49
【问题描述】:

我有 Ubuntu 和 Laravel 5 框架,我在浏览器中看到白屏。
当我更改storage/logs 目录权限时,它会有所帮助,但由于“每日”日志配置,我必须每天都这样做。

【问题讨论】:

    标签: ubuntu logging laravel-5


    【解决方案1】:

    简答:

    sudo chmod -R 777 vendor storage
    echo "umask 000" | sudo tee -a /etc/resolv.conf
    sudo service apache2 restart

    广泛回答:

    当您在 Apache 服务器上启动 Laravel 5 框架并默认启用“每日”选项来创建日志文件时,有时您会面临由于文件权限而禁止写入日志文件的情况。
    通常,当您拥有 php 项目时,所有文件都属于 www-data 用户,您当前的用户无需写入日志文件。
    关于 Laravel,两个不同的进程需要写入您的日志文件:
    1) Apache 服务器(用户www-data)当您在浏览器中执行某些操作时;
    2) 在命令行中执行php artisan something 时的Php 进程(您的用户)。

    当然,每次你想使用artisan的时候都可以执行sudo -u www-data php artisan your_command(就像建议的here一样),但是有点烦。
    首先,您需要授予 Apache 用户对供应商和存储目录的权限。 最简单的方法(但不是最好的方法)是执行: sudo chmod -R 777 vendor storage

    现在,让我们看看在这两种情况下创建日志文件时会发生什么。

    如果最初的日志文件 storage/logs/laravel-2015-mm-dd.log 是通过引发的错误创建的 php artisan something命令(案例2),日志文件会有

    `-rw-rw-r-- your_user:your_user` 
    

    权限。
    如果它是由您的 apache 服务器创建的(案例 1),通常在 www-data 用户下启动,权限将如下所示:

    -rw-r-r-- www-data:www-data
    

    所以,我的建议是更改 apache 新创建文件的许可。
    让我们将umask 000 行添加到/etc/resolv.conf 文件中。

    echo "umask 000" | sudo tee -a /etc/resolv.conf
    

    现在,

    sudo service apache2 restart
    

    就是这样。
    请注意,由于可能存在安全风险,此解决方案仅适用于开发环境

    【讨论】:

    • tbh,你永远都不想 chmod 777。
    • 生产环境怎么办?例如,在 DigitalOcean 上?为 Nginx 做些什么?例如,在 DigitalOcean LEMP 上?
    • 关于如何使用生产服务器完成此任务的任何更新?
    • 这是非常糟糕的建议。不要遵循这一点。首先,/etc/resolv.conf 与文件权限无关。如果你疯了,你可以在 /etc/login.defs 中使用 pam_umask 为常见的 Linux 系统设置默认的 umask。另一个常见的放置位置是 /etc/profile,甚至 /etc/rc.local。不过,您应该这样做。安全性很重要,即使在开发系统上也是如此。
    • 有些海报对你很粗鲁。您提出了一个其他发帖人没有想到的关键概念,即 Artisan 和网络流量可以来自不同的用户。这在我的情况下造成了巨大的问题。我的调度程序每五分钟运行一次 Artistan ......但以 root 身份运行。所以我的日志文件会旋转到根目录,然后当一个网络请求试图写入日志时,它会导致系统崩溃。我通过确保我的艺术家调度程序的 crontab 命令以 Web 用户...而不是 root 身份执行来解决此问题。谢谢!
    【解决方案2】:

    出于明显的安全原因,storagevendor 文件夹的权限应保持在 775

    但是,您的计算机和服务器 Apache 都需要能够写入这些文件夹。例如:当你运行php artisan之类的命令时,你的电脑需要写入storage的日志文件。

    您需要做的就是将文件夹的所有权交给 Apache:

    sudo chown www-data:www-data /path/to/your/project/vendor
    sudo chown www-data:www-data /path/to/your/project/storage
    

    然后您需要将您的计算机(引用为username)添加到服务器Apache 所属的组中。像这样:

    sudo usermod -a -G www-data userName
    

    大多数情况下,groupNamewww-data,但您可能希望将其替换为正确的组。

    【讨论】:

    • 不幸的是,您的方法无济于事。默认情况下,Apache 创建具有权限 644 (-rw-r--r--) 的新文件。这意味着 artisan 不能写入同一个文件,无论它是否属于 www-data 组。
    • 你是对的。我将删除我的答案。但是,您应该考虑将用户添加到 www-data 组并保留 775,而不是 777 所有文件夹。我们需要一个也适用于生产的解决方案。
    【解决方案3】:
    • chmod 777 通常是一个非常危险的安全风险。
    • 存储文件夹的 chmod 775 也可以考虑用户
      属于网络服务器组。

    • 使用 -R 非常危险,因为对于文件,执行权限根本不需要。

    • chmod 664 用于存储内的文件。 chmod 775 里面的文件夹

    【讨论】:

      【解决方案4】:

      我遇到了同样的错误。通过使用以下命令,我可以解决它。出于某种原因,这与日志文件无关。

      sudo chgrp -R www-data storage bootstrap/cache
      sudo chmod -R ug+rwx storage bootstrap/cache
      

      【讨论】:

      • 就在这里,对我来说这是最好的答案——简洁明了。
      • 你能解释一下为什么这些命令解决了这个问题吗?它也对我有用。
      【解决方案5】:

      config/login.php中,设置了检查权限:

      'daily' => [
          'driver' => 'daily',
          'path' => storage_path('logs/laravel.log'),
          'level' => 'debug',
          'days' => 14,
          'permission' => octdec('0666'),
      ],
      

      【讨论】:

      • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 2018-02-20
      • 1970-01-01
      • 2013-03-19
      • 2023-04-07
      • 2018-07-08
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多