ChatGPT解决这个技术问题 Extra ChatGPT

如何修复错误:laravel.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 根本没有帮助。

https://i.stack.imgur.com/Eq2eN.png

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

H
Hamid Parchami

切勿将目录设置为 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

对于阿帕奇使用:

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% 同意系统管理员不应该只允许访问所有内容以避免解决真正的问题。
J
Jon Winstanley

永远不要将 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 每次重新启动计算机时我都需要提供权限。有什么建议我该如何解决?
J
Jon Winstanley

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

退出虚拟机使用控制台,转到您的同步文件夹(流浪者) sudo chown -R $USER:www-data storage chmod -R 775 storage

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

现在它正在工作。

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

编辑:

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

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

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

我做到了......而且我是格鲁特!仍然无法正常工作... laravel 5 ...重命名日志文件,laravel 创建了新文件...同样的错误
我没有 config.vm.synced_folder 因为我正在使用宅基地,我该如何解决这个问题?
您不应该随意使用 777。
我没有看到在我确切知道里面有什么的文件夹上使用 777 的问题(一个虚拟示例项目)
这绝对不应该是公认的答案。它是可怕的。永远不要设置 777。永远。
T
Turan Zamanlı

它也可能是 SELinux。 (Centos,红帽)

确定终端上 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
D
Daniel Dewhurst

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

cd 进入你的 Laravel 项目。

sudo chmod -R 755 存储

sudo chmod -R 755 引导程序/缓存

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

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

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


每当某些内容适用于 777 而不适用于 755 或 775 时,这意味着您的服务器未使用相应的用户,例如:nginxapachehttpdwww-data 等...
@daniel此代码有效,但每次重新启动笔记本电脑后,我都需要再次提供权限。我应该怎么办 :(
使用 ..755 命令。没有工作。使用 777 - 工作。然后设置回 755 并继续工作。然后我检查了API。没有工作,我做了 777->755 并且 API 开始工作。有人知道为什么吗?
H
Hamza Rashid

可能为时已晚,但可能对某人有所帮助,更改目录权限对我有用。

假设您的 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 目录的权限意味着您向攻击者提供了炸毁整个系统的密钥。不要这样做。
D
Davron Achilov

添加到 composer.json

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

composer install之后


G
Gauravbhai Daxini

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

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

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

对于 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 的链接,但是为此情况下甚至不需要。


T
Thilina Dharmasena

如果你使用 cmd

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

如果您使用图形用户界面

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

https://i.stack.imgur.com/Cb0bm.png

使用以下代码更改权限

sudo chmod -R 777 storage

那么你的文件属性可能是

https://i.stack.imgur.com/hB4DG.png

然后检查您的设置并执行 laravel 命令它将起作用:)


P
Pronab Roy

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

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

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


您也可以尝试 php artisan optimize:clear 它将运行所有清除命令
P
Pratik

在 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权限就可以了
你是最好的
J
Jacob booker

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 的情况下非常重要的答案。尽管命令中的打印错误很少,但这个答案节省了我的时间!
S
Sanaulla

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

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

不,这不适用于 apache
@FernandoTorres Bro,这是权限问题。我仍然使用 Apache 并通过命令解决。确保您是项目根路径。
那太棒了!谢谢!
S
Saddan

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

https://i.stack.imgur.com/7L5GQ.png

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


D
Dan Christian Febra

尝试这个

cd /var/www/html setenforce 0 服务 httpd 重启


你能解释一下这是做什么的吗?
无需更改目录即可使用 setenforce 但无论如何完全禁用 SELinux 只是为了解决一个权限问题是错误的。
我总是忘记这个命令,你再节省一次。 <3
S
Sumit Wadhwa

如果我正在运行 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
B
B. León

此解决方案特定于 laravel 5.5

您必须更改几个文件夹的权限: chmod -R -777 storage/logs chmod -R -777 storage/framework for the above folder 775 or 765 did not work for my project

chmod -R 775 bootstrap/cache 

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


P
Patrick.SE

我不太热衷于将我的文件夹权限更改为 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 <project>,就会发生这种情况。在这种情况下,请确保在项目中使用递归 chown 命令来更改 user:group 设置。在大多数默认情况下,www-data 是服务器和 php 的主要设置,在这种情况下,需要确保文件夹不会超出 www-data 的范围。

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


C
Crisoforo Gaspar

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

删除所有生成的缓存文件: rm bootstrap/cache/*.php 创建一个新的 laravel.log 文件并使用该文件更新权限: chmod -R 775 storage


L
Lesley Peters

尝试了这里建议的任何内容,但均未成功。

对我有用的是:

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

E
Escapola

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

要解决此问题,请通过这些步骤顺序

更新作曲家

 sudo composer self-update

更改存储文件夹写入权限

 sudo chmod -R ugo+rw storage

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

要检查权限,请从项目根目录运行以下命令

ls -l 

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

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

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

sudo mkdir public

附言。有关 chmod 命令的详细信息,请查看 this


A
Amit

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

sudo chmod -R ugo+rw storage

R
Rinkal Jasani

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

只需重新启动系统并重试

这对我有用