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

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

ecairol
fuente
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.

Adriano Rosa
fuente
¡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.

RibeiroSt
fuente
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
Hans P
fuente
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
Mahrad
fuente
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

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

Ibrahim W.
fuente
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!

Brendan
fuente
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.

Khay
fuente
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.

Koushik Das
fuente
7

Sugiera el permiso correcto, si es para Apache,

sudo chown -R apache:apache apppath/app/storage
Sean
fuente
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í .

alexeydemin
fuente
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.

Heather Gaye
fuente
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í.

KiranD
fuente
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 .

Rasheduzzaman
fuente
3

Xampp para uso:

cd /Applications/XAMPP/htdocs  
chmod -R 775 test/app/storage
cristianojeda
fuente
1
¿Puedes explicar esto un poco más?
Aaron Hall
Uso este artículo y estaba: Configurando Laravel 4.x en Mac OSX 10.8+ con XAMPP
cristianojeda
3
chmod 777 es un riesgo de seguridad
Yogesh Kamat
1
También puede usar este chmod 775
cristianojeda
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/
malhal
fuente
8
chmod 777 es un riesgo de seguridad
Yogesh Kamat
2
rm storage/logs/laravel.log  

me resolvió esto

aad1992
fuente
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/
Nika Tsogiaidze
fuente
2

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

Rob L
fuente
1

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

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

Kyle Burkett
fuente
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í

wajih
fuente
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.

nigam214
fuente
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.

Franco
fuente
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.
Dicha Jaspis
fuente
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 ...

Vpa
fuente
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.

Virginia
fuente
-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.

Md Juyel Rana
fuente
-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
Yur Gasparyan
fuente
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