DevOps Mind
Evite estes tipos de erros nos logs do Laravel:
Tópicos
Erros de permissão no Laravel
O Laravel é um popular framework PHP usado por muitos desenvolvedores para criar aplicativos web. Um problema comum que pode ocorrer ao trabalhar com o Laravel é o erro:
The stream or file "/var/www/html/storage/logs/laravel.log" could not be opened in append mode: failed to open stream: permission denied
Esse erro ocorre quando o Laravel não consegue gravar em seu arquivo de log porque não tem permissão para acessar a pasta de armazenamento.
Outro erro muito comum, que pode acontecer quanto não temos as permissões definidas corretamente no Laravel, é o erro abaixo:
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
Solução paliativa
Uma solução que é indicada em muitos fóruns e blogs, é aplicarmos a permissão chmod 777
, que acaba deixando nosso servidor muito exposto.
Em alguns casos são sugeridos outros chmod, chgrp, que até podem não deixar o servidor com a segurança menor, mas não trazem uma solução definitiva para erros de permissão no Laravel.
Solução definitiva
Felizmente, há uma solução relativamente fácil para esse problema. Você pode aplicar permissões e herança nas permissões da pasta /var/www/html/storage/logs
no servidor.
Para fazer isso, você precisará acessar o servidor onde o Laravel está hospedado e executar alguns comandos na pasta do projeto(neste exemplo estamos usando a /var/www/html/
).
Outro ponto importante é que eu procuro adicionar os usuários que trabalham com o Laravel ao grupo www-data
, para que após aplicada a solução eles consigam manipular os arquivos sem trazer problemas e novos erros de permissão no Laravel.
Segue o script que devemos utilizar:
## laravel log permission
cd /var/www/html/
sudo chgrp -R www-data bootstrap/ storage/ storage/logs/
sudo chmod -R g+w bootstrap/ storage/ storage/logs/
cd bootstrap/
sudo find -type d -exec chmod g+s {} +
cd ..
cd storage/
sudo find -type d -exec chmod g+s {} +
cd ..
cd storage/logs/
sudo find -type d -exec chmod g+s {} +
Um pouco mais sobre os comandos utilizados no script
Esse script em Bash é usado para conceder permissões corretas para os diretórios bootstrap/
, storage/
e storage/logs/
de um projeto Laravel que está localizado em /var/www/html/
. Especificamente, o script define o grupo proprietário desses diretórios como www-data
, que é o usuário e grupo padrão do servidor da web no Ubuntu. Além disso, o script garante que esses diretórios tenham permissões de gravação para o grupo www-data
.
A parte do script que se refere a herança de permissões é a seguinte linha:
sudo find -type d -exec chmod g+s {} +
Essa linha define o bit SGID em todos os diretórios dentro dos diretórios bootstrap/
, storage/
e storage/logs/
. Quando o bit SGID é definido em um diretório, ele garante que todos os novos arquivos criados dentro desse diretório herdem o grupo proprietário do diretório pai. Isso é útil para garantir que todos os arquivos criados dentro dos diretórios bootstrap/
, storage/
e storage/logs/
tenham o mesmo grupo proprietário (www-data
) e, portanto, possam ser lidos e gravados pelo servidor da web.
Em resumo, o script executa as seguintes ações:
- Navega até a pasta do projeto Laravel em
/var/www/html/
. - Define o grupo proprietário dos diretórios
bootstrap/
,storage/
estorage/logs/
comowww-data
. - Concede permissões de gravação para o grupo
www-data
nos diretóriosbootstrap/
,storage/
estorage/logs/
. - Define o bit SGID em todos os diretórios dentro dos diretórios
bootstrap/
,storage/
estorage/logs/
, para garantir a herança de permissões de grupo em novos arquivos criados nesses diretórios.
Detalhando cada opção dos comandos
sudo chgrp -R
sudo
: o comando sudo
é usado para executar comandos com privilégios de super usuário (root) no sistema operacional Linux ou Unix.
chgrp
: o comando chgrp
é usado para alterar o grupo proprietário de um arquivo ou diretório.
-R
: é uma opção para o comando chgrp
que significa “recursivamente”. Ela faz com que o comando seja executado em todos os diretórios e subdiretórios abaixo do diretório atual.
Em resumo, o comando sudo chgrp -R altera recursivamente o grupo proprietário de todos os arquivos e diretórios abaixo do diretório atual.
sudo chmod -R g+w
sudo
: igual ao anterior
chmod
: é um comando que é usado para alterar as permissões de acesso de um arquivo ou diretório.
-R
: igual ao anterior
g+w
: é uma opção para o comando chmod
que significa “adicionar permissão de escrita para o grupo”. “g” é o grupo proprietário do arquivo ou diretório.
Em resumo, o comando sudo chmod -R g+w
adiciona a permissão de escrita para o grupo proprietário em todos os arquivos e diretórios abaixo do diretório atual.
sudo find -type d -exec chmod g+s {} +
sudo
: igual ao anterior
find
: é um comando usado para encontrar arquivos e diretórios com base em critérios específicos.
-type d
: é uma opção para o comando find
que significa “encontrar apenas diretórios”.
-exec
: é uma opção para o comando find
que executa um comando em cada arquivo ou diretório encontrado.
chmod g+s
: é o comando que será executado em cada diretório encontrado pelo find
. “g” é o grupo proprietário do diretório e “s” é uma opção que significa “definir o bit setgid”. Isso faz com que todos os arquivos criados dentro do diretório herdem o grupo proprietário do diretório.
{}
: é um espaço reservado para o nome do arquivo ou diretório encontrado pelo find
.
+
: indica que o comando chmod g+s
deve ser executado uma vez para cada grupo de arquivos ou diretórios encontrados.
Em resumo, o comando sudo find -type d -exec chmod g+s {} +
encontra todos os diretórios abaixo do diretório atual e executa o comando chmod g+s
em cada um deles, garantindo que todos os arquivos criados dentro desses diretórios tenham o mesmo grupo proprietário.
Extra
Vou estar disponibilizando o script no meu Github, caso precisem:
https://github.com/fernandomullerjr/laravel-tools-and-tips/blob/main/permissions/adjusting-laravel-permissions.sh
Com as permissões corretas aplicadas na pasta de logs, o Laravel deve agora ser capaz de gravar em seu arquivo de log sem erros de permissão no Laravel.
Mais dicas sobre solução de problemas? Acesse: