【问题标题】:How to fix Error: laravel.log could not be opened?如何修复错误:laravel.log 无法打开?
【发布时间】:2014-06-18 03:46:00
【问题描述】:

事实上,我是 laravel 的新手,我正在尝试创建我的第一个项目。由于某种原因,我不断收到此错误(我什至还没有开始编码)

Error in exception handler: The stream or file "/var/www/laravel/app/storage/logs/laravel.log" could not be opened: failed to open stream: Permission denied in /var/www/laravel/bootstrap/compiled.php:8423

我读过这与权限有关,但 chmod -R 775 storage 根本没有帮助。

【问题讨论】:

  • 在运行 chmod 命令时,您确定您在正确的目录中吗?试试 chmod -R 755 /var/www/laravel/app/storage。另外,用户和组设置为什么?试试 ls -al /var/www/laravel/app/storage
  • 相同的结果(我更新了我的原始帖子以显示文件夹的权限)
  • :/ 由于某种原因它仍然无法正常工作。我之前没有提到它,但我正在使用 vagrant。所以我的 www 文件夹在虚拟机上(apache、php 和其他所有东西都在上面运行)。我不确定这是否与任何事情有关,但我想我会提到它以防万一。 (我正在使用 vm 创建我的项目,使用 composer)
  • 那些建议 777 的人,试试 google 这个短语:“production db_password filetype:env inurl:com”
  • 禁用 SELINUX 对我有用。

标签: php laravel permission-denied


【解决方案1】:

可能会迟到,但可能会对某人有所帮助,更改目录权限对我有用。

假设您的 Laravel 项目位于 /var/www/html/ 目录中。转到此目录。

cd /var/www/html/

然后更改storage/bootstrap/cache/目录的权限。

sudo chmod -R 775 storage/
sudo chmod -R 775 bootstrap/cache/

如果权限775 不起作用,请尝试设置777。 (警告!这是最宽松的权限,请谨慎使用)。

sudo chmod -R 777 storage/
sudo chmod -R 777 bootstrap/cache/

cPanel:如果您在 cPanel 上并且没有可用的终端,您可以通过右键单击提到的目录及其子目录来更改权限。

【讨论】:

  • 授予777storage 目录的权限意味着您向攻击者提供了一个可以炸毁整个系统的密钥。不要这样做。
【解决方案2】:

不写任何命令或不授予任何权限解决此问题的最简单方法

只需重新启动系统并重试

这对我有用

【讨论】:

    【解决方案3】:

    如果我正在运行 Apache,我会这样做:

    sudo chown -R $USER:www-data my_laravel_project/
    
    sudo chmod -R 775 my_laravel_project/storage
    
    sudo chmod -R 775 my_laravel_project/bootstrap/cache
    
    cd my_laravel_project
    
    php artisan optimize:clear
    

    【讨论】:

    • 这行得通吗?
    • 我今天测试了它,它工作正常! @JenuelGanawed
    【解决方案4】:

    1- ‍nginx用户和php-fpm用户和app owner-user必须相同:

    运行命令sudo vi /etc/nginx/nginx.conf如下变化:

    user nginx nginx;
    

    运行命令sudo vi /etc/php-fpm.d/www.conf如下变化:

    listen.owner = nginx
    listen.group = nginx
    listen.mode = 0660
    user = nginx
    group = nginx
    

    然后重启nginx和php-fpm服务

    在命令下运行

    sudo chown nginx:nginx -R "your_project_path"
    

    2- 通过在项目路径中运行以下命令来更改文件 SELinux 安全上下文

    chcon -R -t httpd_sys_content_t .
    chcon -R -t httpd_sys_rw_content_t .
    

    【讨论】:

    • 在启用 SELinux 的情况下非常重要的答案。尽管命令中的打印错误很少,但这个答案节省了我的时间!
    【解决方案5】:

    只需从项目根目录运行以下命令 -

    sudo chmod -R 775 storage
    sudo chown -R $USER:www-data storage
    

    【讨论】:

    • 不,这在 apache 上不起作用
    • @FernandoTorres Bro,这是权限问题。我仍然使用 Apache 并通过命令解决。确保您是项目根路径。
    • 太棒了!谢谢!
    【解决方案6】:

    最多人建议更改文件权限 777 或 775,我认为这不是解决此问题的合适方法。您只需要更改storagebootstrap 文件夹的所有权。

    在下面的图片中,您可以看到我的所有文件/文件夹都在 root 用户下(除了存储和引导程序,因为我更改了所有权),但我以管理员身份登录(在更改所有权之前)这就是为什么它总是授予权限否认。所以我需要将这两个文件夹的所有权更改为管理员

    那么我是怎么做到的, 转到您的项目目录并运行以下命令。 sudo chown -R yourusername:www-data storage, sudo chmod -R ug+w storage, sudo chown -R yourusername:www-data bootstrap, sudo chmod -R ug+w bootstrap

    【讨论】:

      【解决方案7】:

      我坚持这个问题尝试了不同的命令,但这些将有助于解决问题

      php artisan route:clear
      php artisan config:clear
      php artisan cache:clear
      

      希望它也对其他人有所帮助。

      【讨论】:

      • 你也可以试试 php artisan optimize:clear 它将运行所有的 clear 命令
      【解决方案8】:

      您需要调整storagebootstrap/cache的权限。

      • cd 进入你的 Laravel 项目。
      • sudo chmod -R 755 storage
      • sudo chmod -R 755 bootstrap/cache

      如果 755 不起作用,您可以尝试 777。不过 777 并不安全!

      根据您的网络服务器的设置方式,您可以更具体地使用您的权限,并且只将它们授予您的网络服务器用户。谷歌WEB SERVER NAME Laravel file permissions了解更多信息。

      在撰写本文时,这是针对 Laravel 5.4

      【讨论】:

      • 当某些东西适用于 777 而不适用于 755 或 775 时,这意味着您的服务器没有使用相应的用户,例如:nginxapachehttpdwww-data、等等...
      • @daniel 此代码有效,但每次重新启动笔记本电脑后,我都需要再次提供权限。我该怎么办:(
      【解决方案9】:

      如果你使用 cmd

      sudo chown -R $USER:www-data storage
      sudo chown -R $USER:www-data bootstrap/cache
      

      如果你使用图形界面

      首先进入项目并右键单击存储并检查属性并进入权限选项卡

      使用以下代码更改权限

      sudo chmod -R 777 storage
      

      那么你的文件属性可能是

      然后检查你的设置并执行 laravel 命令它会工作:)

      【讨论】:

        【解决方案10】:

        也可能是 SELinux。 (Centos、RedHat)

        确定终端上 SElinux 的状态:

        $ sestatus
        

        如果状态是启用,写命令禁用SElinux

        $ setenforce Permissive
        

        或者你可以执行这个命令

        $ sudo setenforce 0

        【讨论】:

        • 这是唯一有效的方法,你能解释一下它的作用吗?
        • @hack4mer 您可以阅读有关 seLinux 的更多信息。 en.wikipedia.org/wiki/Security-Enhanced_Linux
        • 我见过的奇怪的东西,为什么搜索了6个多小时后它仍然有效
        • 唯一对我有用的解决方案.. 谢谢。但是每次服务器重启都会出现这个问题,你知道如何在服务器重启的情况下让它生效吗?
        • @JuanAngel 你必须永久禁用服务。使用编辑器 vim /etc/sysconfig/selinux 打开,然后将指令 SELinux=enforcing 更改为 SELinux=disabled
        【解决方案11】:

        永远不要将 777 用于您的实时服务器上的目录,但在您自己的机器上,有时我们需要做的不仅仅是 775,因为

        chmod -R 775 storage
        

        意思

        7 - Owner can write
        7 - Group can write
        5 - Others cannot write!
        

        如果您的网络服务器不是作为 Vagrant 运行,它将无法写入,因此您有 2 个选项:

        chmod -R 777 storage
        

        或将组更改为您的网络服务器用户,假设它是www-data

        chown -R vagrant:www-data storage
        

        【讨论】:

        • 在我的情况下不需要 chmod,因为它已经设置好了,但是在 Fedora 20 上它需要:chown -R apache:apache laravelproject
        • 通过 samba/vagrant 安装文件夹时遇到问题 - chown -R vagrant:www-data storage 帮我解决了,谢谢。
        • chmod -R 777 存储对我有用。我尝试更改组,但我不断收到www-data: illegal group name
        • @antonio 我每次重新启动计算机时都需要提供权限。有什么建议可以解决吗?
        【解决方案12】:

        要解决此问题,您需要将目录的所有权更改为网络服务器使用的 unix 用户。

        1. 退出虚拟机
        2. 使用控制台,转到您同步的文件夹 (vagrant)
        3. sudo chown -R $USER:www-data storage
        4. chmod -R 775 存储

        虽然我使用VM用户在VM中创建了项目,但该文件夹属于真实计算机中的用户;所以,当尝试

        现在它正在工作。

        感谢所有帮助我解决这个问题的人

        编辑:

        实际上,它仍然无法正常工作,它仍然给了我“权限被拒绝”的问题。

        这就是我所做的,我像这样修改了我的 Vagrantfile:

        config.vm.synced_folder "./app","/var/www/", create:true,
        :owner => "vagrant",
        :group => "www-data",
        :mount_options => ["dmode=775","fmode=664"]
        

        【讨论】:

        • 我做到了...而且我是 gROOT!还是不行... laravel 5 ...重命名日志文件,laravel创建了新的...同样的错误
        • 我没有 config.vm.synced_folder 因为我正在使用宅基地,我该如何解决这个问题?
        • 你不应该随意使用 777。
        • 我没有看到在我确切知道里面有什么的文件夹上使用 777 的问题(一个虚拟示例项目)
        • 这绝对不是公认的答案。它是可怕的。永远不要设置 777。永远。
        【解决方案13】:

        在 Laravel 中,您应该在 storagecache 目录上设置 ACL,以便 Web 服务器用户可以对该目录进行读/写。打开一个新终端并运行以下命令:

        HTTPDUSER=$(ps axo user,comm | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\  -f1)
        
        sudo setfacl -dR -m u:"$HTTPDUSER":rwX -m u:$(whoami):rwX bootstrap/cache storage/
        sudo setfacl -R -m u:"$HTTPDUSER":rwX -m u:$(whoami):rwX bootstrap/cache storage/
        

        参考资料:

        https://symfony.com/doc/3.4/setup/file_permissions.html#using-acl-on-a-system-that-supports-setfacl-linux-bsd

        https://linux.die.net/man/1/setfacl

        【讨论】:

        • 太棒了。谢谢你。这个对我有用。 nginx 以用户 nginx 运行,但上面的命令返回 apache,解决了它!令人毛骨悚然的是,有多少人认为盲目设置 777 权限是可以的
        • 你是最棒的
        【解决方案14】:

        切勿将目录设置为 777。您应该更改目录所有权。因此,将您登录的当前用户设置为所有者,并将网络服务器用户(www-data,apache,...)设置为组。 你可以试试这个:

        sudo chown -R $USER:www-data storage
        sudo chown -R $USER:www-data bootstrap/cache
        

        然后设置目录权限试试这个:

        chmod -R 775 storage
        chmod -R 775 bootstrap/cache
        

        更新:

        网络服务器用户和组取决于您的网络服务器和操作系统。要弄清楚您的 Web 服务器用户和组是什么,请使用以下命令。对于 nginx 使用:

        ps aux|grep nginx|grep -v grep

        供apache使用:

        ps aux | egrep '(apache|httpd)'

        【讨论】:

        • 谢谢!总之你也可以这样做:sudo chown -R {your current user}:www-data storage bootstrap/cache
        • @RameshPareek 你是对的,但我只是想更清楚一点;)
        • 这对我不起作用。我刚收到chown: www-data: illegal group name。将目录设置为 777 是唯一有效的方法
        • @MattD 我猜mac上的apache组是_www试试这个sudo chgrp -R _www bootstrap/cache。看看这篇文章会很有帮助:stackoverflow.com/a/6419695/2125114
        • 这应该是选择的答案,100% 同意系统管理员不应该只允许访问所有内容以避免解决真正的问题。
        【解决方案15】:

        在我的特殊情况下,我生成了一个配置文件并将其缓存到 bootstrap/cache/ 目录中,所以我的步骤是:

        1. 删除所有生成的缓存文件:rm bootstrap/cache/*.php
        2. 创建一个新的laravel.log 文件并使用以下命令更新文件的权限:

          • chmod -R 775 storage

        【讨论】:

          【解决方案16】:

          添加到composer.json

          "scripts": {
              "post-install-cmd": [
                    "chgrp -R www-data storage bootstrap/cache",
                    "chmod -R ug+rwx storage bootstrap/cache"
               ]
          }
          

          composer install之后

          【讨论】:

            【解决方案17】:

            对于 Laravel 上下文中的所有 Centos 7 用户,无需禁用 Selinux,只需运行以下命令:

            yum install policycoreutils-python -y # might not be necessary, try the below first
            
            semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/laravel/storage(/.*)?" # add a new httpd read write content to sellinux for the specific folder, -m for modify
            semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/laravel/bootstrap/cache(/.*)?" # same as the above for b/cache
            
            restorecon -Rv /var/www/html/ # this command is very important to, it's like a restart to apply the new rules
            

            最后,确保您的主机、ips 和虚拟主机都正确,可以进行远程访问。

            Selinux 旨在限制对 root 用户的访问,因此只能访问必要的东西,至少在通用概述上,这是额外的安全性,禁用它不是一个好习惯,有很多学习 Selinux 的链接,但对于这种情况,它甚至不是必需的。

            【讨论】:

              【解决方案18】:

              运行以下命令,您可以在命令开头添加sudo,具体取决于您的系统:

              chmod -R 775 storage/framework
              chmod -R 775 storage/logs
              chmod -R 775 bootstrap/cache 
              

              【讨论】:

              • 永远不要使用 777。有了 777 权限,您就可以让任何有连接的人完全访问具有这些权限的文件或目录。他们可能会以他们选择的任何方式更改它们,包括恶意更改。许多帐户黑客事件源于 777 权限。
              【解决方案19】:

              试试这个

              1. cd /var/www/html
              2. setenforce 0
              3. 服务 httpd 重启

              【讨论】:

              • 你能解释一下这是做什么的吗?
              • 无需更改目录即可使用setenforce,但无论如何为了解决一个权限问题而完全禁用SELinux是错误的。
              • 我总是忘记这个命令,你再节省一次。
              【解决方案20】:

              此解决方案特定于 laravel 5.5

              您必须更改几个文件夹的权限: chmod -R -777 存储/日志 chmod -R -777 存储/框架 对于上述文件夹,775 或 765 不适用于我的项目

              chmod -R 775 bootstrap/cache 
              

              项目文件夹的所有权也应如下(当前用户):(网络服务器用户)

              【讨论】:

                【解决方案21】:

                我不太热衷于将我的文件夹权限更改为 777。以下是我解决此问题的方法。

                首先,我更改了在本地机器上运行 Web 服务器的用户(我运行 nginx,但原则适用于任何地方):

                $> sudo vim /etc/nginx/nginx.conf
                user <my_user> #inside nginx.conf
                service nginx reload
                

                之后,我在 public/ 文件夹下创建了另一个 index.php 文件,以找出谁在运行我的 php-fpm 版本以及我将在哪里进行更改:

                <?php
                phpinfo();
                ?>
                

                重新加载页面,我发现www-data 是用户(在环境部分下)。我还发现我正在运行 php 7.1。我继续更改用户:

                $> sudo vim /etc/php/7.0/fpm/pool.d/www.conf 
                #Look for www-data or the following variables: user, group, listen.user, listen.group.
                

                最后,我给文件夹以下权限:

                sudo chmod -R 775 ./storage/
                

                现在,我使用一个简单的方法确保我是文件夹的所有者:

                ls -al
                

                如果您将服务器和 php-fpm 用户设置为您自己,并且文件夹由 root 拥有,那么您将不断遇到此问题。如果您以 root 身份执行 sudo laravel new &lt;project&gt;,则可能会发生这种情况。在这种情况下,请确保在项目中使用递归 chown 命令来更改 user:group 设置。在大多数默认情况下,www-data 是服务器和 php 的主要设置,在这种情况下,需要确保文件夹不会超出 www-data 的范围。

                我的项目设置在我的主目录中。在 Ubuntu 16.04 和 Laravel 5.5 上。

                【讨论】:

                  猜你喜欢
                  • 2020-05-24
                  • 2014-07-26
                  • 2020-09-28
                  • 2016-06-13
                  • 2020-03-11
                  • 2011-01-22
                  • 1970-01-01
                  • 2019-03-29
                  相关资源
                  最近更新 更多