file_put_contents (meta / services.json) : 스트림을 열지 못했습니다 : 권한이 거부되었습니다


169

나는 Laravel을 처음 사용합니다. 열려고 http://localhost/test/public/했는데

예외 처리기에서 오류가 발생했습니다.

나는 구글을 사용하여 스토리지 디렉토리의 권한을 변경 chmod -R 777 app/storage했지만 아무 소용이 없었다.

나는 변화 debug=>trueapp.php하고 페이지를 방문하고 예외 핸들러에서 오류가 발생했습니다 :

스트림 또는 파일 "/var/www/html/test/app/storage/logs/laravel.log"를 열 수 없습니다 : 스트림을 열지 못했습니다 : / var / www / html / test / bootstrap / compiled에서 권한이 거부되었습니다. php : 8423

그런 다음 명령을 사용하여 저장소 디렉토리의 권한을 변경하고 chmod -R 644 app/storage'Exception in exception handler'오류가 사라지고 페이지가로드됩니다. 그러나 거기에 나는 이것을 얻고있다 :

file_put_contents (/var/www/html/laravel/app/storage/meta/services.json) : 스트림을 열지 못했습니다 : 권한이 거부되었습니다


2
또 다시 허용 문제인 것처럼 보입니다. chmod는 모든 응용 프로그램 디렉토리를 재귀 적으로
alou

@ alou 나는 chmod -R 777 app / storage로 이미 그렇게했다고 생각합니다. 내가 아니 었어? 그리고 앱 내부의 모든 디렉토리에는 drwxrwxrwx 권한이 있습니다.
vishnub1626

33
php artisan cache:clear다음 시도 : chmod -R 777 app/storage마지막으로php artisan dump-autoload
vsmoraes

@vsmoraes 효과가있었습니다. 문제가 무엇인지 설명 할 수 있다면 정말 도움이 될 것입니다.
vishnub1626

7
vsmoraes의 의견은 정확했지만 'php artisan dump-autoload'대신 'composer dump-autoload'가되어야합니다
Elliot Robert

답변:


320

vsmoraes의 제안 이 나를 위해 일했습니다.

라 라벨> = 5.4

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

라 라벨 <5.4

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

참고 : 원격 서버 (기기 또는 생산)에서이 작업을 수행하지 마십시오

이 질문을했을 때, 이것은 가상 머신에서 실행되는 로컬 호스트의 문제였습니다. 그래서 777을 설정하는 것이 안전하다고 생각했지만 사람들은 다른 해결책을 찾아야한다고 말할 때 적절합니다. 먼저 775를 시도하십시오


8
sudo chmod -R 777 앱 / 스토리지 여야합니다. 권한 오류를 피하기 위해.
Olaitan Mayowa

5
# Laravel5에 대한 지침은 거의 동일 php artisan cache:clear한 후, chmod -R 777 storage다음과 composer dump-autoload
WNRosenberg

6
Laravel 5.1 이상을 사용하는 경우 chmod -R 777 storage대신 해야 합니다.
James

10
php artisan cache:clear정답입니다. 그런 다음 읽기 / 쓰기 또는 특히 실행 권한 을주지 않고sudo chmod -R ug+rw storage 올바른 권한을 부여합니다. others
잭 모리스

43
당신이 원할 때마다 당신이 원하는대로 (내가 이해하는 결과를 생각하지 않고, 빨리, 당신이 원하는 무엇이든 할 수있는 방법을 가르치는 :이 답변 및 스레드는 내가 너무 Laravel을 싫어하는 이유 하이라이트입니다 777Laravel의 특정 아니지만, Laravel 개발자를위한 사고 과정은 "지금 작동하고 어떻게하는지 상관하지 않습니다"와 같습니다 777. 일반적으로 어떤 일을 777하기 위해 어떤 것도 설정하지 마십시오 . 서버와 사용자 / 역할을 이해하고 적절하게 설정하십시오. 해킹하지 마십시오. 당신의 고객은 당신이 이것을 올바르게 할 것을 믿습니다.
dKen

70

Laravel 5에서이 문제에 직면 한 Google 직원에게 적합합니다.

이것은 다른 사용자 storage/logs가 다른 권한으로 폴더 내에서 동일한 로그 파일에 쓰려고 시도하는 경우 발생하는 권한 문제 입니다.

laravel 구성은 매일 오류를 기록하도록 설정되어 있으므로 웹 서버 (apache / nginx)는 환경에 따라 기본 사용자 아래 에이 파일을 만들 수 있습니다 _www.OSX 또는 www-data* NIX 시스템 과 같은 것일 수 있습니다. 일부 장인 명령을 실행하고 오류가 발생했을 때 제공되므로 터미널의 PHP는 실제로 다른 사용자가 로그인 사용자에 의해 실행되므로 장인은이 파일을 작성하지만 다른 사용자로 작성합니다.이 명령을 실행하여 확인할 수 있습니다 :

php -i | grep USER

로그인 사용자가 웹 서버에서 해당 로그 파일을 작성한 경우, laravel은 655기본적 으로 권한이있는 로그 파일 을 작성하여 소유자 만 작성할 수 있으므로 오류를 기록 할 수 없으며 그 반대도 마찬가지 입니다.

이 임시 문제를 해결하려면 664로그인 사용자와 웹 서버 사용자가 해당 로그 파일에 쓸 수 있도록 그룹 에 대한 권한 을이 파일 에 수동으로 부여해야 합니다.

이 문제를 영구적으로 피하기 위해 storage/logs디렉토리에서 권한을 상속하여 디렉토리 내에 새 파일을 만들 때 적절한 권한을 설정하려고 할 수 있습니다. https://unix.stackexchange.com/a/115632 는 디렉토리에서 권한을 상속하여 해결할 수 있습니다. 그.


fan-friggen-tastic 답변은 여기! Elastic Beanstalk에서 실행 중이고 명령 줄 PHP 사용자는 "ec2-user"이지만 내 응용 프로그램은 "webapp"로 실행됩니다.
랜디 L

1
문제를 설명하는 답변. 즉 정답입니다.
Craicerjack

이를 통해 Laravel on Cloudways에서 파일 캐시 오류가 발생하는 이유를 알 수있었습니다. Cloudways 패널에서 버튼을 눌러 파일 권한을 재설정해야했습니다. 감사.
Ryan

44

777 권한을 부여해서는 안됩니다. 보안 위험이 있습니다. Laravel 5의 우분투 사용자에게는 디렉토리 저장소의 소유자를 재귀 적으로 변경하는 것이 좋습니다.

다음을 시도하십시오.

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

우분투 기반 시스템에서 www-data는 아파치 사용자입니다.


2
이것은 나를 위해 수정되었으며 chmod 777답변 보다 더 정확합니다 (제 생각에는) . 감사합니다 ~
GavinR

나는 그것이 Linux 사용자들에게 가장 편리한 대답이라고 생각합니다. 감사합니다 @GavinR. chmod 777완전한 악몽이다.
Abdalla Arbab

이것은 나를 위해 일했고 chmod -777보다 확실히 더 나은 옵션입니다
Egnaro

문제를 해결하는 새로운 방법에 감사드립니다! chmod 777결과 를 되돌리려면 명령 전후에 무언가를해야 합니까?
Aleksandar

41

Laravel 5, Homestead 및 Mac을 사용하는 모든 사람에게 다음을 시도하십시오.

mkdir storage/framework/views

Laravel 5.2.7의 Laravel Forge를 사용하여 새 서버를 만드는 것도 가능합니다.
winkster

2
이것은 나를 위해 그것을했다. bootstrap/cache/compiled.php이 디렉토리에 쓰려고 한 것 같지만 존재하지 않아 권한 오류가 발생했습니다. 감사합니다.
매트 K

1
어떻게 든 이것이 나를 위해 일했습니다. 나는 BTW laravel 5.1을 사용하고 있습니다
Yohanes Gultom

감사합니다. 나는 이것이 라 라벨에 의해 다시 생성 될 것이라고 생각하는 전체 스토리지 디렉토리를 제거했습니다.
grimmdude

33

때때로 SELINUX가이 문제를 일으켰습니다. 이 명령으로 selinux를 비활성화 할 수 있습니다.

sudo setenforce 0

와우, 나는 정말 트릭과 일을했다, 누군가 그것이 왜 효과가 있었는지 설명 할 수 있습니까? selinux 란 무엇입니까?
undefinedman

네, 정말 효과가있었습니다! SELINUX에서 이것을 이해하는 데 전문가가 도움이 되겠습니까? im fedora 24 btw를 사용하여
loki9

1
고마워요 정말 고마워요 나는 인터넷을 검색하고 모두가 나에게 권한을 확인하고 사용자를 확인하는 등을 말합니다 ...
Ali ZahediGol

3
이것은 기본적으로 열려있는 포트를 차단했기 때문에 전체 방화벽을 끄는 것과 같습니다.
Teh JoE

나는 이것을 들어 본 적이 없다. "SELinux (Security-Enhanced Linux)는 액세스 제어 보안 정책을 지원하는 메커니즘을 제공하는 Linux 커널 보안 모듈입니다." 나는 그것을 끄는 것이 좋습니다 생각합니다. 그리고 upvoters는 전체 결과를 이해하지 않고이 명령을 맹목적으로 사용합니다.
Ryan

18

문제 해결됨

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

이것은 app, framework, logs에 대한 쓰기 권한을 활성화합니다.


12
777 ... dev 또는 prod에서는 dev에서 작동하는 것의 환영을 줄 수 있지만 777도 좋은 아이디어가 아닌 한 prod에서 깨질 것입니다.
Kyle Burkett

wooha you rock ... 공급 업체는 내가 놓친 회사입니다
lu1s

예, 대중에게 공개되는 웹 777에 무언가를 제공하는 것은 나쁜 생각입니다
imabug

17

IT 퍼미션 777을 제공하지 마십시오!

터미널의 laravel 프로젝트 디렉토리로 이동하여 다음을 작성하십시오.

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

이렇게하면 사용자를 소유자로 만들고 권한을 부여합니다 :
1 실행, 2 쓰기, 4 읽기
1 + 2 + 4 = 7 평균 (rwx)
2 + 4 = 6 평균 (rw),
마지막으로 스토리지 액세스 + rwx는 사용자와 그룹에 7을 제공한다는 의미입니다.


1
많이 dev에의 777를 사용하는 것처럼 내가 왜 몰라 ... 어떻게 든 그들은 자신의 시스템에 대해 신경 didnt가 ..
ZeroOne

15

방대한 사용자의 경우 해결책은 다음과 같습니다.

(방랑 중) php artisan cache : clear

chmod -R 777 앱 / 스토리지

(잡초로) 작곡가 덤프 자동로드

여기에 방랑자가 아닌 지역 환경에서 chmod를 만드는 것이 중요합니다!


6
777이 너무 열려 있지 않습니까?
simo

3
나는 생산을 위해 확실히 의미합니다. 그러나 이것은 로컬 개발 환경입니다. 777은 원래 포스터가 사용한 것과 다른 답변입니다. 775 또는 755가 작동 할 수 있습니다.
Brendan

12

로 다시 시도하십시오 chmod -R 755 /var/www/html/test/app/storage. Operation not permittedchmod에서 sudo와 함께 사용하십시오 . 여전히 오류가 발생하면 소유자 확인 권한을 사용하십시오.


작동하지 않는. 응용 프로그램 내부의 모든 디렉토리 권한 drwxrwxrwx이
vishnub1626

@tav 테스트 폴더에 대한 소유자 권한을 확인할 수 있습니까?
Khay

같은 drwxrwxrwx. @vsmoraes의 제안을 사용하여 문제를 해결했습니다 (의견 참조)
vishnub1626

4
chmod 777은 보안 위험입니다
Yogesh Kamat

9

내가 쓰고있는 최신 Laravel 5.4에 따라 이와 같은 문제가 발생하면 권한을 변경해야합니다. 전화 번호부를 777로 설정 한 사람에게 귀를 기울이지 마십시오. 보안 문제가 있습니다. 저장 폴더의 권한을 다음과 같이 변경하십시오.

sudo chmod -R 775 storage

이와 같은 부트 스트랩 폴더 권한 변경

sudo chmod -R 775 bootstrap/cache

이제 응용 프로그램 디렉토리에서 두 명령을 모두 실행하고 있는지 확인하십시오. 향후 허가에 관한 문제에 직면하지 않을 것입니다. 775는 시스템의 보안을 손상시키지 않습니다.


7

Apache의 경우 올바른 권한을 제안하십시오.

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

Laravel Forge 사용 : sudo chown -R forge : forge ~ / project / storage / sudo chown -R forge : forge ~ / project / bootstrap / cache /
Flappy

6

Laravel 5 를 가지고 있고 영구적 인 솔루션을 찾고 있다면 , php artisan명령 행 사용법과 Apache 서버 모두에 다음을 사용하십시오.

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

자세한 설명은 여기를 참조 하십시오 .


8

resolv.conf의 umask 000 ?! 이 사람들이이 정보를 어디서 얻습니까? 이것은 resolv.conf에서 유효하지 않은 줄입니다. 이것과 모든 777 "솔루션"을 무시하십시오
higuita

URL을 확인하고 resolv.conf에서 umask 옵션을 찾을 수 없음 linux.die.net/man/5/resolv.conf
higuita

6

SELINUX를 사용하여 OS를 실행하는 모든 사람 : httpd가 laravel 스토리지 폴더에 쓸 수있는 올바른 방법은 다음과 같습니다.

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

그런 다음 변경 사항을 즉시 적용하십시오.

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

SELinux는 다루기가 어려울 수 있지만, 존재하는 경우 완전히 우회하지 않고 배우는 것이 좋습니다.


신선한 centos 7에서 내 정확한 문제는 비슷했습니다. 쓰기 권한이 없지만 테스트를 위해 모두 777이었습니다. 그래서이 게시물은 실제로 모든 일반 점검 후 내 시간을 절약했습니다.
HumaN

1
비록 올바른 SELinux 타입이 httpd_sys_rw_content_t이어야한다고 생각하지만 이것이 올바른 해결책입니다. sudo semanage fcontext -a -t httpd_sys_rw_content_t '/path/to/www/storage(/.*)?'
imabug

4

나는 같은 문제가 있었고 아래 단계를 통해 문제를 해결하는 데 도움이되었습니다.

  1. 아파치 사용자 찾기-코드가있는 공용 폴더에 test.php 파일을 만들었습니다.

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

그리고 웹 브라우저에서 파일을 실행하십시오. 아파치 사용자에게 줄 것이다. 필자의 경우 /etc/cron.d/에 cronjob이 설치된 AWS를 사용했기 때문에 ec2-user입니다. 다른 사용자에게는 다른 사용자 일 수 있습니다.

  1. 명령 행에서 아래 명령을 실행하십시오.

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

여기에서 올바른 "사용자"및 "사용자 그룹"을 식별하고 사용해야합니다.


4

Linux 또는 Mac을 사용하는 경우에서도 실행할 수 있습니다 ssh terminal. 이 명령을 실행하기 위해 터미널을 사용할 수 있습니다.

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

창을 사용하는 경우을 사용하여 실행할 수 있습니다 git bash.

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

git form https://git-scm.com/downloads를 다운로드 할 수 있습니다 .



2

app.php를 변경할 때마다 bootstrap / cache / services.json 쓰기 권한이 거부되어 문제를 해결했습니다.

chmod -R 777 bootstrap/cache/

8
chmod 777은 보안 위험입니다
Yogesh Kamat

2
rm storage/logs/laravel.log  

나를 위해 이것을 해결


2

777에 권한을 설정하는 것은 끔찍한 생각입니다!

...하지만

"storage"폴더와 연결된 권한 오류가 발생하면 저에게 효과적입니다.

1) "storage"및 해당 하위 폴더 권한을 777로 설정하십시오.

sudo chmod -R 777 storage/

2) 브라우저에서 laravel 홈페이지 laravel / public /으로 이동하십시오 (laravel은 필요한 초기 저장 파일을 생성합니다)

3) 안전한 775 권한을 스토리지 및 해당 하위 폴더로 반환

sudo chmod -R 775 storage/

2

laradock을 사용하는 경우 chown -R laradock:www-data ./storage작업 공간 컨테이너를 사용해보십시오


1

필자의 경우 해결책은 권한 app/storage/framework/viewsapp/storage/logs디렉토리 를 변경하는 것이 었습니다 .


0

다른 사람이 fopen 파일 권한 오류와 비슷한 문제를 겪고 있지만 맹목적으로 chmod 777을 사용하지 않는 것이 현명한 경우입니다.

아파치에 필요한 권한에 대해 사용중인 명령을 확인하십시오.

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

'r'은 읽기 전용으로 열려 있음을 의미하며 파일을 편집하지 않는 경우이 파일을 설정해야합니다. 이것은 apache / www-data가 최소한 해당 파일에 대한 읽기 권한이 필요하다는 것을 의미합니다. 파일이 laravel을 통해 작성되면 이미 읽기 권한이 있습니다.

어떤 이유로 든 파일에 써야하는 경우 :

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

그런 다음 아파치에 파일 쓰기 권한이 있는지 확인하십시오.

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


0

사용하여 서버를 시작하십시오. artisian

php artisian serve

그런 다음 지정된 URL에서 프로젝트에 액세스하십시오.

여기에 이미지 설명을 입력하십시오


0

Mac에서 방랑자를 실행할 때도 같은 문제가 있습니다. https.conf 파일에서 Apache 서버의 사용자를 변경하여 문제를 해결했습니다.

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

PHP로 파일 액세스 문제를 해결하기 위해 사용자 데몬 대신 php user에서 Apache를 실행하십시오.

# 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

이제, PHP가 생성 한 캐시 파일을 액세스 권한 오류없이 아파치에서 읽고 편집 할 수 있습니다.


0

디렉토리 권한에 대한 많은 시행 착오 끝에 나는 결국 주현절을 겪었습니다. 디스크 파티션에 남은 공간이 없었습니다. 다른 사람이 잘못된 방향으로 솔루션을 계속 찾을만큼 바보가되지 않도록 공유하고 싶었습니다.

Linux에서는 df -h디스크 크기와 여유 공간을 확인 하는 데 사용할 수 있습니다 .


0

이 문제는 실제로 다른 사용자가 원하는 write/read 파일 제출하려고하지만 거부 다른 소유권이 발생합니다. 어쩌면 당신은 laravel을 '루트'로 설치 한 후 'laravel'기본 소유권 인 'laravel'사용자로 사이트에 로그인하기 때문에 이것이 실제 문제입니다. 따라서 사용자 'laravel'이 기본적으로 디스크의 모든 파일을 읽고 쓰려고 할 때 거부하려면 해당 파일의 소유권이 'root'입니다.

이 문제를 해결하려면 다음과 같이 수행하십시오.

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

또는 내 경우에는

sudo chown -hR igmcoid /root /sublaravel

각주:

  1. root 이전에 설치 한 최초의 소유권
  2. your-user-name 실제로 사이트에서 쓰거나 읽은 기본 소유권으로
  3. namefolder 소유권을 변경하려는 이름 폴더로.

0

내 프로젝트에서 같은 오류가 발생했습니다 ...
하지만 enctype양식을 작성 하는 것을 잊었다는 것을 알았습니다 .

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

어딘가에 도움이되기를 바랍니다 ...


0

Laragon 및 Laravel 4가 설치된 Windows 10에서 작업하는 동안 권한을 수동으로 변경할 수있는 방법이없는 것 같습니다. chmod Laragon-in-built-terminal에서 -commands를 해도 아무런 영향이 없으므로 .

그러나이 터미널에서 스토리지 폴더로 이동하여 다음과 같이 원하는 폴더를 수동으로 추가 할 수 있습니다.

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

cd터미널 의 -명령은 폴더로 이동합니다 (파일 구조에 맞게이 경로를 조정해야 할 수도 있습니다). 그만큼mkdir- 명령은 지정된 이름의 디렉토리를 생성합니다.

Laravel 5에서이 방법을 테스트 할 기회는 없었지만 비슷한 방법이 효과가있을 것으로 기대합니다.

물론 더 좋은 방법이있을 수 있지만 적어도 이것은 내 상황에 대한 합리적인 해결 방법이었습니다 (오류 수정 :) file_put_contents(/var/www/html/laravel/app/storage/meta/services.json): failed to open stream.


-1
  1. 먼저 저장소 폴더를 삭제 한 다음 다시 저장소 폴더를 만드십시오.
  2. 저장소 폴더 안에 새 폴더 이름을 프레임 워크로 만듭니다.
  3. 내부 프레임 워크 폴더에는 캐시, 세션 및보기라는 세 개의 폴더 이름이 생성됩니다.

이 작업을 수행하여 문제를 해결했습니다.


-4

777저장 폴더에 대한 액세스 권한 을 부여하려고 시도 했으며 저에게 효과적입니다.

1) laravel 루트 디렉토리로 이동하여 ( /var/www/html나를 위해) 다음 명령을 실행하십시오.

chmod 777 -R storage

2
dir을 볼 수있는 모든 사용자가 dir을 표시하고 편집 할 수 있도록 권한을 777로 설정하지 마십시오. 권장하지 않습니다!
CodeNinja
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.