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


169

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

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

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

나는 변화 debug=>true에 app.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/views과 app/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.