¿Cómo solucionar el error: laravel.log no se pudo abrir?

184

Soy bastante nuevo en laravel, de hecho, y estoy tratando de crear mi primer proyecto. por alguna razón sigo recibiendo este error (aún no he empezado 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

He leído que esto tiene algo que ver con los permisos, pero chmod -R 775 storageno ayudó en absoluto.

Permisos

FRR
fuente
¿Estás seguro de que estás en el directorio correcto cuando ejecutas ese comando chmod? Pruebe chmod -R 755 / var / www / laravel / app / storage. Además, ¿en qué están configurados el usuario y el grupo? Pruebe ls -al / var / www / laravel / app / storage
Ryan LaB
mismos resultados (actualicé mi publicación original para mostrar los permisos de la carpeta)
FRR
: / por alguna razón todavía no funciona. No lo mencioné antes, pero estoy usando vagabundo. entonces mi carpeta www está en una VM (apache, php y todo lo demás se está ejecutando en ella). No estoy seguro de si eso tiene algo que ver con algo, pero pensé en mencionarlo por si acaso. (Estoy creando mi proyecto dentro de la máquina virtual, usando el compositor)
FRR
13
Esos tipos que sugieren 777, prueba en google esta frase: "production db_password filetype: env inurl: com"
Tarasovych
1
Desactivar SELINUX funcionó para mí.
Prakash P

Respuestas:

306

Nunca establezca un directorio en 777 . Debe cambiar la propiedad del directorio. configure su usuario actual con el que ha iniciado sesión como propietario y el usuario del servidor web (www-data, apache, ...) como grupo. Puedes probar esto:

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

luego para configurar el permiso de directorio intente esto:

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

Actualizar:

El usuario y el grupo del servidor web dependen de su servidor web y su sistema operativo. para averiguar cuál es el usuario y el grupo de su servidor web, use los siguientes comandos. para uso nginx:

ps aux|grep nginx|grep -v grep

para uso apache:

ps aux | egrep '(apache|httpd)'

Hamid Parchami
fuente
44
¡Gracias! En resumen, también puede hacer:sudo chown -R {your current user}:www-data storage bootstrap/cache
Ramesh Pareek
2
@RameshPareek Tienes razón, pero solo quería ser más claro;)
Hamid Parchami
1
Esto no funciona para mi. Acabo de llegar chown: www-data: illegal group name. Configurar el directorio a 777 es lo único que funciona
Matt D
3
@MattD Supongo que el grupo apache en mac es _wwwprobar esto sudo chgrp -R _www bootstrap/cache. sería útil echar un vistazo a esta publicación: stackoverflow.com/a/6419695/2125114
Hamid Parchami
3
Esta debería ser la respuesta elegida, 100% de acuerdo en que los administradores de sistemas no solo deberían permitir el acceso a todo para evitar resolver el problema real.
HyperionX
134

Nunca use 777 para directorios en su servidor en vivo, pero en su propia máquina, a veces necesitamos hacer más de 775, porque

chmod -R 775 storage

Medio

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

Si su servidor web no se está ejecutando como Vagrant, no podrá escribir en él, por lo que tiene 2 opciones:

chmod -R 777 storage

o cambie el grupo a su usuario de servidor web, suponiendo que sea www-data:

chown -R vagrant:www-data storage
Antonio Carlos Ribeiro
fuente
No necesitaba el chmod en mi caso ya que estaba configurado bien, sin embargo, en Fedora 20 necesitaba:chown -R apache:apache laravelproject
misterjaytee
Estaba teniendo problemas para montar carpetas a través de samba / vagrant, lo chown -R vagrant:www-data storagehice por mí, gracias.
Lewis
1
El almacenamiento chmod -R 777 funcionó para mí. Traté de cambiar el grupo, pero seguí recibiendowww-data: illegal group name
Matt D
57

Para solucionar este problema, debe cambiar la propiedad del directorio al usuario de Unix que utiliza el servidor web.

  1. Sal de la VM
  2. Usando la consola, vaya a su carpeta sincronizada (vagabundo)
  3. sudo chown -R $ USUARIO: almacenamiento de datos www
  4. almacenamiento chmod -R 775

Aunque creé el proyecto dentro de la VM utilizando el usuario de VM, la carpeta pertenecía al usuario en la computadora real; entonces, cuando trato de

Ahora funciona.

Gracias a todos los que me ayudaron a resolver esto

EDITAR:

En realidad, todavía no funcionaba, todavía me daba un problema de "permiso denegado".

Esto es lo que hice, modifiqué mi Vagrantfile de esta manera:

config.vm.synced_folder "./app","/var/www/", create:true,
:owner => "vagrant",
:group => "www-data",
:mount_options => ["dmode=775","fmode=664"]
FRR
fuente
Hice eso ... ¡Y YO HE GANADO! Todavía no funciona ... laravel 5 ... renombró el archivo de registro, laravel creó uno nuevo ... mismo error
ied3vil
1
No tengo config.vm.synced_folder porque estoy usando homestead, ¿cómo puedo solucionar este problema?
oleynikd
21
No deberías usar 777 de todas formas.
IIllIIll
No veo ningún problema al usar 777 en una carpeta Sé exactamente lo que hay dentro (un proyecto de muestra ficticio)
FRR
2
Esta no debería ser la respuesta aceptada. Es terrible. Nunca establezca 777. Nunca.
CGriffin
39

También puede ser SELinux. (Centos, RedHat)

Determinar el estado de SElinux en la terminal:

$ sestatus

Si el estado está habilitado, escriba el comando para deshabilitar SElinux

$ setenforce Permissive

O puedes ejecutar este comando

$ sudo setenforce 0

Turan Zamanlı
fuente
66
Esto es lo único que funcionó, ¿podría explicar qué hace?
hack4mer
2
@ hack4mer puede leer más información sobre seLinux. en.wikipedia.org/wiki/Security-Enhanced_Linux
Turan Zamanlı
las cosas raras que he visto, por qué demonios funciona después de buscar durante más de 6 horas
Muhamad Yulianto
1
La única solución que funcionó para mí ... gracias. Pero el problema vuelve cada vez que se reinicia el servidor, ¿sabe cómo hacer que se aplique incluso si se reinicia el servidor?
Juan Angel
1
@JuanAngel tienes que deshabilitar permanentemente el servicio. abrir con el editor vim / etc / sysconfig / selinux y luego cambiar la directiva SELinux = imponer a SELinux = disabled
Turan Zamanlı
32

Necesita ajustar los permisos de storagey bootstrap/cache.

  • cd en tu proyecto Laravel.
  • sudo chmod -R 755 storage
  • sudo chmod -R 755 bootstrap/cache

Puedes probar 777 si 755 no funciona. ¡Sin embargo, el 777 no es seguro!

Dependiendo de cómo esté configurado su servidor web, es posible que pueda ser más específico con sus permisos y solo otorgarlos al usuario de su servidor web. Google WEB SERVER NAME Laravel file permissionspara más información.

Al momento de escribir, esto es para Laravel 5.4

Daniel Dewhurst
fuente
14

añadir composer.json

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

Después composer install

Davron Achilov
fuente
12

Ejecute los siguientes comandos y puede agregarlos sudoal inicio del comando dependiendo de su sistema:

chmod -R 775 storage/framework
chmod -R 775 storage/logs
chmod -R 775 bootstrap/cache 
gauravbhai daxini
fuente
1
Nunca use el 777. Con los permisos del 777, está otorgando a cualquier persona con una conexión acceso total a los archivos o directorios con esos permisos. Pueden alterarlos de cualquier forma que elijan, incluso de forma maliciosa. Muchos incidentes de piratería de cuentas provienen de 777 permisos.
Odyssee
8

Para todos los usuarios de Centos 7 en un contexto de Laravel, no es necesario deshabilitar Selinux, solo ejecute estos 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 último, asegúrese de que sus hosts, ips y hosts virtuales estén todos correctamente para acceso remoto.

Selinux está destinado a restringir el acceso incluso a los usuarios root, por lo que solo se puede acceder a las cosas necesarias, al menos en una visión general, es seguridad adicional, deshabilitarlo no es una buena práctica, hay muchos enlaces para aprender Selinux, pero para esto caso ni siquiera es necesario.

Daniel Santos
fuente
Si bien este enlace puede responder la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace como referencia. Las respuestas de solo enlace pueden volverse inválidas si la página vinculada cambia. - De la opinión
Patrick Mevzek 13/0818
El enlace es súper explícito, no hay necesidad de tal mecanismo, incluso hay una sección específica para un contexto Laravel SELinux. Creo que su opinión debería estar respaldada por un poco más de lógica que una simple regla general. Mientras tanto, rechazó una respuesta que probablemente solucionará el 99% de los problemas sin atenerse a las malas prácticas, como deshabilitar Selinux.
Daniel Santos
No es un problema ser explícito o no. La idea de este sitio es que contiene toda la información relevante, por lo que al leer una respuesta obtenemos toda la información. Los enlaces externos pueden pudrirse y luego la respuesta deja de tener valor. Esto se explica en el centro de ayuda en stackoverflow.com/help/how-to-answer : "Se alientan los enlaces a recursos externos, pero agregue contexto alrededor del enlace para que sus otros usuarios tengan una idea de qué es y por qué está allí. . Siempre cite la parte más relevante de un enlace importante, en caso de que no se
pueda
Su pregunta fue marcada para revisión, eso es todo. Y contradice lo que está escrito en el Centro de ayuda que cité. Todas las respuestas con solo un enlace y ninguna descripción se rechazan e incluso se eliminan. Siéntase libre de editar su respuesta para proporcionar la parte relevante de la explicación aquí. Y usted mismo es libre de rechazar todas las respuestas que considere malas. Puede ver en el enlace de revisión que no estaba solo al recomendar que se cerrara su respuesta. No por méritos técnicos, solo porque un enlace no es suficiente.
Patrick Mevzek
Gracias por la aclaración, no sabía que existían ese tipo de pautas, o si incluso en el proceso de registro recibes un consejo para leer recursos, no lo recuerdo. Lo que dijiste podría ser cierto, el enlace puede pudrirse, pero se puede llegar a una respuesta sin esfuerzo, independientemente, lo editaré.
Daniel Santos
6

Si usas cmd

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

Si usas GUI

Primero vaya al proyecto y haga clic derecho en el almacenamiento y verifique las propiedades y vaya a la pestaña Permisos

ingrese la descripción de la imagen aquí

Cambia los permisos usando el siguiente código

sudo chmod -R 777 storage

Entonces las propiedades de su archivo pueden ser

ingrese la descripción de la imagen aquí

Luego verifique su configuración y ejecute el comando laravel, funcionará :)

Thilina Dharmasena
fuente
Gracias yoouuuuuu
viniciussvl
5

En Laravel, debe configurar ACL storagey el cachedirectorio para que el usuario del servidor web pueda leer / escribir en el directorio. Abra una nueva terminal y ejecute lo siguiente:

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/

Referencias

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
fuente
5

Puede ser tarde, pero puede ayudar a alguien, cambiar los permisos de directorio funcionó para mí.

Asumiendo que su proyecto Laravel está en el /var/www/html/directorio.

cd /var/www/html/

Luego cambie los permisos de storage/y bootstrap/cache/directorios.

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
fuente
2

Esta solución es específica para laravel 5.5

Debe cambiar los permisos a algunas carpetas: chmod -R -777 storage / logs chmod -R -777 storage / framework para las carpetas anteriores 775 o 765 no funcionó para mi proyecto

chmod -R 775 bootstrap/cache 

Además, la propiedad de la carpeta del proyecto debe ser la siguiente (usuario actual) :( usuario del servidor web)

s_user
fuente
2

Podrías hacerlo:

chcon -R -t httpd_sys_rw_content_t storage
Leandro Gorriz
fuente
1

No estaba demasiado interesado en cambiar los permisos de mi carpeta a 777. Así es como solucioné este problema.

Primero, cambié el usuario que ejecuta el servidor web en mi máquina local (ejecuto nginx, pero los principios se aplican en todas partes):

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

Después, creé otro index.phparchivo debajo de la public/carpeta para averiguar quién estaba ejecutando mi versión php-fpm y dónde iría para cambiar eso:

<?php
phpinfo();
?>

Al recargar la página, descubrí que www-dataera el usuario (en la sección de entorno). También descubrí que estaba ejecutando php 7.1. Procedí a cambiar el usuario:

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

Finalmente, otorgué los siguientes permisos a las carpetas:

sudo chmod -R 775 ./storage/

Ahora, me aseguré de ser el dueño de las carpetas usando un simple:

ls -al

Si configura el servidor y los usuarios de php-fpm para usted y las carpetas son propiedad de root, por ejemplo, seguirá encontrando este problema. Esto puede suceder si hiciste un sudo laravel new <project>como root. En ese caso, asegúrese de usar un chowncomando recursivo en su proyecto para cambiar la user:groupconfiguración. En la mayoría de los casos predeterminados, www-dataes la configuración principal para el servidor y php, en ese caso se trata de asegurarse de que la carpeta no esté fuera dewww-data alcance.

Mi proyecto está configurado en mi directorio de inicio. En Ubuntu 16.04 y Laravel 5.5.

Patrick.SE
fuente
1

prueba esto

  1. cd / var / www / html
  2. setenforce 0
  3. servicio httpd reiniciar
Dan Christian Febra
fuente
¿Podría explicar qué hace esto?
Cada vez más idiota el
1
No es necesario cambiar los directorios para usarlos, setenforcepero en cualquier caso es un error desactivar completamente SELinux solo para solucionar un problema de permiso.
Patrick Mevzek
0

En mi caso particular, tuve un archivo de configuración generado y almacenado en caché en el bootstrap/cache/directorio, así que mis pasos fueron:

  1. Eliminar todos los archivos en caché generados: rm bootstrap/cache/*.php
  2. Cree un nuevo laravel.logarchivo y aplique la actualización de los permisos en el archivo usando:

    • chmod -R 775 storage
Crisoforo Gaspar
fuente
0

(en Ubuntu ): se puede resolver en 2 simples pasos:

$ sudo chmod -R 777 storage 

Y

$ sudo service apache2 restart
7 óxido
fuente
Paso 3: consigue hackear tu servidor y / o tus usuarios porque has abierto tus archivos al mundo.
miken32
0

Eliminar "/var/www/laravel/app/storage/logs/laravel.log"e intentar nuevamente:

rm storage/logs/laravel.log

Gjaa
fuente
-1

Tuve este problema y lo encontré y lo resolvió.

ingrese la descripción de la imagen aquí

usuario2848911
fuente
-1

Este error se puede solucionar deshabilitando Linux.

Comprueba si se ha habilitado

sestatus

Intenta ..

setenforce 0

orxanzadeh
fuente
55
¿"deshabilitando Linux "? Eso en serio va demasiado lejos :-)!
Patrick Mevzek
-1

Por este error:

Error en el controlador de excepciones: no se pudo abrir la secuencia o el archivo "/var/www/laravel/app/storage/logs/laravel.log": no se pudo abrir la secuencia: Permiso denegado en / var / www / laravel / bootstrap / compiled .php: 8423

usa este comando en la terminal:

sudo chmod -R 777 storage
khushbu vaishnav
fuente
2
lástima para la producción env
Ariful Haque
-1

Se solucionó mi problema con este comando en centos 7.6 Server

chcon -R -t httpd_sys_content_t $SITE_PATH

chcon -R -t httpd_sys_rw_content_t $SITE_PATH
HamidNE
fuente