move_uploaded_file은 "스트림 열기 실패 : 권한 거부"오류를 발생시킵니다.


143

CentOS에서 Apache 2.2 및 PHP 5.3으로 업로드 디렉토리를 구성하려고 할 때이 오류가 계속 발생합니다.

php.ini에서 :

upload_tmp_dir = /var/www/html/mysite/tmp_file_upload/

httpd.conf에서 :

Directory /var/www/html/mysite/tmp_file_upload/>
    Options  -Indexes
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>
<Directory /var/www/html/mysite/images/>
                Options -Indexes
</Directory>

CentOS 디렉토리 권한 :

drwxrwxr-x 2 root root 4096 Nov 11 10:01 images
drwxr-xr-x 2 root root 4096 Nov 12 04:54 tmp_file_upload

내가하는 일에 관계없이 파일을 업로드 할 때 PHP 에서이 오류가 계속 발생합니다.

경고 : move_uploaded_file (images / robot.jpg) : 스트림을 열지 못했습니다 : 78 행의 /var/www/html/mysite/process.php에서 권한이 거부되었습니다.

경고 : move_uploaded_file () : 78 행의 /var/www/html/mysite/process.php에서 '/ tmp / phpsKD2Qm'을 'images / robot.jpg'로 이동할 수 없습니다

보시다시피 업로드 파일과 관련하여 php.ini 파일에서 구성을 취하지 않았습니다.

내가 여기서 뭘 잘못하고 있니?


775? 서버가 아무도 실행되지 않을 수 있습니다. 오직 루트 (당신의 "이미지"권한)이 경우에 쓸 수 있습니다
콘라드 보로프스키

무엇 않습니다 그 의미 ? 어떻게 바꿀 수 있습니까?
user63898

모든 상위 디렉토리에도 올바른 권한이 있어야합니다.
Sridhar Sarnobat

답변:


188

때문입니다 imagestmp_file_upload들만 쓸 수있는 root사용자. 업로드가 작동하려면 해당 폴더의 소유자를 httpd 프로세스 소유자와 동일하게 만들거나 전역으로 쓸 수있게 만들어야합니다 (나쁜 방법).

  1. 아파치 프로세스 소유자를 확인하십시오 $ps aux | grep httpd. 첫 번째 열은 일반적으로 소유자입니다.nobody
  2. 의 소유자를 변경 images하고 tmp_file_upload될 수 nobody또는 당신이 무엇을 1 단계에서 발견 소유자.

    $sudo chown nobody /var/www/html/mysite/images/
    
    $sudo chown nobody /var/www/html/mysite/tmp_file_upload/
  3. Chmod imagestmp_file_upload이제 필요한 경우 소유자가 쓸 수 있습니다 (이미 이미 준비한 것 같습니다). @Dmitry Teplyakov 답변에 언급되어 있습니다.

    $ sudo chmod -R 0755 /var/www/html/mysite/images/
    
    $ sudo chmod -R 0755 /var/www/html/mysite/tmp_file_upload/
  4. 이 동작이 발생한 이유에 대한 자세한 내용은 매뉴얼 http://php.net/manual/en/ini.core.php#ini.upload-tmp-dir을 확인하십시오 open_basedir. 지시어에 대해서도 설명 합니다.


4
고마워 : 우리의 옛 주인은 데몬이었다
zzapper

이 수정 사항은 서버 php 유형을 fast_CGI, CGI에서 Apache_mod로 변경하여 plesk 등으로 변경 될 수있는 상황에 적용됩니다. 아파치가 아닌 원래 사용자의 권한으로 계속할 수 있습니다. 이것은 내 문제를 해결했습니다.
elliotrock

1
나는이 같은 오류가 오전하지만 프로세스 및 폴더를 모두 소유하고 있습니다 jacob(내 로컬 머신 나를)와 폴더 모두가 755775.
limeandcoconut

sudo service httpd restart권한을 변경 한 후 아파치 프로세스를 다시 시작해야했습니다 . 그런 다음 작동했습니다 :) 소유자를 변경하는 대신 chown내 아파치 프로세스를 'www'그룹에 추가 하고이 디렉토리를 동일한 'www'그룹에 추가했습니다.chgrp
Ali Saeed

76

이 스크립트를 실행하여 Apache 프로세스 소유자를 찾을 수도 있습니다.

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

그런 다음 대상 디렉토리의 소유자를 가지고있는 것으로 변경하십시오. 다음 명령을 사용하십시오.

chown user destination_dir

그런 다음 명령을 사용하십시오.

chmod 755 destination_dir

대상 디렉토리 권한을 변경합니다.


3
고맙습니다. Laith Shadeed의 방법을 처음 사용했지만 ps aux |를 입력해도 같은 결과를 얻지 못했습니다 | grep httpd<?php echo exec('whoami'); ?>. 아무도 이유를 알고 있습니까?
kukinsula

1
PS AUX | grep https 는 웹 서버 소유자 이름을 반환하지 않습니다. 이것은 : ps aux | grep -E '[a] pache | [h] ttpd | [_] www | [w] ww-data | [n] ginx'| grep -v 루트 | 헤드 -1 | 컷 -d \ -f1 프론 심포니 문서.
David Jacquel

1
위 명령에서 "-d \"와 "-f1"사이에 공백이 두 개 있어야합니다. 그대로 복사하여 붙여 넣기하면 "잘라 내기 : 잘못된 구분 기호"와 같은 오류가 발생할 수 있습니다.
Beejor

1
에 1을 더한 값입니다 exec('whoami'). 30 분 더 절약했습니다. 우분투 사용자 chowning 한
DEVAL 김시연

11
이럴까요 www-data? 보통
maxisme

18

Mac OS X을 사용하는 경우 파일 루트 또는 웹 사이트 폴더로 이동하십시오.

그런 다음 마우스 오른쪽 버튼으로 클릭하고 정보를 얻고 맨 아래로 이동 ( 공유 및 권한 )하고 열어서 모든 읽기 전용을 읽고 쓰도록 변경하십시오. 자물쇠를 열고 설정 아이콘으로 이동 한 다음 동봉 된 항목에 적용 을 선택 하십시오 .


Linux 시스템에 대한 질문에 Mac OS에 대해 언급 한 이유는 무엇입니까?
Kmeixner

7
안녕하세요 Hawkar, 답변 주셔서 감사합니다. 나는 Mac에 있고 당신의 대답은 내 문제를 해결했습니다. 고마워
Sanjay Sharma

2
이 답변을 좋아하십시오
Alexey Sh.

2
@ Kmeixner Linux에 대한이 질문이지만 OSX에서 정확히 같은 문제가있었습니다. 이 의견에 감사드립니다 /private/var/tmp. 내 Mac 폴더의 쓰기 옵션을 변경 한 후에 저에게 효과적이었습니다.
Salam

이것은 오래된 게시물이지만 정확히 내가해야 할 일입니다. 감사
TheRobQ

14

이것은 나를 위해 일했습니다.

sudo adduser <username> www-data
sudo chown -R www-data:www-data /var/www
sudo chmod -R g+rwX /var/www

그런 다음 로그 아웃하거나 재부팅하십시오.

SELinux불만이 있으면 다음을 시도하십시오

sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www(/.*)?'
sudo restorecon -Rv '/var/www(/.*)?'

내 생명을 구했다 :) .. 나는 웹을 배포하기 위해 GIT post-recive hook을 사용하고, 배포 할 때마다 www-data에 git user를 추가하여 그의 권한 거부 오류가 발생합니다 :) 감사합니다
Zalaboza

이것이 가장 좋은 대답입니다.
saviour123

13

나는 이것을 이전 제안에 추가하고 싶었다. SELinux가 활성화 된 Linux 버전을 사용하는 경우 쉘에서도이를 실행해야합니다.

chcon -R --type httpd_sys_rw_content_t /path/to/your/directory

웹 서버 사용자에게 그룹 소유자 또는 디렉토리 소유자 변경을 통해 권한을 부여하는 것과 함께.


restorecon -R -v /path/to/your/directory아마도 나중에 이것에 포함될 필요가 있습니다. access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/…
절대

아주 잘 맞을지 모르지만, 나는 chcon이 "컨텍스트를 바꿨다"는 가정하에 있었다. 즉, 그것은 단지 바뀌었다. 당신이보고있는 것은 "semanage fcontext"를 먼저 사용하여 일부 설정 파일 "file_contexts.local"에 넣지 만 컨텍스트는 절대 변경하지 않습니다.
Chris

@Chris, 고마워요 이것은 내 문제를 해결했습니다. 그 문제에 대해 좀 밝히시겠습니까? 이 명령은 실제로 무엇을합니까? 맨 페이지와 chcon에 대한 정보를 살펴본 결과 입력 한 유형의 값을 찾지 못했습니다. 나는 약간 혼란 스러워요.
joker

그것은 웹 서버 (httpd)가 디렉토리 나 파일을 읽을 수있게합니다 ... 솔직히 이해하지 못하고 selinux를 설명하고 싶지 않을 것입니다 ... nsa.gov/what-we-do 를 참조하십시오 . / research / selinux / documentation and access.redhat.com/documentation/en-us/red_hat_enterprise_linux/…
Chris

11

이 폴더에 대한 권한 변경

# chmod -R 0755 /var/www/html/mysite/images/


1
drwxrwxr-x 2 루트 루트 4096 11 월 11 일 10:01 이미지 : on : drwxrwxr-x 2 루트 루트 4096 11 월 12 일 04:54 tmp_file_upload 그러나 여전히 동일한 오류
user63898

7

이 시도:

  1. / etc / apache2 / envvars를여십시오.

    sudo gedit /etc/apache2/envvars
  2. www-data당신의 것으로 교체your_username

    "export APACHE_RUN_USER=www-data" 

    ~로 바꾸다

    export APACHE_RUN_USER='your_username' 

7

이미 작곡가를 성공적으로 실행 한 후에도이 관련 문제가 발생했습니다. 작곡가를 업데이트했으며 실행 composer install하거나 php composer.phar install얻었을 때 :

... 스트림을 열지 못했습니다 : 권한이 거부되었습니다 ...

폴더에 대한 권한 변경에 대한 이전 답변이 효과가 있다는 것이 많은 연구 후에 밝혀졌습니다. 그들은 지금 약간 다른 디렉토리입니다.

설치시 OS X에서 캐시 파일이에 /Users/[USER]/.composer/cache있으며 캐시 파일이 루트가 소유했기 때문에 문제가 발생했습니다. '.composer'의 소유권을 사용자에게 재귀 적으로 변경하면 문제가 해결되었습니다.

이것이 내가 한 일입니다.

sudo chown -R [USER] cache

그런 다음 작곡가 설치를 다시 실행했습니다.


5

이 문제는 Apache 사용자 (www-data)가 폴더에 쓸 수있는 권한이없는 경우에 발생합니다. 이 문제를 해결하려면 사용자를 www-data 그룹에 배치해야합니다.

방금 이것을 만들었습니다.

이 PHP 코드 <?php echo exec('whoami'); ?>를 실행 하여 아파치가 사용하는 사용자를 찾으십시오. 그런 다음 터미널에서 명령을 실행하십시오.

user@machine:/# cd /var/www/html

user@machine:/var/www/html# ls -l

다음과 같이 반환됩니다 :

total of files

drwxr-xr-x 7 user group size date folder

사용자를 유지했지만 그룹을 www-data로 변경했습니다.

chown -R user:www-data yourprojectfoldername

chmod 775 yourprojectfoldername

4

해결책은 너무 쉽습니다. 이미지 (대상) 폴더를 마우스 오른쪽 버튼으로 클릭하고 속성으로 이동 한 후 권한 탭을 클릭하고 다른 사람이 파일 작성 및 삭제 액세스를 변경 하십시오 .


그러나 가장 빠른 방법은 FTPing (FileZilla, WinSCP)에 GUI를 사용하는 것입니다
CLOUGH

3

tmp_file_upload의 권한을 755로 변경하십시오. 다음은 chmod -R 755 명령입니다. tmp_file_upload


2

이 시도

find /var/www/html/mysite/images/ -type f -print0 | xargs -0 chmod -v 664


점점 : chmod를`664 '후 피연산자 누락
user63898
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.