事实上,我对 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
切勿将目录设置为 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)'
永远不要将 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
chown -R apache:apache laravelproject
chown -R vagrant:www-data storage
为我完成了,谢谢。
www-data: illegal group name
要解决此问题,您需要将目录的所有权更改为 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"]
它也可能是 SELinux。 (Centos,红帽)
确定终端上 SElinux 的状态:
$ sestatus
如果启用状态,则编写命令禁用 SElinux
$ setenforce Permissive
或者你可以执行这个命令
$ sudo setenforce 0
您需要调整 storage
和 bootstrap/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
nginx
、apache
、httpd
、www-data
等...
可能为时已晚,但可能对某人有所帮助,更改目录权限对我有用。
假设您的 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 上并且没有可用的终端,您可以通过右键单击提到的目录及其子目录来更改权限。
777
对 storage
目录的权限意味着您向攻击者提供了炸毁整个系统的密钥。不要这样做。
添加到 composer.json
"scripts": {
"post-install-cmd": [
"chgrp -R www-data storage bootstrap/cache",
"chmod -R ug+rwx storage bootstrap/cache"
]
}
composer install
之后
运行以下命令,您可以在命令开始时添加 sudo
,具体取决于您的系统:
chmod -R 775 storage/framework
chmod -R 775 storage/logs
chmod -R 775 bootstrap/cache
对于 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 的链接,但是为此情况下甚至不需要。
如果你使用 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 命令它将起作用:)
我坚持这个问题尝试了不同的命令,但这些将有助于解决问题
php artisan route:clear
php artisan config:clear
php artisan cache:clear
希望它也对其他人有所帮助。
在 Laravel 中,您应该在 storage
和 cache
目录上设置 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://linux.die.net/man/1/setfacl
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 .
只需从项目根目录运行以下命令 -
sudo chmod -R 775 storage
sudo chown -R $USER:www-data storage
最多人建议更改文件权限 777 或 775,我认为这不是解决此问题的合适方法。您只需更改 storage
和 bootstrap
文件夹的所有权。
https://i.stack.imgur.com/7L5GQ.png
那么我是如何做到的,转到您的项目目录并运行以下命令。 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
尝试这个
cd /var/www/html setenforce 0 服务 httpd 重启
setenforce
但无论如何完全禁用 SELinux 只是为了解决一个权限问题是错误的。
如果我正在运行 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
此解决方案特定于 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
项目文件夹的所有权也应如下(当前用户):(网络服务器用户)
我不太热衷于将我的文件夹权限更改为 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 上。
在我的特殊情况下,我生成了一个配置文件并将其缓存到 bootstrap/cache/
目录中,因此我的步骤:
删除所有生成的缓存文件: rm bootstrap/cache/*.php 创建一个新的 laravel.log 文件并使用该文件更新权限: chmod -R 775 storage
尝试了这里建议的任何内容,但均未成功。
对我有用的是:
sudo chmod -R ugo+rw storage
sudo chmod -R ugo+rw storage/logs
你可能已经知道这个问题是由于日志文件夹没有写权限引起的,日志文件夹是存储的子文件夹。
要解决此问题,请通过这些步骤顺序
更新作曲家
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
下面的命令肯定会起作用。
sudo chmod -R ugo+rw storage
不写任何命令或不授予任何权限解决此问题的最简单方法
只需重新启动系统并重试
这对我有用
不定期副业成功案例分享
sudo chown -R {your current user}:www-data storage bootstrap/cache
chown: www-data: illegal group name
。将目录设置为 777 是唯一有效的方法_www
试试这个sudo chgrp -R _www bootstrap/cache
。看看这篇文章会很有帮助:stackoverflow.com/a/6419695/2125114