Laravel에 대한 파일 권한을 설정하는 방법은 무엇입니까?


233

소유자가로 설정된 Apache Web Server를 사용하고 _www:_www있습니다. 새 Laravel 5 프로젝트를 만들 때와 같이 파일 권한에 대한 모범 사례가 무엇인지 절대 알 수 없습니다.

Laravel 5는 /storage쓰기 가능한 폴더가 필요 합니다. 나는 그것이 작동하게하는 많은 다른 접근법을 발견했으며 일반적으로 777chmod를 재귀 적 으로 만드는 것으로 끝납니다 . 나는 그것이 최선의 아이디어는 아니라는 것을 안다.

공식 문서는 말합니다 :

Laravel은 일부 권한을 구성해야 할 수 있습니다. 폴더 내에 storage있고 vendor웹 서버에 의한 쓰기 액세스가 필요합니다.

웹 서버가 storagevendor폴더 자체 또는 현재 컨텐츠에만 액세스해야 합니까?

나는 훨씬 더 나은 것이 권한 대신 소유자 를 변경한다고 가정합니다 . Laravel의 모든 파일 권한을 재귀 적으로 _www:_www변경했으며 chmod를로 변경 한 것처럼 사이트가 올바르게 작동했습니다 777. 문제는 이제 파일을 저장할 때마다 텍스트 편집기에서 비밀번호를 묻는 메시지가 표시되며 파일 복사와 같이 Finder에서 아무것도 변경하려고 할 때도 마찬가지입니다.

이러한 문제를 해결하는 올바른 방법은 무엇입니까?

  1. 변화 chmod
  2. 파일 소유자를 웹 서버의 소유자와 일치하도록 변경하고 텍스트 편집기 (및 Finder?)를 설정하여 비밀번호 요청을 건너 뛰거나 사용하도록 설정하십시오. sudo
  3. 웹 서버의 소유자를 운영 체제 사용자와 일치하도록 변경하십시오 (결과는 모르겠습니다)
  4. 다른 것

4
나는 777모든 사람에 대한 모든 권한을 포함하기 때문에 너무 많은 자유 라고 생각 합니다.
Robo Robok 2018 년

Laravel 문서에서 : storage및 디렉토리 내의 bootstrap/cache디렉토리는 웹 서버에 의해 쓰기 가능해야합니다
joshuamabina

1
fcgi를 사용하면 모든 사람에 대해 755/644를 사용할 수 있습니다 (공개 / 저장 포함)
Jeffz

@ jww는 질문을 보류하지 않고 serverfault로 옮길 수 있습니까?
wp78de

답변:


587

이 토론을 보는 모든 사람에게 명백한 설명을하기 위해 .... 폴더에 777 권한을 부여하면 누구나 해당 디렉토리의 모든 파일을 읽고 쓰고 실행할 수 있습니다 .... 이것이 의미하는 바 모든 파일, 바이러스 또는 기타 파일을 업로드하고 해당 파일을 실행할 수있는 모든 사용자 (전 세계의 모든 해커 또는 악의적 인 사용자) 권한

폴더 권한을 777로 설정 한 경우 해당 디렉토리를 찾을 수있는 사람에게 서버를 열었습니다. 충분히 클리어 ??? :)

기본적으로 소유권과 권한을 설정하는 두 가지 방법이 있습니다. 자신에게 소유권을 부여하거나 웹 서버를 모든 파일의 소유자로 만듭니다.

웹 서버 소유자 (대부분의 사람들이하는 방식과 Laravel 문서의 방식) :

www-data를 가정하면 (다른 것일 수도 있음) 웹 서버 사용자입니다.

sudo chown -R www-data : www-data / path / to / your / laravel / root / directory

그렇게하면 웹 서버가 모든 파일을 소유하고 그룹이기도하며 FTP 클라이언트가 웹 서버가 아닌 사용자로 로그인하기 때문에 FTP를 통해 파일을 업로드하거나 파일을 사용하는 데 문제가 있습니다. 웹 서버 사용자 그룹에 대한 사용자 :

sudo usermod -a -G www-data 우분투

물론 이것은 웹 서버가 www-data (홈스테드 기본값)로 실행 중이고 사용자가 우분투 (홈스테드를 사용하는 경우 비효율적) 인 것으로 가정합니다.

그런 다음 모든 디렉토리를 755로 설정하고 파일을 644로 설정하십시오. 파일 권한 설정

sudo 찾기 / path / to / your / laravel / root / directory -type f -exec chmod 644 {} \;    

SET 디렉토리 권한

sudo 찾기 / path / to / your / laravel / root / directory -type d -exec chmod 755 {} \;

소유자 인 사용자

모든 디렉토리와 파일을 소유하는 것을 선호하므로 (모든 것을 훨씬 쉽게 사용할 수 있습니다)

sudo chown -R 내 사용자 : www-data / path / to / your / laravel / root / directory

그런 다음 본인과 웹 서버 권한을 모두 부여합니다.

sudo 찾기 / path / to / your / laravel / root / directory -type f -exec chmod 664 {} \;    
sudo 찾기 / path / to / your / laravel / root / directory -type d -exec chmod 775 {} \;

그런 다음 웹 서버에 저장 및 캐시를 읽고 쓸 수있는 권한을 부여하십시오

어떤 방법으로 설정하든, 스토리지, 캐시 및 웹 서버가 업로드 또는 쓰기 해야하는 다른 디렉토리 (상황에 따라)에 대해 웹 서버에 대한 읽기 및 쓰기 권한을 부여해야하므로 위의 bashy에서 명령을 실행하십시오.

sudo chgrp -R www-data 스토리지 부트 스트랩 / 캐시
sudo chmod -R ug + rwx 스토리지 부트 스트랩 / 캐시

이제 안전하고 웹 사이트가 작동하며 파일을 매우 쉽게 사용할 수 있습니다.


4
(일부 배포판에) www가 데이터 대신에 아파치 : 더 www가 데이터 사용자가없는 경우 좋은 예는, 아파치 사용
데니스 Solakovic

53
사람들이 그 anyone개념을 너무 오해한다고 생각합니다 . 리눅스의 anyone깃발은 사람이 아닌 모든 사용자를 의미 합니다 . 여전히 서버 액세스가 필요합니다.
Marco Aurélio Deleu

3
@ andreshg112 첫 번째 www-data는 사용자의 이름이고 두 번째 www-data는 그룹의 이름입니다. 따라서 소유자는 아파치 (이 그룹) 아파치입니다. www-data : www-data를 사용하거나 해당 그룹에 사용자를 추가하십시오. (CLI : useradd -G {group-name} username), 그리고 username : www-group으로
숨길

2
@fs_tigre 보안에는 전혀 큰 차이가 없다고 생각합니다 ... 하나 대신 암호를 추측 해야하는 두 명의 사용자가 있다고 생각합니다. 물론 내 사용자 계정으로 항상 로그인합니다. 안전하지 않은 방식으로 (일반 FTP 및 암호를 사용하여) 사이트를 손상시킬 수 있지만 Putty 및 SSH로만 로그인하고 FTP를 사용할 때 SFTP이므로 아무런 문제가 없습니다. 그들은 끈적 끈적한 비트를 설정하기 때문에 바쉬에 의해 제안 명령은 웹 서버가 서브 디렉토리를 생성하는 경우 그래서 그들은 동일한 소유자 / 부모와 같은 권한을 가질 것, 추천
bgies

3
첫 번째 방법에서는 write그룹에 권한을 부여하지 않아서 사용자가 여전히 파일을 업로드 할 수 없습니까?
Fahmi

44

보안상의 이유로 storagevendor폴더에 대한 권한 은에 유지되어야합니다 775.

그러나 컴퓨터와 서버 모두 Apache가이 폴더에 쓸 수 있어야합니다. 예 :와 같은 명령을 실행할 때 php artisan컴퓨터는의 로그 파일에 작성해야합니다 storage.

폴더의 소유권을 Apache에 제공하기 만하면됩니다.

sudo chown -R www-data:www-data /path/to/your/project/vendor
sudo chown -R www-data:www-data /path/to/your/project/storage

그런 다음 usernameApache 서버가 속한 그룹에 컴퓨터를 참조해야합니다 . 이렇게 :

sudo usermod -a -G www-data userName

참고 : 대부분의 자주 groupName입니다 www-data하지만 귀하의 경우,로 교체_www


10
+1이 방법이 마음에 듭니다. 그러나 chown명령에 -R 플래그가 포함되어야 한다고 생각합니다 . 또한 laravel 5.1 및 5.2에서는 공급 업체 디렉토리 대신 bootstrap / cache 디렉토리에 대한 액세스 권한을 부여해야합니다.
Jason Wheeler

이것이 잘 작동하는지 테스트 할 수있는 방법이 있습니까? 새 로그 파일이 storage / logs 디렉토리에 작성되어 올바른 권한이 있는지 확인하는 방법은 무엇입니까?
Chaudhry Waqas

20

우리는 Laravel 응용 프로그램에 대한 권한을 설정할 때 많은 경우에 부딪 쳤습니다. deployLaravel 응용 프로그램 폴더를 소유하고 CLI에서 Laravel 명령을 실행하기위한 별도의 사용자 계정 ( )을 만들고 에서 웹 서버를 실행합니다 www-data. 이 문제의 원인 중 하나는 로그 파일 을 누가 먼저 로그 파일에 기록했는지에 따라 www-data또는 deploy에 의해 로그 파일을 소유 할 수 있기 때문에 나중에 다른 사용자가 로그 파일에 쓰지 못하게하는 것입니다.

제정신의 안전한 솔루션은 Linux ACL을 사용하는 것입니다. 이 솔루션의 목표는 다음과 같습니다.

  1. 응용 프로그램을 소유 / 배포하는 사용자가 Laravel 응용 프로그램 코드에 대한 읽기 및 쓰기 액세스 권한을 갖도록하기 위해 (우리는라는 사용자를 사용합니다 deploy).
  2. www-data사용자가 Laravel 응용 프로그램 코드에 대한 읽기 권한 을 허용 하지만 쓰기 권한은 허용하지 않습니다.
  3. 다른 사용자가 Laravel 응용 프로그램 코드 / 데이터에 전혀 액세스하지 못하도록합니다.
  4. 허용하려면 모두 www-data사용자와 응용 프로그램 사용자 ( deploy사용자가 파일 소유 (둘 정도되는 관계없이 저장 폴더) 쓰기 액세스, deploywww-data예를 들어 같은 로그 파일에 기록 할 수 있습니다).

다음과 같이이 작업을 수행합니다.

  1. application/폴더 내의 모든 파일 은 기본 umask를 사용하여 만들어 지므로 권한이 0022있는 폴더 drwxr-xr-x와 파일이 있는 폴더가 생성됩니다 -rw-r--r--.
  2. sudo chown -R deploy:deploy application/(또는 단순히 응용 프로그램을 deploy사용자 로 배포 하면됩니다.)
  3. chgrp www-data application/www-data그룹 에게 애플리케이션에 대한 액세스 권한 을 부여합니다 .
  4. chmod 750 application/허용하는 deploy사용자가 읽기 / 쓰기는 www-data사용자가 읽기 전용 및 기타 사용자에게 모든 권한을 제거 할 수 있습니다.
  5. setfacl -Rdm u:www-data:rwx,u:deploy:rwx application/storage/storage/폴더 및 모든 하위 폴더 에 대한 기본 권한을 설정합니다 . 저장 폴더에서 만든 모든 새 폴더 / 파일 (이 권한 상속 rwx모두 www-datadeploy).
  6. setfacl -Rm u:www-data:rwX,u:deploy:rwX application/storage/ 기존 파일 / 폴더에 대해 위 권한을 설정합니다.

15

디렉토리를 소유 한 그룹 내 사용자 (경우에 따라 _www)에 대해 읽기 / 쓰기 / 실행을 가능하게하려면 프로젝트 폴더의 권한을 변경하십시오 .

chmod -R 775 /path/to/your/project

그런 다음 OS X 사용자 이름을 _www그룹에 추가하여 디렉토리에 액세스 할 수 있도록하십시오.

sudo dseditgroup -o edit -a yourusername -t user _www

dseditgroup귀하 가 제공 한 경우 오류가 발생했습니다 : Username and password must be provided..
Robo Robok 2018 년

내 실수로 적절한 권한이있는 사용자로 해당 명령을 실행해야하므로 sudo처음에 추가 하십시오.
Bogdan

그렇다면 해당 파일의 소유자를 _www:_www또는 myuser:_www로 변경해야 합니까?
Robo Robok 2016 년

_www:_www775는 그룹의 모든 사용자 _www가 해당 폴더에서 읽기 / 쓰기 / 실행에 대한 모든 권한을 가지며 해당 사용자 이름을 해당 그룹에 추가 했으므로 그대로 둘 수 있습니다 .
Bogdan

한 가지만 말씀해 주시겠습니까? 무슨 뜻 chown myuser:_www입니까? 첫 번째는 사용자이고 두 번째는 그룹이라는 것을 알고 있지만 "이 사용자와이 그룹의 모든 사용자"또는 "이 사용자는이 그룹에 속할 경우에만"라는 의미입니까?
Robo Robok 2016 년

8

이미 게시 된대로

폴더의 소유권을 Apache에 제공하기 만하면됩니다.

그러나 chown 명령 에 -R 을 추가했습니다 . sudo chown -R www-data:www-data /path/to/your/project/vendor sudo chown -R www-data:www-data /path/to/your/project/storage


3
공급 업체 디렉토리에 권한을 부여해야하는 이유는 무엇입니까? 저장소는 의미가 있고, 로그 파일에 쓰는 등. 왜?
Ali Haris

"하지만 컴퓨터와 서버 모두 아파치가이 폴더에 쓸 수 있어야합니다. 예 : PHP artisan과 같은 명령을 실행할 때 컴퓨터는 저장소의 로그 파일에 기록해야합니다."
Stanislav Potapenko

맥에 오류 : chown : www-data : 불법 그룹 이름
Sunil Kumar


7

대부분의 폴더는 일반 "755"및 파일 "644"여야합니다.

Laravel을 사용하려면 웹 서버 사용자가 일부 폴더를 쓸 수 있어야합니다. UNIX 기반 OS에서이 명령을 사용할 수 있습니다.

sudo chgrp -R www-data storage bootstrap/cache
sudo chmod -R ug+rwx storage bootstrap/cache

7

composer.json에 추가

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

composer install


2
이것은 나쁜 대답입니다. 웹 서버를 올바르게 구성한 경우 폴더에 777을 사용할 필요가 없습니다. 777을 사용하면 해커가 파일을 업로드 할 수있는 서버가 열리고 폴더가 존재하는 위치를 알고 있으면 해당 파일을 실행할 수 있습니다.
mbozwood

2
괜찮아. 무엇을 제공하고 있습니까?
Davron Achilov

그렇다면, 맞습니까? 대한 Chown -R $ USER : www가 데이터 저장 chown 함수 -R의 $ 사용자 : www가 데이터 부트 스트랩 / 캐시
Davron Achilov

정답을보십시오, 그것은 당신이 업데이트 후에 절대적으로 넣을 수있는 모든 필요한 정보를 포함합니다 :)
mbozwood

6

Laravel 5.4 문서는 말한다 :

Laravel을 설치 한 후 일부 권한을 구성해야 할 수 있습니다. storage및 디렉토리 내의 bootstrap/cache디렉토리는 웹 서버에서 쓰기 가능해야합니다. 그렇지 않으면 Laravel이 실행되지 않습니다. Homestead 가상 머신을 사용중인 경우 이러한 권한이 이미 설정되어 있어야합니다.

이 페이지에는 777권한 사용에 대한 답변이 많이 있습니다 . 하지마 해커에게 노출 될 것 입니다.

대신 755 (또는보다 제한적인) 권한을 설정하는 방법에 대한 다른 사람들의 제안을 따르십시오. whoami터미널에서 실행하여 앱이 실행중인 사용자를 파악한 다음을 사용하여 특정 디렉토리의 소유권을 변경 해야 할 수 있습니다 chown -R.

sudo다른 답변이 필요한만큼 사용할 권한이없는 경우 ...

서버는 아마도 Cloudways와 같은 공유 호스트 일 것입니다.

(내 경우에는 Laravel 응용 프로그램을 두 번째 Cloudways 서버로 복제했으며, storagebootstrap/cache디렉토리 의 권한이 엉켜서 완전히 작동하지 않았습니다 .)

나는 사용해야했다 :

Cloudways Platform > Server > Application Settings > Reset Permission

그런 다음 php artisan cache:clear터미널에서 실행할 수 있습니다 .


4

bgles가 게시 한 솔루션은 처음에 권한을 올바르게 설정한다는 점에서 나에게 적합하지만 (두 번째 방법을 사용합니다) 여전히 Laravel에 잠재적 인 문제가 있습니다.

기본적으로 Apache는 644 권한을 가진 파일을 만듭니다. 그래서 그것은 거의 저장소 /에 있습니다. 따라서 스토리지 / 프레임 워크 / 뷰의 내용을 삭제 한 다음 Apache를 통해 페이지에 액세스하면 캐시 된 뷰가 다음과 같이 생성 된 것을 볼 수 있습니다.

-rw-r--r-- 1 www-data www-data 1005 Dec  6 09:40 969370d7664df9c5206b90cd7c2c79c2

"artisan serve"를 실행하고 다른 페이지에 액세스하면 CLI PHP가 Apache와 다르게 작동하기 때문에 다른 권한이 부여됩니다.

-rw-rw-r-- 1 user     www-data 16191 Dec  6 09:48 2a1683fac0674d6f8b0b54cbc8579f8e

프로덕션에서는이 작업을 수행하지 않으므로 그 자체로는 큰 문제가되지 않습니다. 그러나 Apache가 사용자가 작성해야하는 파일을 작성하면 실패합니다. 그리고 이것은 할 수 있습니다 로그인 한 사용자와 장인을 사용하여 배포 할 때 캐시 파일, 캐시 된 뷰 및 로그에 적용될 있습니다. www.data:www-data 644 인 캐시 파일을 삭제하지 못하는 "artisan cache : clear"의 쉬운 예입니다.

www-data로 artisan 명령을 실행하여 부분적으로 완화 할 수 있으므로 다음과 같은 모든 작업을 수행하거나 스크립팅합니다.

sudo -u www-data php artisan cache:clear

또는 지루함을 피하고 이것을 .bash_aliases에 추가하십시오.

alias art='sudo -u www-data php artisan'

이것은 충분하며 보안에 영향을 미치지 않습니다. 그러나 개발 시스템에서 테스트 및 위생 스크립트를 실행하면 'sudo -u www-data'를 사용하여 phpunit을 실행하고 파일을 만들 수있는 빌드를 확인하는 모든 항목을 사용하도록 별칭을 설정하지 않는 한이 문제가 발생합니다.

해결책은 bgles 조언의 두 번째 부분을 따르고 / etc / apache2 / envvars에 다음을 추가하고 Apache를 다시 시작 (다시로드하지 않음)하는 것입니다.

umask 002

이것은 아파치가 기본적으로 664로 파일을 생성하도록합니다. 그 자체로 보안 상 위험 할 수 있습니다. 그러나 Laravel 환경에서 주로 논의되는 곳 (Homestead, Vagrant, Ubuntu)에서 웹 서버는 www-data 그룹의 www-data 사용자로 실행됩니다. 따라서 사용자가 임의로 www-data 그룹에 가입하도록 허용하지 않으면 추가 위험이 없습니다. 누군가가 웹 서버에서 벗어날 경우 어쨌든 www-data 액세스 수준을 가지므로 아무것도 손실되지 않습니다 (보안과 관련하여 가장 좋은 태도는 아니지만). 따라서 프로덕션 환경에서는 비교적 안전하며 단일 사용자 개발 시스템에서는 문제가되지 않습니다.

궁극적으로 사용자가 www-data 그룹에 있고 이러한 파일을 포함하는 모든 디렉토리는 g + s (파일은 항상 상위 디렉토리의 그룹 아래에 작성 됨)이므로 사용자 또는 www-data에 의해 작성된 것은 r / 다른 사람을 위해 w.

이것이 목표입니다.

편집하다

권한 설정에 대한 위의 접근 방식을 조사 할 때 여전히 충분 해 보이지만 몇 가지 조정이 도움이 될 수 있습니다.

기본적으로 디렉토리는 775이고 파일은 664이며 모든 파일에는 프레임 워크를 설치 한 사용자의 소유자와 그룹이 있습니다. 우리가 그 시점에서 시작한다고 가정 해 봅시다.

cd /var/www/projectroot
sudo chmod 750 ./
sudo chgrp www-data ./

우리가하는 첫 번째 일은 다른 사람의 액세스를 차단하고 그룹을 www-data로 만드는 것입니다. www-data의 소유자와 회원 만 디렉토리에 액세스 할 수 있습니다.

sudo chmod 2775 bootstrap/cache
sudo chgrp -R www-data bootstrap/cache

공식 Laravel 설치 가이드에서 제안한대로 웹 서버가 services.json 및 compile.php를 만들 수 있도록합니다. 그룹 고정 비트를 설정한다는 것은 생성자가 www-data 그룹을 소유한다는 것을 의미합니다.

find storage -type d -exec sudo chmod 2775 {} \;
find storage -type f -exec sudo chmod 664 {} \;
sudo chgrp -R www-data storage

캐시, 로그, 세션 및보기 파일을 만들 수 있도록 스토리지 폴더와 동일한 작업을 수행합니다. find는 디렉토리와 파일에 대해 디렉토리 권한을 명시 적으로 다르게 설정하기 위해 사용합니다. 하위 디렉토리가 없기 때문에 부트 스트랩 / 캐시 에서이 작업을 수행 할 필요가 없습니다.

phpunit 등의 링크를 재생성하기 위해 실행 가능한 플래그를 다시 적용하고 공급 업체 / *를 삭제하고 작성기 종속성을 다시 설치해야 할 수도 있습니다.

chmod +x .git/hooks/*
rm vendor/*
composer install -o

그게 다야. 위에서 설명한 Apache의 umask를 제외하고, 이는 www-data에서 전체 프로젝트 루트를 쓰기 가능하게하지 않고도 필요한 모든 것입니다. 이는 다른 솔루션에서 발생합니다. 따라서 www-data로 실행되는 침입자가 쓰기 액세스가 더 제한적이라는 점에서이 방법이 조금 더 안전합니다.

편집 종료

시스템 변경

이것은 php-fpm의 사용에도 적용되지만 다른 것들에도 적용됩니다.

표준 시스템 서비스를 재정의하고 override.conf 파일에 umask를 설정 한 다음 서비스를 다시 시작해야합니다.

sudo systemctl edit php7.0-fpm.service
Use:
    [Service]
    UMask=0002
Then:
sudo systemctl daemon-reload
sudo systemctl restart php7.0-fpm.service

3

이것은 나를 위해 일했다 :

cd [..LARAVEL PROJECT ROOT]
sudo find . -type f -exec chmod 644 {} \;
sudo find . -type d -exec chmod 755 {} \;
sudo chmod -R 777 ./storage
sudo chmod -R 777 ./bootstrap/cache/

그것이하는 일 :

  • 모든 파일 권한을 644로 변경
  • 모든 폴더 권한을 755로 변경
  • 스토리지 및 부트 스트랩 캐시 (라 라벨이 외부에서 사용할 수없는 파일을 생성 및 실행하기 위해 사용하는 특수 폴더)의 경우 내부에 대한 권한을 777로 설정하십시오.

참고 : sudo 접두사로 수행 할 수 없거나 필요하지 않을 수도 있습니다. 사용자의 권한, 그룹 등에 따라 다릅니다.


2

프로젝트 설정의 어려움을 덜기 위해 자체 스크립트를 작성하기로 결정했습니다.

프로젝트 루트 내에서 다음을 실행하십시오.

wget -qO- https://raw.githubusercontent.com/defaye/bootstrap-laravel/master/bootstrap.sh | sh

부트 스트랩이 완료 될 때까지 기다리십시오.

사용하기 전에 스크립트검토하십시오 .


2

EC2 인스턴스에 laravel을 설치했으며 권한 오류를 수정하고 마지막으로 수정하는 데 3 일이 걸렸습니다. 이 경험을 다른 사람과 공유하고 싶습니다.

  1. 사용자 문제 ec2 인스턴스에 로그인 할 때 사용자 이름은 ec2-user이고 사용자 그룹은 ec2-user입니다. 그리고 웹 사이트는 httpd user : apache : apache에서 작동하므로 apache에 대한 권한을 설정해야합니다.

  2. 폴더 및 파일 권한 A. 폴더 구조 먼저 저장 폴더에 이와 같은 폴더 구조가 있는지 확인해야합니다.

    저장

    • 뼈대
      • 은닉처
      • 세션
      • 견해
    • logs 사용하는 라 라벨 버전에 따라 폴더 구조가 다를 수 있습니다. 내 laravel 버전은 5.2이며 버전에 따라 적절한 구조를 찾을 수 있습니다.

B. 권한 처음에는 file_put_contents를 제거하기 위해 저장소에서 777을 설정하라는 지침이 표시됩니다. 스트림을 열지 못했습니다. 따라서 스토리지 chmod -R 777 스토리지에 권한 777을 설정했지만 오류가 수정되지 않았습니다. 여기서는 저장소 / 세션 및보기에 파일을 쓰는 사람을 고려해야합니다. 그것은 ec2-user가 아니라 아파치입니다. 네, 그러죠. "apache"사용자는 파일 (세션 파일, 컴파일 된 뷰 파일)을 세션 및 뷰 폴더에 씁니다. 따라서 아파치에게이 폴더에 대한 쓰기 권한을 부여해야합니다. 기본적으로 SELinux는 / var / www 폴더가 아파치 데몬에 의해 읽기 전용이어야한다고 말합니다.

이를 위해 selinux를 0으로 설정할 수 있습니다 : setenforce 0

이렇게하면 일시적으로 문제를 해결할 수 있지만 mysql이 작동하지 않습니다. 그래서 이것은 좋은 해결책이 아닙니다.

다음을 사용하여 읽기 / 쓰기 컨텍스트를 스토리지 폴더에 설정할 수 있습니다 (테스트하려면 setenforce 1을 기억하십시오).

chcon -Rt httpd_sys_content_rw_t storage/

그러면 문제가 해결 될 것입니다.

  1. 이 작곡가 업데이트 PHP 장인 캐시를 잊지 마십시오 :

    이 명령은 이후 또는 이전에 유용합니다.

    시간을 절약 하시길 바랍니다. 행운을 빕니다. 해켄


웹 서버에서 명령 행 스크립트를 호출하려고 했습니까? 출력이 인쇄되지 않아서 문제가 있습니다
Volatil3

0

나는 다음과 같이 구성했다.

  • Nginx에은 (사용자가 실행 : nginx)
  • PHP-FPM

허용 된 답변에서 @bgies가 제안한대로 권한을 올바르게 적용했습니다. 내 경우의 문제는 원래 PHP-fpm의 구성된 사용자 및 그룹이었습니다 apache.

php-fpm과 함께 NGINX를 사용하는 경우 php-fpm의 구성 파일을 열어야합니다.

nano /etc/php-fpm.d/www.config

그리고 하나의 NGINX로 옵션 값을 대체 user하고 group작동하도록 구성하십시오. 내 경우에는 둘 다 nginx:

... ; Unix user/group of processes ; Note: The user is mandatory. If the group is not set, the default user's group ; will be used. ; RPM: apache Choosed to be able to access some dir as httpd user = nginx ; RPM: Keep a group allowed to write in log dir. group = nginx ...

저장하고 nginx 및 php-fpm 서비스를 다시 시작하십시오.


0

라 라벨 개발자들에게 디렉토리 문제는 약간의 고통이 될 수 있습니다. 내 응용 프로그램에서 즉시 디렉토리를 만들고 로컬 환경 에서이 디렉토리로 파일을 성공적으로 이동했습니다. 그런 다음 서버에서 파일을 새로 만든 디렉토리로 이동하는 동안 오류가 발생했습니다.

다음은 내가 한 일이며 성공적인 결과를 얻었습니다.

  1. sudo find /path/to/your/laravel/root/directory -type f -exec chmod 664 {} \;
    sudo find /path/to/your/laravel/root/directory -type d -exec chmod 775 {} \;
  2. chcon -Rt httpd_sys_content_rw_t /path/to/my/file/upload/directory/in/laravel/project/
  3. 새 디렉토리를 즉석에서 만들면서 명령을 사용했습니다. mkdir($save_path, 0755, true);

프로덕션 서버에서 변경 한 후 새 디렉토리를 작성하고 파일을 해당 디렉토리로 이동했습니다.

마지막으로 Laravel에서 File 파사드를 사용하면 다음과 같이 할 수 있습니다. File::makeDirectory($save_path, 0755, true);


-1

더 나은 해결책을 찾았습니다. PHP가 기본적으로 다른 사용자로 실행 중이기 때문입니다.

그래서 이것을 고치기 위해

sudo nano /etc/php/7.0/fpm/pool.d/www.conf

그런 다음 user = "put user that owns the directories" group = "put user that owns the directories"

그때:

sudo systemctl reload php7.0-fpm


경우 웹 페이지에 방문자가 웹 서버의 탈옥 관리, 그들은 이제 "디렉토리를 소유 한 사용자"의 액세스 권한을 가질 수있을 것입니다. 해당 사용자가 www-data 인 경우, 피해가 제한적이므로 아파치는 제한된 사용자로 실행됩니다. 해당 사용자가 제한되지 않으면 더 많은 피해를 입을 수 있습니다. 해당 사용자에게 sudo 권한이 있으면 훨씬 더 많은 피해를 줄 수 있습니다.
markdwhite

아파치와 같은 거래입니다. BTW 나는 지금 큰 소년처럼 nignx를 실행
cecil merrel 일명 bringrainfire
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.