如何修复laravelv .log无法打开的错误?

事实上,我是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一点用都没有。

Permissions

608998 次浏览

永远不要在你的服务器上使用777,但在你自己的机器上,有时我们需要做更多的775,因为

chmod -R 775 storage

意味着

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

如果你的服务器不是作为Vagrant运行,它将无法写入,所以你有两个选择:

chmod -R 777 storage

或者将组改为你的webserver用户,假设它是www-data:

chown -R vagrant:www-data storage

要解决这个问题,您需要将目录的所有权更改为web服务器使用的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"]

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

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

如果755不行,你可以试试777。777可不安全!

根据您的web服务器的设置方式,您可以更具体地设置您的权限,并仅将它们授予您的web服务器用户。谷歌WEB SERVER NAME Laravel file permissions获取更多信息。

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

< p > 不要将目录设置为777。您应该更改目录所有权。因此,将您当前登录的用户设置为所有者,并将web服务器用户(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服务器用户和组取决于您的web服务器和操作系统。要找出您的web服务器用户和组,请使用以下命令。nginx使用:

ps aux|grep nginx|grep -v grep

对于apache使用:

ps aux | egrep '(apache|httpd)'

这个解决方案是针对laravel 5.5的

你必须改变几个文件夹的权限: chmod -R -777 storage/logs . sh chmod -R -777 storage/framework 对于上面的文件夹775或765不适合我的项目

chmod -R 775 bootstrap/cache

此外,项目文件夹的所有权应该如下(当前用户):(web服务器用户)

我不太想把我的文件夹权限改为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拥有,那么您将继续遇到这个问题。如果你将sudo laravel new <project>作为根,就会发生这种情况。在这种情况下,请确保在项目中使用递归chown命令来更改user:group设置。在大多数默认情况下,www-data是服务器和php的主要设置,在这种情况下,问题是要确保文件夹不在www-data的范围内。

我的项目安装在我的主目录下。Ubuntu 16.04和Laravel 5.5。

试试这个

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

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

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

它也可能是SELinux。(Centos RedHat)

确定终端上SElinux的状态:

$ sestatus

如果status为enabled,写命令禁用SElinux

$ setenforce Permissive

或者你可以执行这个命令

$ sudo setenforce 0

对于所有在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

最后,确保您的主机、ip和虚拟主机都正确用于远程访问。

Selinux的目的是限制对根用户的访问,所以只有必要的东西可以访问,至少从一般的概述来看,它是额外的安全,禁用它不是一个好的实践,有许多学习Selinux的链接,但在这种情况下甚至不需要它。

添加到composer.json

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

composer install

如果使用cmd

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

如果你使用GUI

首先进入项目,右键单击存储,检查属性,然后进入Permissions选项卡

enter image description here

使用下面的代码更改权限

sudo chmod -R 777 storage

那么您的文件属性可能是

enter image description here

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

在我的特定情况下,我有一个配置文件生成并缓存到bootstrap/cache/目录,因此我的步骤如下:

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

    • chmod -R 775 storage
    • 李< / ul > < / >

在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

这可能有点晚了,但可能对某些人有帮助,更改目录权限对我有用。

假设你的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上并且没有终端可用,你可以通过右键单击提到的目录及其子目录来更改权限。

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

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

希望这也能帮助到其他人。

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

在下面的图片中,你可以看到我所有的文件/文件夹都在根用户下(除了存储和引导,因为我改变了所有权),但我是以管理员身份登录的(在改变所有权之前),这就是为什么它总是拒绝授予权限。所以我需要把这两个文件夹的所有权改为管理员 < img src = " https://i.stack.imgur.com/7L5GQ.png " alt = " / > < / p > 我是怎么做的呢, 转到项目目录并运行以下命令。 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 < / p >

1-‍nginx用户和php-fpm用户、应用程序所有者用户必须相同:

运行命令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 .

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

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

这是我在运行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

不写任何命令或不给任何权限最简单的方法来解决这个问题

重启系统再试一次

这是我的工作

尝试了这里建议的任何方法都没有成功。

对我有用的是:

sudo chmod -R ugo+rw storage
sudo chmod -R ugo+rw storage/logs

您可能已经知道,这个问题是由于没有对日志文件夹(存储的子文件夹)的写权限引起的。

要解决这个问题,需要经过以下一系列步骤

  1. 更新的作曲家
 sudo composer self-update
  1. 修改存储文件夹写权限
 sudo chmod -R ugo+rw storage

现在存储文件夹应该有权限drwxrwxrwx

从项目根运行以下命令检查权限

ls -l

同样,如果您在上述步骤后遇到以下错误

 ErrorException chdir(): No such file or directory (errno 2)

只需在项目根文件夹中使用创建一个名为public的文件夹

sudo mkdir public

有关修改文件权限命令的更多信息,请查看

下面的命令肯定会起作用。

sudo chmod -R ugo+rw storage

在Linux中

sudo chown -R www-data:root /var/www/name-project-Laravel
sudo chmod 755 /var/www/name-project-Laravel/storage

Centos和Rockylinnux

chown root:nginx FOLDER_PROJECT -Rf
chmod 775 FOLDER_PROJECT -Rf
cd FOLDER_PROJECT
chmod 777 storage -Rf


setenforce 0

请评价:)

我设法修复它,因为我只通过这个命令授予权限:

复制代码

sudo chmod -R 775 storage

解决方案是添加以下内容:

复制代码

sudo chmod -R ugo+rw storage