file_put_contents (meta / services.json): error al abrir la secuencia: permiso denegado


169

Soy nuevo en Laravel. Estaba intentando abrir http://localhost/test/public/y conseguí

Error en el controlador de excepciones.

Busqué en Google y cambié el permiso del directorio de almacenamiento usando chmod -R 777 app/storagepero fue en vano.

He cambiado debug=>trueen app.phpy visitado la página y ha obtenido un error en el controlador de excepciones:

No se pudo abrir la secuencia o el archivo "/var/www/html/test/app/storage/logs/laravel.log": no se pudo abrir la secuencia: Permiso denegado en / var / www / html / test / bootstrap / compiled. php: 8423

Luego cambié los permisos del directorio de almacenamiento usando el comando chmod -R 644 app/storagey el error 'Error en el controlador de excepciones' desapareció y se cargó una página. Pero ahí entiendo esto:

file_put_contents (/var/www/html/laravel/app/storage/meta/services.json): no se pudo abrir la transmisión: permiso denegado


2
Parece un problema de permición de nuevo, chmod recursivamente todos los directorios de aplicaciones
solo

@alou Creo que ya lo hice con la aplicación / almacenamiento chmod -R 777. ¿No? Y todos los directorios dentro de la aplicación tienen permiso drwxrwxrwx.
vishnub1626

33
Prueba: php artisan cache:clearluego chmod -R 777 app/storagefinalmentephp artisan dump-autoload
vsmoraes

@vsmoraes Funcionó. Será realmente útil si puede explicar cuál fue el problema.
vishnub1626

77
El comentario de vsmoraes fue correcto, sin embargo, en lugar de 'php artisan dump-autoload' en debería ser 'composer dump-autoload'
Elliot Robert el

Respuestas:


320

La sugerencia de vsmoraes funcionó para mí:

Laravel> = 5.4

php artisan cache:clear 
chmod -R 777 storage/
composer dump-autoload

Laravel <5.4

php artisan cache:clear 
chmod -R 777 app/storage 
composer dump-autoload

NOTA: NO HAGA ESTO EN NINGÚN SERVIDOR REMOTO (DISPOSITIVO O PRODUCCIÓN)

Cuando hice esta pregunta, este era un problema en mi localhost, ejecutándose en una máquina virtual. Así que pensé que configurar un 777 era lo suficientemente seguro, sin embargo, la gente tiene razón cuando dice que debe buscar una solución diferente. Prueba 775 primero


8
Esto debería ser sudo chmod -R 777 app / storage. para evitar el error de permiso.
Olaitan Mayowa

55
Para # Laravel5 las instrucciones son casi idénticas:, php artisan cache:clearluego chmod -R 777 storage, y luego composer dump-autoload
WNRosenberg

66
Si está utilizando Laravel 5.1+, deberá hacerlo en su chmod -R 777 storagelugar
James

10
php artisan cache:clearEs la respuesta correcta. Luego me sudo chmod -R ug+rw storageda los permisos correctos para mí, sin otorgar othersprivilegios de lectura / escritura o especialmente de ejecución.
Zack Morris

43
Esta respuesta e hilo es lo que destaca por qué no me gusta tanto Laravel: les enseña a los desarrolladores que puedes hacer lo que quieras, cuando quieras, tan rápido como quieras, sin pensar en las consecuencias (entiendo 777que no es específico de Laravel, pero el proceso de pensamiento para los desarrolladores de Laravel es: "haz que funcione AHORA, no me importa cómo", al igual que 777). Como regla general, nunca, nunca, establezca algo 777para que algo funcione. ENTIENDA su servidor y usuarios / roles y configúrelos en consecuencia; no hackearlo. Sus clientes confían en usted para hacer esto bien.
dKen

70

Para los googlers que han estado enfrentando este problema con Laravel 5.

Este es un problema de permiso causado por diferentes usuarios que intentan escribir en el mismo archivo de registro dentro de storage/logs carpeta con diferentes permisos.

Lo que sucede es que su configuración laravel probablemente esté configurada para registrar errores diariamente y, por lo tanto, su servidor web (apache / nginx) podría crear este archivo bajo un usuario predeterminado, dependiendo de su entorno, puede ser algo así como _wwwen www-datasistemas OSX o * NIX, entonces el problema se produce cuando puede haber ejecutado algunos comandos artesanales y obtener algunos errores, por lo que el artesano escribirá este archivo pero con un usuario diferente porque PHP en el terminal es ejecutado por un usuario diferente en realidad su usuario de inicio de sesión, puede verificarlo ejecutando este comando :

php -i | grep USER

Si su usuario de inicio de sesión creó ese archivo de registro en su servidor web, no podrá escribir errores en él y viceversa porque laravel escribe los archivos de registro con 655permisos por defecto, lo que solo permite que el propietario escriba en él.

Para solucionar este problema temporal, debe otorgar manualmente permisos para el grupo 664a este archivo para que tanto su usuario de inicio de sesión como el usuario del servidor web puedan escribir en ese archivo de registro.

Para evitar este problema permanentemente, es posible que desee configurar los permisos adecuados cuando se cree un nuevo archivo dentro del storage/logsdirectorio heredando los permisos del directorio, esta respuesta https://unix.stackexchange.com/a/115632 puede ayudarlo a abordar ese.


¡respuesta fan-friggen-tastic aquí! Estoy ejecutando Elastic Beanstalk y mi usuario PHP de línea de comandos es "ec2-user", pero mi aplicación se ejecuta como "webapp".
Randy L

1
Una respuesta que explica el problema. es decir, una respuesta adecuada.
Craicerjack

Esto me ayudó a darme cuenta de por qué recibía un error de caché de archivos en Laravel en Cloudways. Necesitaba presionar el botón en el panel de Cloudways para restablecer los permisos de archivo. Gracias.
Ryan

44

No debe otorgar permisos 777. Es un riesgo de seguridad. Para los usuarios de Ubuntu, en Laravel 5, sugiero cambiar el propietario del almacenamiento del directorio de forma recursiva:

Prueba lo siguiente:

sudo chown -R www-data:www-data storage

En sistemas basados ​​en Ubuntu, www-data es usuario de apache.


2
Esto me solucionó y es más correcto (creo) que las chmod 777respuestas. Gracias ~
GavinR

Creo que es la respuesta más conveniente para los usuarios de Linux. Gracias @GavinR. chmod 777Es una pesadilla completa.
Abdalla Arbab

Esto funcionó para mí y definitivamente es una mejor opción que chmod -777
Egnaro

¡Gracias por una nueva forma de resolver el problema! ¿Necesitamos hacer algo antes / después de su orden para revertir las chmod 777consecuencias?
Aleksandar

41

Para todos los que usan Laravel 5, Homestead y Mac, intenten esto:

mkdir storage/framework/views

Esto también funciona con la creación de un nuevo servidor con Laravel Forge con Laravel 5.2.7
winkster

2
Esto lo hizo por mi. Parece que bootstrap/cache/compiled.phpestaba tratando de escribir en este directorio, pero no existía y terminó arrojando un error de permisos. Gracias.
Matt K

1
De alguna manera esto funcionó para mí. Estoy usando laravel 5.1 por cierto
Yohanes Gultom

Esto lo hizo por mí, gracias. Había eliminado todo mi directorio de almacenamiento pensando que esto sería generado por laravel nuevamente, supongo que no.
grimmdude

33

algunas veces SELINUX causó este problema; Puede deshabilitar selinux con este comando.

sudo setenforce 0

wow, realmente hice el truco y funciona, ¿alguien puede explicarme por qué funcionó? que es selinux
undefinedman

sí, esto realmente funcionó! por favor, ayúdenos gurú a entender esto en SELINUX? estoy usando fedora 24 por cierto
loki9

1
Gracias, muchas gracias. Busco en la red, y todos me dicen que verifique el permiso, verifique el usuario, etc.
Ali ZahediGol

3
Esto es básicamente como apagar todo el firewall porque estaba bloqueando un puerto que necesitabas abrir.
Teh JoE

Yo nunca había oído hablar de esto. "Security-Enhanced Linux (SELinux) es un módulo de seguridad del kernel de Linux que proporciona un mecanismo para soportar políticas de seguridad de control de acceso". Dudo que sea una buena idea apagarlo. Y apuesto a que los votantes están usando ciegamente este comando sin comprender todas las consecuencias.
Ryan

18

Problema resuelto

php artisan cache:clear
sudo chmod -R 777 vendor storage

esto permite el permiso de escritura para la aplicación, el marco, los registros Espero que esto ayude


12
Nunca 777 ... en dev o prod ya que le dará la ilusión de las cosas que trabajan en dev pero se romperá en prod menos 777, así que nunca es una buena idea
Kyle Burkett

wooha you rock ... proveedor era el que me faltaba
lu1s

sí, dando cualquier cosa en un público frente Web 777 es una mala idea
imabug

17

¡NUNCA LE PERMITA EL PERMISO 777!

vaya al directorio del proyecto laravel en su terminal y escriba:

sudo chown -R your-user:www-data /path/to/your/laravel/project/
sudo find /same/path/ -type f -exec chmod 664 {} \;
sudo find /same/path/ -type d -exec chmod 775 {} \;
sudo chgrp -R www-data storage bootstrap/cache
sudo chmod -R ug+rwx storage bootstrap/cache

De esta manera, convierte a su usuario en el propietario y le otorga privilegios:
1 Ejecutar, 2 Escribir, 4 Leer
1 + 2 + 4 = 7 significa (rwx)
2 + 4 = 6 significa (rw)
finalmente, para el acceso al almacenamiento, ug + rwx significa que le estás dando al usuario y al grupo un 7


1
No sé por qué un montón de dev gusta usar 777 ... de alguna manera que aún no ha preocupan por su sistema ..
ZeroOne

15

Para usuarios vagabundos, la solución es:

(en vagabundo) php artisan cache: clear

(fuera de vagabundo) aplicación / almacenamiento chmod -R 777

(en vagabundo) compositor dump-autoload

¡Es importante asegurarse de que se modifique en su entorno local y no dentro de vagabundo!


66
¿No está el 777 demasiado abierto?
simo

3
Quiero decir, para producción, claro. Pero este es un entorno de desarrollo local. 777 era lo que estaba usando el póster original, y otras respuestas.775 o 755 pueden funcionar dependiendo.
Brendan

12

Inténtalo de nuevo con chmod -R 755 /var/www/html/test/app/storage. Usar con sudo para Operation not permitteden chmod. Use Verificar permiso del propietario si aún tiene el error.


No funciona. Todos los directorios dentro de la aplicación tienen permiso
drwxrwxrwx

@tav, ¿puede verificar el permiso de su propietario para su carpeta de prueba?
Khay

El mismo drwxrwxrwx. Resolvió el problema utilizando las sugerencias de @ vsmoraes (ver los comentarios)
vishnub1626

44
chmod 777 es un riesgo de seguridad
Yogesh Kamat

9

Según Laravel 5.4, que es lo último mientras escribo esto, si tiene algún problema como este, debe cambiar el permiso. NO ESCUCHE A NADIE QUE LE DIGA QUE CONFIGURE 777 PARA NINGÚN DIRECTORIO. Tiene un problema de seguridad. Cambiar el permiso de la carpeta de almacenamiento como este

sudo chmod -R 775 storage

Cambiar el permiso de la carpeta de arranque como este

sudo chmod -R 775 bootstrap/cache

Ahora, asegúrese de ejecutar ambos comandos desde el directorio de su aplicación. No tendrá problemas en el futuro con respecto al permiso. 775 no compromete la seguridad de su máquina.


7

Sugiera el permiso correcto, si es para Apache,

sudo chown -R apache:apache apppath/app/storage

Uso de Laravel Forge: sudo chown -R forge: forge ~ / project / storage / sudo chown -R forge: forge ~ / project / bootstrap / cache /
Flappy

6

Si tiene Laravel 5 y busca una solución permanente, tanto el php artisanuso de la línea de comandos como el servidor Apache lo usan:

sudo chmod -R 777 vendor storage
echo "umask 000" | sudo tee -a /etc/resolv.conf
sudo service apache2 restart

Ver explicación detallada aquí .


8
parece una mala idea usar 777
Randy L

umask 000 en resolv.conf?! ¿Dónde está esta gente obteniendo esta información? esa es una línea inválida en resolv.conf. Ignore esto y todas las 777 "soluciones" que existen
higuita

revise la url y no encuentre la opción umask en resolv.conf linux.die.net/man/5/resolv.conf
higuita

6

PARA CUALQUIERA QUE EJECUTE UN SO CON SELINUX: La forma correcta de permitir que httpd escriba en la carpeta de almacenamiento laravel es:

sudo semanage fcontext -a -t httpd_sys_rw_content_t '/path/to/www/storage(/.*)?'

Luego, para aplicar los cambios de inmediato:

sudo restorecon -F -r '/path/to/www/storage'

Puede ser difícil lidiar con SELinux, pero si está presente, te aconsejo que lo aprendas en lugar de evitarlo por completo.


Mi problema exacto en los nuevos centos 7 fue similar. decía que no tenía permiso para escribir, pero todos eran 777 para probar. Entonces, esta publicación realmente me ahorró tiempo después de todo el control general.
HumaN

1
Esta es la solución correcta, aunque creo que el tipo correcto de SELinux debería ser httpd_sys_rw_content_t sudo semanage fcontext -a -t httpd_sys_rw_content_t '/path/to/www/storage(/.*)?'
imabug

4

Tuve el mismo problema y los pasos a continuación me ayudaron a solucionar el problema.

  1. Averigüe el usuario de apache: creó un archivo test.php en la carpeta pública con el código

<?php echo exec('whoami'); ?>

Y ejecute el archivo desde el navegador web. Le daría al usuario apache. En mi caso, es ec2-user ya que estaba usando aws con cronjob instalado en /etc/cron.d/. Podría ser un usuario diferente para los demás.

  1. Ejecute el siguiente comando en la línea de comando.

sudo chown -R ec2-user:<usergroup> /app-path/public

Debe identificar y usar el "usuario" y el "grupo de usuarios" correctos aquí.


4

Si usa Linux o Mac, incluso también puede ejecutarlo ssh terminal. Puede usar la terminal para ejecutar este comando,

 php artisan cache:clear 
 sudo chmod -R 777 storage
 composer dump-autoload

Si está utilizando Windows, puede ejecutar usando git bash.

 php artisan cache:clear 
 chmod -R 777 storage
 composer dump-autoload

Puede descargar el formulario git https://git-scm.com/downloads .



2

Cada vez que cambio app.php obtengo un permiso denegado escribiendo bootstrap / cache / services.json, así que hice esto para solucionarlo:

chmod -R 777 bootstrap/cache/

8
chmod 777 es un riesgo de seguridad
Yogesh Kamat


2

¡Establecer el permiso para 777 es definitivamente una idea terrible!

... pero

Si obtiene un error de permiso conectado con la carpeta "almacenamiento", eso es lo que funcionó para mí:

1) Establezca el permiso "almacenamiento" y sus subcarpetas en 777 con

sudo chmod -R 777 storage/

2) En el navegador, vaya a la página de inicio de laravel laravel / public / (laravel creará los archivos de almacenamiento inicial necesarios)

3) Devuelva el permiso Safe 775 al almacenamiento y sus subcarpetas

sudo chmod -R 775 storage/

2

Si usa laradock, intente chown -R laradock:www-data ./storageen su contenedor de espacio de trabajo


1

En mi caso, la solución era cambiar el permiso app/storage/framework/viewsy los app/storage/logsdirectorios.


0

Si alguien más se encuentra con un problema similar con el error de permisos de archivos fopen, pero es lo suficientemente inteligente como para no chmod 777 a ciegas, esta es mi sugerencia.

Verifique el comando que está utilizando para los permisos que apache necesita:

fopen('filepath/filename.pdf', 'r');

La 'r' significa abierto para solo lectura, y si no está editando el archivo, esto es lo que debería tener configurado. Esto significa que apache / www-data necesita al menos permiso de lectura en ese archivo, que si el archivo se crea a través de laravel ya tendrá permiso de lectura.

Si por alguna razón tiene que escribir en el archivo:

fopen('filepath/filename.pdf', 'r+');

Luego, asegúrese de que apache también tenga permisos para escribir en el archivo.

http://php.net/manual/en/function.fopen.php


0

Simplemente inicie su servidor usando artisian

php artisian serve

Luego acceda a su proyecto desde la URL especificada:

ingrese la descripción de la imagen aquí


0

Tengo el mismo problema cuando ejecuto vagrant en mac. resolvió el problema cambiando el usuario del servidor Apache en el archivo https.conf:

# check user for php
[vagrant] ubuntu ~ $ php -i | grep USER
USER => ubuntu
$_SERVER['USER'] => ubuntu
[vagrant] ubuntu ~ $ 

Ejecute apache con php user en lugar de user daemon para resolver el problema de acceso a archivos con php

# change default apache user from daemon to php user
sudo sed -i 's/User daemon/User ubuntu/g' /opt/lampp/etc/httpd.conf
sudo sed -i 's/Group daemon/Group ubuntu/g' /opt/lampp/etc/httpd.conf

ahora, el archivo de caché creado por php se puede leer y editar con apache sin mostrar ningún error de permiso de acceso.


0

Después de muchas pruebas y errores con permisos de directorio, terminé con una epifanía ... no quedaba espacio en la partición del disco. Solo quería compartir para asegurarme de que nadie más sea lo suficientemente estúpido como para seguir buscando la solución en la dirección incorrecta.

En Linux puede usar df -hpara verificar el tamaño de su disco y el espacio libre.


0

Este problema en realidad es causado por diferentes usuarios que desean write/read archivar pero denegados causan una propiedad diferente. tal vez usted como 'root' instaló laravel antes de iniciar sesión en su sitio como usuario 'laravel' donde 'laravel' es la propiedad predeterminada, por lo que este es el problema real aquí. Entonces, cuando el usuario 'laravel' quiere leer / escribir todos los archivos en el disco de manera predeterminada, para ser denegado, haga que ese archivo tenga la propiedad de 'root'.

Para resolver este problema, puede seguir así:

sudo chown -hR your-user-name /root /nameforlder

o en mi caso

sudo chown -hR igmcoid /root /sublaravel

Nota:

  1. root como nombre de primera propiedad que instaló antes
  2. your-user-name como la propiedad predeterminada que realmente escribe / lee en el sitio.
  3. namefolder como carpeta de nombre que quiere que cambie la propiedad.

0

Obtuve los mismos errores en mi proyecto ...
Pero descubrí que olvidé poner enctypemi formulario.

<form method="#" action="#" enctype="multipart/form-data">

Espera que ayude en algún lugar de alguna manera ...


0

Mientras trabajaba en Windows 10 con Laragon y Laravel 4, me pareció que no había forma de cambiar los permisos manualmente, ya que la ejecución de chmodcomandos en el terminal incorporado en Laragon no tuvo ningún efecto.

Sin embargo, en este terminal era posible ir a la carpeta de almacenamiento y agregar manualmente las carpetas deseadas de esta manera:

cd app/storage
mkdir cache
mkdir meta
mkdir views
mkdir sessions

El cdcomando -en el terminal lo lleva a la carpeta (es posible que deba ajustar esta ruta para que se adapte a su estructura de archivos). El mkdircomando creará el directorio con el nombre dado.

No tuve la oportunidad de probar este enfoque en Laravel 5, pero espero que funcione un enfoque similar.

Por supuesto, podría haber una mejor manera, pero al menos esta fue una solución razonable para mi situación (solucionar el error:) file_put_contents(/var/www/html/laravel/app/storage/meta/services.json): failed to open stream.


-1
  1. Primero, elimine la carpeta de almacenamiento y luego vuelva a crearla.
  2. Dentro de la carpeta de almacenamiento, cree un nuevo nombre de carpeta como marco.
  3. Dentro de la carpeta marco crea tres carpetas con el nombre de caché, sesiones y vistas.

He resuelto mi problema haciendo esto.


-4

He tratado de dar 777acceso a la carpeta de almacenamiento y me ha funcionado.

1) vaya a su directorio raíz laravel, ( /var/www/htmlpara mí) y ejecute el siguiente comando

chmod 777 -R storage

2
No establezca permisos en 777 ya que esto hace que el directorio sea visible y editable para todos los que puedan ver el directorio. Esto no es recomendable!
CodeNinja
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.