모든 파일에 대해 Nginx 403 금지


192

CentOS 5 상자에 PHP-FPM과 함께 nginx를 설치했지만 PHP 여부에 관계없이 파일을 제공하기 위해 고심하고 있습니다.

Nginx가 www-data : www-data로 실행 중이며 기본 "EPEL의 nginx에 오신 것을 환영합니다"사이트 (644 권한이있는 root : root 소유)가 정상적으로로드됩니다.

nginx 구성 파일에는 /etc/nginx/sites-enabled/*.conf에 대한 include 지시문 이 있으며 구성 파일 example.com.conf 가 있습니다.

server {
 listen 80;

 Virtual Host Name
 server_name www.example.com example.com;


 location / {
   root /home/demo/sites/example.com/public_html;
   index index.php index.htm index.html;
 }

 location ~ \.php$ {
  fastcgi_pass   127.0.0.1:9000;
  fastcgi_index  index.php;
  fastcgi_param  PATH_INFO $fastcgi_script_name;
  fastcgi_param  SCRIPT_FILENAME  /home/demo/sites/example.com/public_html$fastcgi_script_name;
  include        fastcgi_params;
 }
}

2777 개의 파일 권한이있는 www-data : www-data가 public_html을 소유하고 있지만이 사이트는 어떤 콘텐츠도 제공하지 않습니다.

 [error] 4167#0: *4 open() "/home/demo/sites/example.com/public_html/index.html" failed (13: Permission denied), client: XX.XXX.XXX.XX, server: www.example.com, request: "GET /index.html HTTP/1.1", host: "www.example.com"

사용자가 nginx에서 403을 얻는 다른 게시물을 많이 발견했지만 루비 / Passenger (이전에는 실제로 성공했습니다)를 사용하여 더 복잡한 설정이 포함되거나 업스트림 PHP가 발생했을 때만 오류가 발생하는 것을 보았습니다 -FPM이 관여하므로 도움이 거의없는 것 같습니다.

내가 여기서 어리석은 짓을 했습니까?


이 답변을 확인하십시오 stackoverflow.com/questions/16808813/…
sandes

답변:


334

종종 간과되는 권한 요구 사항 중 하나는 사용자가 파일의 모든 상위 디렉토리에 해당 파일에 액세스하기위한 x 권한이 필요하다는 것입니다. www-data x 액세스에 대한 /, / home, / home / demo 등에 대한 권한을 확인하십시오. 내 생각에 / home은 아마도 770이고 www-data는 그것을 통해 어떤 하위 디렉토리에 도달 할 수 없습니다. 그렇다면 chmod o + x / home (또는 요청을 거부하는 디렉토리)을 시도하십시오.

편집 : 경로에 대한 모든 권한을 쉽게 표시하려면 namei -om /path/to/check


6
여기도 마찬가지입니다. CentOS 6을 설치할 때 / home / user dirs는 기본적으로 700으로 설정됩니다.
jjt

2
(이 사람이 너무 그것에 대해 이야기 chmod -4 +x /mypath나를 위해 일한) nginxlibrary.com/403-forbidden-error
피터 에를리히

1
누군가이 동작이 아파치와 다른 이유를 설명 할 수 있습니까? 모든 상위 디렉토리에 "x"권한이 필요하지 않습니까?!
JoshuaDavid

3
다르지 않습니다. 아파치가 부모 디렉토리에서 x 권한을 요구하지 않는 유일한 이유는 그것이 루트로 실행중인 경우입니다.
kolbyjack

결국 www-data 사용자를 개인 사용자 그룹에 추가하고 chmod 710을 루트 사용자 폴더에 추가했습니다. 매력처럼 일했다. (데비안 기반 배포판에서)
basicdays

299

permission denied상위 폴더의 권한을 확인한 후에도 여전히 표시되면 SELinux가 액세스를 제한 하는 것일 수 있습니다 .

SELinux가 실행 중인지 확인하려면 다음을 수행하십시오.

# getenforce

다음에 재부팅 할 때까지 SELinux를 비활성화하려면 :

# setenforce Permissive

Nginx를 다시 시작하고 문제가 지속되는지 확인하십시오. nginx가 www 디렉토리를 제공 할 수있게하려면 (이를 테스트하기 전에 SELinux를 다시 켜십시오 (예 :) setenforce Enforcing)

# chcon -Rt httpd_sys_content_t /path/to/www

자세한 내용은 여기답변 을 참조하십시오


1
nginx를 시작할 때마다 open() "/usr/share/nginx/logs/xxxxxx.com-error_log" failed (13: Permission denied)권한을 확인하고 루트로 시작했는지 확인한 후 왜 그런지 알 수 없었 습니다. 나는 이것을 발견하고 SELinux가 가능하다는 것을 알았습니다. 나는 그것을 비활성화하고 이제는 아무런 문제가 없습니다. 감사!
ub3rst4r

1
감사! 나는를 변경하여 하나를 해결할 수 있었다, 그래서 나는 아직도 자신의 FPM 소켓을 소유하는 사용자에 대한 거부 권한이있는 문제가 있었다 user에서 의 nginx루트 에서 /var/nginx/nginx.conf- 아마도이이 문제를 통해 오는 다른 뜻에 도움이 누군가. 두 번째 부분의 DataPsyche에 대한 S / O
Winter

11
이것은 CentOS 7에서도 기본 동작입니다.
timss

4
의견을 말한 다른 모든 사람들과 함께 메신저. 컴퓨터를 창문 밖으로 내버려 둘 준비가되었습니다. Nginx가 올바르게 설정되어 권한이 올바르게 설정되어 있으면 모든 것을 777로 만들려고했지만 권한 거부 오류가 발생했습니다.
DOfficial

2
Centos 7 (SELinux 사용)에서 가장 간단한 해결책은 다음과 같습니다 setsebool httpd_read_user_content on(홈 디렉토리에서 호스팅되는 정적 파일의 경우 chmod는 세계에서 읽을 수 있음)-위의 @KapiteinWitbaard의 방법이 더 안전하다고 생각합니다.
TimStaley 2016 년

63

사용자 설정을 추가하여이 문제를 해결했습니다.

nginx.conf에서

worker_processes 4;
user username;

리눅스 사용자 이름으로 '사용자 이름'을 변경하십시오.


4
이 답변이 허용되는 답변보다 보안 성이 더 좋습니다. 홈 폴더에 대한 권한 (민감한 정보를 포함 할 수 있음)을 뒤엎을 필요가 없으며 nginx로 개발하는 경우 이상한 파일 권한을 SCM에 업로드하지 않아도됩니다.
CamelBlues

홈 디렉토리에 추가 된 권한은 읽히지 않고 실행되므로 민감한 정보는 이론적으로 공개되지 않습니다 (이 경우 상위 디렉토리로 돌아가서 다른 디렉토리 내에서 민감한 파일의 위치를 ​​알고있는 악성 PHP 스크립트 제외). www-data에 액세스 가능). 또한 원래 질문에서 내 nginx가 "www-data"로 실행되고 있음을 알 수 있습니다. 여기의 구성 값은 이미 원하는대로 설정되었습니다.
앵거스 아일랜드

2
사용자 그룹도 추가해야했습니다 : user usegroup.
Gabriel A. Zorrilla

dir을 nginx : nginx로 chmodding하는 것처럼 나에게도 효과가있었습니다. 이 솔루션을 선호하므로 nginx 이외의 다른 사용자가 내 문서 루트를 소유 할 수 있습니다. 이것을 지적 해 주셔서 감사합니다.
kvdv

내 하루를 구했다. 그런데 컴퓨터에 여러 사용자가 있고 각 사용자가 자신의 웹 사이트를 가지고 있다면 어떻게 처리합니까?
psychok7

38

이 오류가 발생하여 마침내 아래 명령으로 해결했습니다.

restorecon -r /var/www/html

한 장소에서 다른 장소로 무언가를 측정 할 때 문제가 발생합니다. 이동시 원본의 selinux 컨텍스트를 유지하므로 / home 또는 / tmp에서 무언가를 untar하면 해당 위치와 일치하는 selinux 컨텍스트가 제공됩니다. 이제 / var / www / html로 mv를 지정하고 / tmp 또는 / home에 속하는 컨텍스트를 취하고 정책에 의해 httpd가 해당 파일에 액세스 할 수 없습니다.

mv 대신 파일을 cp로 만들면 selinux 컨텍스트는 원래 위치가 아니라 복사하는 위치에 따라 지정됩니다. restorecon을 실행하면 컨텍스트가 기본값으로 돌아가고 수정됩니다.


1
감사 @jsina이 나에게 많은 도움이
카지 Garg를

1
젠장, +1 , 나도.
jww

24

나는 다른 경우를 시도했으며 소유자가 nginx ( chown -R nginx:nginx "/var/www/myfolder") 로 설정되었을 때만 예상대로 작동하기 시작했습니다.


1
나를 위해 일했습니다. nginx가 루트로 시작 되었음에도 불구하고 nginx.conf 파일에 지정된 사용자 ( "user nginx;")에서 프로세스를 생성합니다. 기본적으로. 문서 루트를 소유 한 사용자로 사용자를 변경하면 Anderson이 제안한대로 작동해야합니다.
kvdv

앤더슨 씨? 아니! Andron;)
Andron

사과 Mr. Andron;) 나는 더 이상 이전 주석을 편집 할 수없는 것 같습니다 ...
kvdv

물론 문제는 없습니다. 지금은 앤더슨이었고 :) 동화를 쓸 필요가 있습니다.
Andron

1
이것은 보안 문제가 아닙니까?
gontard

6

SELinux를 사용하는 경우 다음을 입력하십시오.

sudo chcon -v -R --type=httpd_sys_content_t /path/to/www/

권한 문제가 해결됩니다.


1

오래된 질문이지만 같은 문제가있었습니다. 나는 위의 모든 대답을 시도했지만 아무것도 효과가 없었습니다. 도메인을 제거하고 다시 추가했지만 문제가 해결되었습니다. Plesk를 사용하고 있으며 도메인이 이미 존재 한 후에 Nginx를 설치했습니다.

그래도 먼저 / var / www / backups에 로컬 백업을 수행했습니다. 파일을 쉽게 다시 복사 할 수있었습니다.

이상한 문제 ....


1

우리는 Plesk Onyx 17을 사용하여 같은 문제를 겪었습니다. 권리 등을 엉망으로 만드는 대신 해결책은 nginx 사용자를 psacln 그룹에 추가하는 것이 었습니다. 다른 모든 도메인 소유자 (사용자)는 다음과 같습니다.

usermod -aG psacln nginx

이제 nginx는 .htaccess 또는 컨텐츠를 올바르게 표시하는 데 필요한 다른 파일에 액세스 할 수있는 권한이 있습니다.

한편, 정적 컨텐츠를 제공하기 위해 Apache가 psaserv 그룹에 있는지 확인하십시오.

usermod -aG psaserv apache

그리고 Plesk에서 Apache와 Nginx를 모두 다시 시작하는 것을 잊지 마십시오! (Ctrl-F5로 페이지를 다시로드하십시오)


이것이 정답이며 usermod -aG username www-data대부분의 설정 에서 가장 가능성이 높습니다 .
다리오 자드로

0

실수로 setfacl명령을 실행 하여이 문제에 대한 약간의 변형을 발견했습니다 . 나는 달렸다 :

sudo setfacl -m user:nginx:r /home/foo/bar

그룹 에 추가 nginx하기 위해이 경로를 포기 foo했지만 해당 사용자 정의 ACL은 파일에 액세스하려는 nginx의 시도를 망쳤습니다. 나는 그것을 실행하여 그것을 정리했다 :

sudo setfacl -b /home/foo/bar

그리고 nginx는 파일에 접근 할 수있었습니다.


0

PHP를 사용하는 경우 index서버 블록 의 NGINX 지시문에 index.php가 포함되어 있는지 확인하십시오 .

index index.php index.html;

자세한 정보 는 공식 문서 의 색인 지시문 을 확인하십시오.


0

나는 같은 문제에 직면했지만 위의 해결책은 도움이되지 않았습니다.

따라서 많은 어려움을 겪은 후 sestatus 가 모든 포트를 차단하고 모든 문제를 허용하도록 설정하여 sestatus 가 해결되었다는 것을 알았습니다 .

sudo setenforce 0

이것이 나와 같은 누군가를 돕기를 바랍니다.


그래도 문제가 해결되었을 수 있습니다. 축하합니다. -조금 슬프다 :-( stopdisablingselinux.com 참조 -다른 해결 방법을 찾을 수 있습니까?
Angus Ireland
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.