Como corrigir o erro: laravel.log não pôde ser aberto?

184

Eu sou bem novo em laravel, na verdade, e estou tentando criar meu primeiro projeto. por algum motivo, continuo recebendo esse erro (ainda nem comecei a codificar)

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

Eu li que isso tem algo a ver com permissões, mas chmod -R 775 storagenão ajudou em nada.

Permissões

FRR
fonte
Você tem certeza de que está no diretório certo ao executar esse comando chmod? Tente chmod -R 755 / var / www / laravel / app / storage. Além disso, como o usuário e o grupo estão definidos? Tente ls -al / var / www / laravel / app / storage
Ryan LaB
mesmos resultados (eu atualizei meu post original para mostrar as permissões da pasta)
FRR
: / por algum motivo, ainda não funciona. Eu não mencionei isso antes, mas estou usando vagabundo. então minha pasta www está em uma VM (apache, php e tudo mais está sendo executado nela). Não tenho certeza se isso tem algo a ver com alguma coisa, mas pensei em mencionar isso por precaução. (Eu estou criando meu projeto withing a VM, utilizando compositor)
FRR
13
Esses caras que sugerem 777, experimentar o Google esta frase: "A produção db_password filetype: env inurl: com"
Tarasovych
1
Desativar o SELINUX funcionou para mim.
Prakash P

Respostas:

306

Nunca defina um diretório para 777 . você deve alterar a propriedade do diretório. defina o usuário atual com o qual você está conectado como proprietário e o usuário do servidor da web (www-data, apache, ...) como o grupo. Você pode tentar isso:

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

para definir a permissão do diretório, tente o seguinte:

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

Atualizar:

O usuário e o grupo do servidor da Web dependem do servidor da Web e do sistema operacional. para descobrir qual é o usuário e o grupo do servidor da Web, use os seguintes comandos. para uso do nginx:

ps aux|grep nginx|grep -v grep

para uso no apache:

ps aux | egrep '(apache|httpd)'

Hamid Parchami
fonte
4
obrigado! Em resumo, você também pode fazer:sudo chown -R {your current user}:www-data storage bootstrap/cache
Ramesh Pareek
2
@RameshPareek Você está certo, mas eu só queria ter mais clareza;) #
572 Hamid Parchami
1
Isso não funciona para mim. Acabei de receber chown: www-data: illegal group name. Definir o diretório para 777 é a única coisa que funciona
Matt D
3
@ MattD Eu acho que o grupo apache no mac é _wwwtentar isso sudo chgrp -R _www bootstrap/cache. seria útil para dar uma olhada neste post: stackoverflow.com/a/6419695/2125114
Hamid Parchami
3
Essa deve ser a resposta escolhida, 100% concorda que os administradores de sistemas não devem apenas permitir o acesso a tudo para evitar resolver o problema real.
HyperionX
134

Nunca use o 777 para diretórios no servidor ativo, mas em sua própria máquina, às vezes precisamos fazer mais do que 775, porque

chmod -R 775 storage

Significa

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

Se o seu servidor da Web não estiver sendo executado como Vagrant, ele não poderá gravá-lo, portanto, você tem 2 opções:

chmod -R 777 storage

ou altere o grupo para o usuário do servidor da web, supondo que seja www-data:

chown -R vagrant:www-data storage
Antonio Carlos Ribeiro
fonte
Não precisava do chmod no meu caso, pois já estava bem, no Fedora 20, porém:chown -R apache:apache laravelproject
misterjaytee 12/12
Estava com problemas para montar pastas via samba / vagrant - chown -R vagrant:www-data storagefiz isso por mim, obrigado.
Lewis
1
O armazenamento chmod -R 777 funcionou para mim. Eu tentei mudar o grupo, mas eu continuei recebendowww-data: illegal group name
Matt D
57

Para corrigir esse problema, você precisa alterar a propriedade do diretório para o usuário unix que o servidor da web usa.

  1. Saia da VM
  2. Usando o console, acesse sua pasta sincronizada (vagrant)
  3. sudo chown -R $ USER: armazenamento de dados www
  4. Armazenamento chmod -R 775

Embora eu tenha criado o projeto na VM usando o usuário da VM, a pasta pertencia ao usuário no computador real; então, ao tentar

Agora está funcionando.

Obrigado a todos aqueles que me ajudaram a descobrir isso

EDITAR:

Na verdade, ele ainda não estava funcionando, ainda me deu um problema de "permissão negada".

Aqui está o que eu fiz, modifiquei meu arquivo Vagrant assim:

config.vm.synced_folder "./app","/var/www/", create:true,
:owner => "vagrant",
:group => "www-data",
:mount_options => ["dmode=775","fmode=664"]
FRR
fonte
Eu fiz isso ... e EU SOU GROOT! Ainda não está funcionando ... laravel 5 ... renomeado o arquivo de log, laravel criado novo ... mesmo erro
ied3vil
1
Não tenho o arquivo config.vm.synced_folder porque estou usando o homestead, como posso corrigir esse problema?
oleynikd
21
Você não deve usar 777 todos, quer ou não.
IIllIIll
Eu não vejo um problema em usar 777 em uma pasta Eu sei exatamente o que está dentro (um projecto de exemplo simulado)
FRR
2
Isso absolutamente não deve ser a resposta aceita. É terrível. Nunca defina 777. Sempre.
CGriffin 9/05/19
39

Também pode ser o SELinux. (Centos, RedHat)

Determine o status do SElinux no terminal:

$ sestatus

Se o status estiver ativado, escreva o comando para desativar o SElinux

$ setenforce Permissive

Ou você pode executar este comando

$ sudo setenforce 0

Turan Zamanlı
fonte
6
Essa é a única coisa que funcionou. Você pode explicar o que faz?
hack4mer #
2
@ hack4mer, você pode ler mais informações sobre o seLinux. en.wikipedia.org/wiki/Security-Enhanced_Linux
Turan Zamanlı
as coisas estranhas que eu já vi, por que diabos ele funciona depois de procurar por mais de 6 horas
Muhamad Yulianto
1
A única solução que funcionou para mim .. obrigado. Mas o problema volta sempre que o servidor é reiniciado, você sabe como aplicá-lo mesmo se o servidor for reiniciado?
Juan Angel
1
@JuanAngel, você precisa desativar permanentemente o serviço. abrir com o editor vim / etc / sysconfig / selinux e altere o SELinux directiva = impor ao SELinux = disabled
Turan Zamanlı
31

Você precisa ajustar as permissões de storagee bootstrap/cache.

  • cd no seu projeto do Laravel.
  • sudo chmod -R 755 storage
  • sudo chmod -R 755 bootstrap/cache

Você pode tentar o 777 se o 755 não funcionar. O 777 não é seguro!

Dependendo de como o servidor da Web estiver configurado, você poderá ser mais específico com suas permissões e conceder apenas ao usuário do servidor da Web. Google WEB SERVER NAME Laravel file permissionspara mais informações.

No momento da redação deste artigo, isso é para o Laravel 5.4

Daniel Dewhurst
fonte
14

adicionar à composer.json

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

Depois de composer install

Davron Achilov
fonte
12

Execute os seguintes comandos e você pode adicionar sudono início do comando depende do seu sistema:

chmod -R 775 storage/framework
chmod -R 775 storage/logs
chmod -R 775 bootstrap/cache 
gauravbhai daxini
fonte
1
Nunca use o 777. Com as permissões do 777, você concede a qualquer pessoa com uma conexão acesso total aos arquivos ou diretórios com essas permissões. Eles podem alterá-los da maneira que escolherem, incluindo maliciosamente. Muitos incidentes de hackers de conta decorrem de 777 permissões.
Odyssee
8

Para todos os usuários do Centos 7 em um contexto do Laravel, não há necessidade de desativar o Selinux, basta executar estes comandos:

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

Por fim, verifique se os hosts, ips e hosts virtuais estão todos corretamente para acesso remoto.

O Selinux pretende restringir o acesso até mesmo aos usuários root, para que apenas o material necessário possa ser acessado, pelo menos em uma visão geral, é segurança extra, desabilitar não é uma boa prática, existem muitos links para aprender sobre o Selinux, mas, para isso, caso, nem é necessário.

Daniel Santos
fonte
Embora esse link possa responder à pergunta, é melhor incluir aqui as partes essenciais da resposta e fornecer o link para referência. As respostas somente para links podem se tornar inválidas se a página vinculada for alterada. - Da avaliação
Patrick Mevzek
O link é super explícito, não há necessidade de tal mecanismo, há até uma seção específica para o contexto do Laravel SELinux. Penso que a sua opinião deve ser apoiada por um pouco mais de lógica do que apenas uma simples regra de ouro. Enquanto isso, você votou negativamente em uma resposta que provavelmente 99% corrigirá os problemas sem respeitar práticas ruins, como desativar o Selinux.
Daniel Santos
Não é um problema ser explícito ou não. A idéia deste site é que ele contém todas as informações relevantes; portanto, lendo uma resposta, obtemos todas elas. Links externos podem apodrecer e a resposta se torna inútil. Isso é explicado no centro de ajuda em stackoverflow.com/help/how-to-answer : "Os links para recursos externos são incentivados, mas adicione um contexto ao redor do link para que seus colegas usuários tenham uma idéia do que é e por que está lá. . sempre citar a parte mais relevante de um elo importante, no caso do site de destino está inacessível ou vai permanentemente offline. "
Patrick Mevzek
Sua pergunta foi sinalizada para revisão, só isso. E contradiz o que está escrito na Central de Ajuda que citei. Todas as respostas com apenas um link e nenhuma descrição são votadas abaixo e até removidas. Sinta-se à vontade para editar sua resposta e fornecer a parte relevante da explicação aqui. E você está livre para votar todas as respostas que considera ruins. Você pode ver no link da revisão que eu não estava sozinho ao recomendar que sua resposta fosse fechada. Não por mérito técnico, apenas porque um link não é suficiente.
Patrick Mevzek
Obrigado pelo esclarecimento, eu não sabia que esse tipo de orientação existia ou, mesmo que no processo de registro você receba uma dica para ler recursos, não lembro. O que você disse pode ser verdade, o link pode apodrecer, mas uma resposta pode ser alcançada sem esforço, independentemente disso, vou editá-lo.
Daniel Santos
6

Se você usa o cmd

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

Se você usa a GUI

Primeiro, vá ao projeto e clique com o botão direito do mouse no armazenamento, verifique as propriedades e vá para a guia Permissões

insira a descrição da imagem aqui

Altere as permissões usando o código abaixo

sudo chmod -R 777 storage

Suas propriedades do arquivo podem ser

insira a descrição da imagem aqui

Em seguida, verifique suas configurações e execute o comando laravel que funcionará :)

Thilina Dharmasena
fonte
Obrigado yoouuuuuu
viniciussvl
5

No Laravel, você deve ativar a ACL storagee o cachediretório para que o usuário do servidor da Web possa ler / gravar no diretório. Abra um novo terminal e execute o seguinte:

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/

Referências:

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

Pratik
fonte
5

Pode ser tarde, mas pode ajudar alguém, alterar as permissões de diretório funcionou para mim.

Supondo que seu projeto Laravel esteja no /var/www/html/diretório

cd /var/www/html/

Em seguida, altere as permissões storage/e bootstrap/cache/diretórios.

sudo chmod -R gu+w storage/
sudo chmod -R guo+w storage/
sudo chmod -R gu+w bootstrap/cache/
sudo chmod -R guo+w bootstrap/cache/
Hamza Rashid
fonte
2

Esta solução é específica para o laravel 5.5

Você precisa alterar as permissões para algumas pastas: chmod -R -777 storage / logs chmod -R -777 storage / framework para as pastas acima 775 ou 765 não funcionou no meu projeto

chmod -R 775 bootstrap/cache 

Além disso, a propriedade da pasta do projeto deve ser a seguinte (usuário atual) :( usuário do servidor da web)

s_user
fonte
2

Você poderia fazer:

chcon -R -t httpd_sys_rw_content_t storage
Leandro Gorriz
fonte
1

Eu não estava muito interessado em alterar minhas permissões de pasta para 777. Veja como resolvi esse problema.

Primeiro, mudei o usuário que está executando o servidor da web na minha máquina local (eu executo o nginx, mas os princípios se aplicam a todos os lugares):

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

Depois, criei outro index.phparquivo na public/pasta para descobrir quem estava executando minha versão do php-fpm e onde eu iria mudar isso:

<?php
phpinfo();
?>

Recarregando a página, descobri que www-dataera o usuário (na seção ambiente). Eu também descobri que estava executando o php 7.1. Passei a mudar o usuário:

$> 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.

Por fim, dei as seguintes permissões para pastas:

sudo chmod -R 775 ./storage/

Agora, certifiquei-me de que eu era o proprietário das pastas usando um simples:

ls -al

Se você definir os usuários do servidor e do php-fpm para si mesmo e as pastas pertencerem à raiz, por exemplo, você continuará enfrentando esse problema. Isso pode acontecer se você fez um sudo laravel new <project>como root. Nesse caso, certifique-se de usar um chowncomando recursivo no seu projeto para alterar as user:groupconfigurações. Na maioria dos casos padrão, www-dataé a principal configuração do servidor e do php; nesse caso, é uma questão de garantir que a pasta não esteja fora do www-dataalcance.

Meu projeto está configurado no meu diretório pessoal. No Ubuntu 16.04 e Laravel 5.5.

Patrick.SE
fonte
1

tente isso

  1. cd / var / www / html
  2. setenforce 0
  3. reiniciar o serviço httpd
Dan Christian Febra
fonte
Você poderia explicar o que isso faz?
Cada vez mais idiota
1
Não é necessário alterar os diretórios a serem usados, setenforcemas, de qualquer forma, é errado desativar completamente o SELinux apenas para corrigir um problema de permissão.
Patrick Mevzek
0

No meu caso particular, eu tive um arquivo de configuração gerado e armazenado em cache no bootstrap/cache/diretório, portanto, minhas etapas são:

  1. Remova todos os arquivos em cache gerados: rm bootstrap/cache/*.php
  2. Crie um novo laravel.logarquivo e aplique a atualização das permissões no arquivo usando:

    • chmod -R 775 storage
Crisoforo Gaspar
fonte
0

(no Ubuntu ): Pode ser resolvido em 2 etapas simples:

$ sudo chmod -R 777 storage 

E

$ sudo service apache2 restart
7rust
fonte
Etapa 3: hackeie seu servidor e / ou usuários porque você abriu seus arquivos para o mundo.
miken32
0

Exclua "/var/www/laravel/app/storage/logs/laravel.log"e tente novamente:

rm storage/logs/laravel.log

Gjaa
fonte
-1

Teve este problema e encontrou isso e resolveu o problema.

insira a descrição da imagem aqui

user2848911
fonte
-1

Este erro pode ser corrigido desativando o Linux.

Verifique se ele foi ativado

sestatus

Você tenta..

setenforce 0

orxanzadeh
fonte
5
"desativando o Linux "? Isso seriamente vai longe demais :-)!
Patrick Mevzek
-1

Para este erro:

Erro no manipulador de exceções: o fluxo ou o arquivo "/var/www/laravel/app/storage/logs/laravel.log" não pôde ser aberto: falha ao abrir o fluxo: permissão negada em / var / www / laravel / bootstrap / compiled .php: 8423

use este comando no terminal:

sudo chmod -R 777 storage
khushbu vaishnav
fonte
2
muito ruim para env de produção
Ariful Haque
-1

Corrigido meu problema com este comando no centos 7.6 Server

chcon -R -t httpd_sys_content_t $SITE_PATH

chcon -R -t httpd_sys_rw_content_t $SITE_PATH
HamidNE
fonte