Nginx : stat () 실패 (13 : 권한 거부 됨)


103

내 우분투 12.04 컴퓨터에 nginx가 설치된 특정 디렉토리를 추가하는 동안 기본 구성을 사용하고 있습니다.

server {
        #listen   80; ## listen for ipv4; this line is default and implied
        #listen   [::]:80 default ipv6only=on; ## listen for ipv6

        index index.html index.htm;

        # Make site accessible from http://localhost/
        server_name localhost;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to index.html
                root /username/test/static;
                try_files $uri $uri/ /index.html;
                # Uncomment to enable naxsi on this location
                # include /etc/nginx/naxsi.rules
        }
...

...
}

해당 디렉토리에서 파일을 제공하는 간단한 정적 nginx 서버를 원합니다. 그러나 error.log내가 보는 것을 확인

2014/09/10 16:55:16 [crit] 10808#0: *2 stat() "/username/test/static/index.html" failed (13: Permission denied), client:, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "domain"
2014/09/10 16:55:16 [error] 10808#0: *2 rewrite or internal redirection cycle while internally redirecting to "/index.html

난 이미 했어 chown -R www-data:www-data/username/test/static, 나는 그들을 설정했습니다 chmod 755. 다른 설정이 필요한지 모르겠습니다.


3
www-data사용자 cd가 다음 /username/test/static디렉토리로 이동할 수 있는지 확인하십시오 .sudo -u www-data cd /username/test/static
Maciej Sz

나는 권한이 거부지고 있어요,하지만 난 그렇게되면 LS는 표시 -l 그 www가 데이터 사용자의 설정
user299709

2
/ username이 encryptfs에있을 수 있습니까? 내 사이트가있는 / home / username 폴더와 똑같은 문제가 있습니다. encryptfs 밖으로 이동하면 모두 제대로 작동합니다. 여전히 나를위한 해결책이 없습니다 ...
Georgi

답변:


194

Nginx는 디렉토리 내에서 작동하므로 cdnginx 사용자가 해당 디렉토리로 이동할 수 없으면 실패합니다 ( stat로그 의 명령 과 마찬가지로 ). 있는지 확인 www-user할 수있는 cd받는 모든 방법을 /username/test/static. 다음 stat을 실행하여 실패 또는 성공 여부를 확인할 수 있습니다.

sudo -u www-data stat /username/test/static

귀하의 경우 아마도 /username디렉토리가 여기에서 문제가 될 것입니다. 일반적 으로 다른 사용자 홈 디렉토리에 www-data대한 권한이 없습니다 cd.

이 경우 가장 좋은 해결책은 그룹 에 추가 www-data하는 것입니다 username.

gpasswd -a www-data username

username그룹이 경로를 따라 모든 디렉토리를 입력 할 수 있는지 확인하십시오 .

chmod g+x /username && chmod g+x /username/test && chmod g+x /username/test/static

변경 사항이 작동하려면 nginx를 다시 시작하십시오.

nginx -s reload

루트 아래에 추가 된 모든 새 디렉토리에 대해 chmod가 새 디렉토리에 수행되어야 함을 의미합니까?
Qian Chen

2
@ElgsQianChen은 이것이 OS 수준 권한 시스템이므로 POSIX 시스템에서는 umask. chmod모든 새 디렉토리를 필요로하지 않는보다 일반적인 솔루션이 필요한 경우 솔루션이 있습니다. 이는 역 그룹 (연관 필요 usernamewww-data기)과의 사용 setgid. 보다 자세한 설명을 위해 새 질문을 게시 해 주시면 기꺼이 답변 해 드리겠습니다.
Maciej Sz

내 경로가 / root / 디렉토리에 있으면 어떻게됩니까? / root에서 chmod g + x를 수행하는 것이 안전합니까? 그리고 www-data를 루트 그룹에 추가 하시겠습니까?
Oleg Abrazhaev

Fedora 24에서 제 문제는 ... ACL 권한 ... 다른 레이어 ... YEY!
Ray Foss 2016 년

1
nginx사용자는 내 웹 사이트 디렉토리에 액세스 할 수 있지만 여전히 오류 로그에서 권한이 거부되었다고 말합니다.
Rahil Wazir 2011

89

CentOS 7 상자에서 동일한 문제가 발생했습니다.

내가 selinux를 칠 것 같습니다. selinux를 허용 모드 ( setenforce permissive) 로 설정 하면 현재 문제가 해결되었습니다. 나는 적절한 수정을 시도하고 돌아올 것이다.


4
이것은 내가 지난 3 일 동안 이해하려고했던 정확한 "문서화되지 않은"행동입니다 ...
Achilles

2
다음은이 동작에 대한 게시물입니다. axilleas.me/en/blog/2013/…
Achilles

2
그래서 저는 여기로 돌아 왔습니다. 이번에는 문제의 파일을 홈 디렉토리에서 html 디렉토리로 복사하고 소유권을 업데이트했습니다. 2015 년과 동일한 문제 ... 더 나은 수정 : ls -Z myFile.jsSELinux 컨텍스트를 표시합니다 . SELinux 콘텐츠를 변경하는 데 -rw-r--r--. nginx nginx unconfined_u:object_r:user_home_t:s0 myFile.js 사용 chcon -v --type=httpd_sys_content_t myFile합니다.
Andrew Richard Miller

2
예; 나는 같은 문제가 있었다. sudo setenforce 0나를 위해 고쳤습니다.
Overload119

1
참고로, selinux를 완전히 비활성화하려면 SELINUX값을 disabledin 으로 변경 한 /etc/selinux/config다음 재부팅해야합니다. 로 설정되면 permissive여전히 백그라운드에서 검사를 실행할 수 있지만 (귀중한 CPU 사용) 아무런 조치도 취하지 않습니다.
Oliver Tappin

76

Nginx는 사이트의 루트 디렉토리로 이어지는 모든 디렉토리에 대해 + x 액세스 권한이 있어야합니다.

사이트의 루트로 이어지는 경로의 모든 디렉토리에 + x가 있는지 확인하십시오. 예를 들어 사이트 루트가 / home / username / siteroot 인 경우 :

chmod +x /home/
chmod +x /home/username
chmod +x /home/username/siteroot

13
6 시간의 필사적 인 수색 끝에 ... 발견 된 시체가 당신을 언급했지만! 감사합니다!
Walid Ammar 2018

3
정말 고맙습니다! 이 작업을 수행하기 위해 몇 시간을 보냈고 모든 종류의 답변을 찾았습니다. 그렇게 간단하다는 것을 믿을 수 없습니다!
에릭 신랑

2
나를 위해이 작품의 벌금에 CentOS 7, PHP는 FPM 7.2 (SELinux는 이미 꺼져)
anhduc.bkhn

1
감사합니다! 이것이 내가 전체 시간 동안해야 할 전부라는 것을 믿을 수 없습니다!
exciteabletom

1
감사합니다, 완벽합니다!.
Softsofter

32

CentOS 7.0 Access Deined에서 SELinux로 인해이 문제가 발생했으며 다음 단계로 문제가 해결되었습니다.

yum install -y policycoreutils-devel
grep nginx /var/log/audit/audit.log | audit2allow -M nginx
semodule -i nginx.pp

업데이트 : digitalocean의 가상 Linux 서버를 사용하면서 배운 것 또는 Droplets 라고 부르는 것에서 얻은 참고 자료입니다 . SELinux를 사용하려면 상당한 양의 RAM이 필요합니다. 아마도 2GB 미만의 RAM이있는 물방울에서 SELinux 를 실행하고 관리 할 수 없을 것입니다.


2
이것에 대해 대단히 감사합니다. 처음에는 내 문제 (CentOS 7에서도)를 해결했지만 다른 곳에서 두 번째 거부로 차단되었으므로 setenforce 0. 그러나이 솔루션이 실제로 수행하는 작업을 되돌아 보면 nginx 사용자의 권한을 업데이트하기 위해 명령을 다시 실행해야한다는 것을 깨달았습니다. 그것은 작동하는 것처럼 보였고 SELinux를 다시 강제로 설정할 수 있습니다.
danj1974 08.21. 152015-08-21

글쎄, 이것은 너무 늦을 수 있습니다. 그래도 SELinux를 계속 적용 할 때 언급 할 가치가 있습니다. Nginx와 같은 소프트웨어는 기본 포트, 기본 경로, 경로에 대한 읽기 / 쓰기 액세스 등과 같은 자체 규칙 세트를 SELinux에 삽입한다는 점을 기억해야합니다. 문제가 발생하지 않으려면 HTML / PHP 파일을 / var / www에 넣는 것과 같은 규칙을 따르거나 SELinux 컨텍스트에서 발생하는 문제를 극복 할 준비를해야합니다. 도움이 될 수 있습니다. [CentOS <8] : getpagespeed.com/server-setup/nginx/nginx-selinux-configuration
Achilles

27

Security-Enhanced Linux가 실행 중일 수 있으므로 규칙을 추가하십시오. 권한이 설정되어 있고 사용자가 존재했지만 권한 13 오류가 발생했습니다 ..

chcon -Rt httpd_sys_content_t /username/test/static


감사! CentOS 릴리스 6.10 (최종)에서 작업했습니다.
marw

1
CentOS 7.5.1804 (Core)에서 작업했습니다.
Niek

4

징후:

WordPress 미디어 라이브러리에 이미지를 업로드 할 수 없습니다.

원인:

(CentOS) yum update

오류:

2014/10/22 18:08:50 [crit] 23286#0: *5332 open() "/var/lib/nginx/tmp/client_body/0000000003" failed (13: Permission denied), client: 1.2.3.4, server: _, request: "POST /wp-admin/media-new.php HTTP/1.1", host: "example.com", referrer: "http://example/wp-admin/media-new.php"

해결책:

chown -R www-data:www-data /var/lib/nginx


2

기본적으로 nginx를 설치할 때 정적 데이터는 / var / www / html에 있습니다. 따라서 정적 폴더를 / var / html /에 복사하고

root /var/www/<your static folder>

ngix.conf (또는 / etc / nginx / sites-available / default)에서

이것은 우분투에서 나를 위해 일했지만 다른 배포판과 크게 다르지 않아야한다고 생각합니다.

도움이되기를 바랍니다.


2

nginx.conf user속성을 www-staticfiles owener로 변경하십시오 .

#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user your_user_name;

# same other config

1

이 문제에 직면하여 nginx 사용자 및 그룹에 다음과 같은 권한을 부여하기 위해 해결했습니다.

chown -R nginx:nginx /username/test/static

1

제 경우에는 파일을 제공하는 폴더가 다른 폴더에 대한 심볼릭 링크였습니다.

ln -sf /origin /var/www/destination

대상 폴더 (심볼릭 링크)에서 올바른 권한 (사용자 및 그룹)이 있더라도 Nginx는 원본 폴더 전체의 계층에 대한 권한도 필요하기 때문에 여전히 오류가 발생했습니다.


1

마침내 길을 찾았습니다. 간단히 말해, 사용자 이름이 joe이고 개인 파일 시스템 아래에 웹 사이트 가 있다고 가정 해 보겠습니다 /home/joe/path/to/website.

당신은 문자 그대로 nginx당신의 친구 라는 시스템을 말해야합니다 .
장소 nginxjoe그룹 :

sudo gpasswd -a nginx joe

그 후에도 여전히 작동하지 않으면 /home/joe디렉토리의 올바른 액세스를 확인하십시오 . 그것이 아마도 nginx가 파일에 접근 할 수없는 이유 일 것입니다. 그가 당신의 친구 라 할지라도 당신은 그에게 당신의 집 문을 열어야하기 때문입니다.

sudo chmod g+x /home/joe

그게 다야. 이것이 말 그대로 로컬 파일에 대한 nginx 액세스 권한을 부여하기 위해해야하는 모든 것입니다. :)

이 방법 nginx은 권한이 높고 관리자 만 그룹을 변경할 수 있기 때문에 보안 문제가 없다고 생각 합니다. nginx이제 joe디렉토리에 있는 내용을 읽을 수 있습니다 . nginx계정 소유자가 디렉토리 액세스를 여는 사용자와 다른 경우에만 보안 위반 이지만, 제 경우에는 로컬 컨텍스트에서 양 당사자의 소유자입니다.


0

나는 같은 문제가 있었고 Centos7과 함께 Plesk Onyx 17을 사용하고 있습니다. 영향을받는 도메인의 로그 아래 proxy_error_log에서이 오류를 볼 수 있습니다. / var / www / vhosts /의 모든 디렉토리 / 파일은 각 사용자 (도메인 소유자)가 소유하며 모두 psacln 그룹에 있음을 알 수 있습니다. 그래서 해결책은 nginx도이 그룹에 추가하여 그가 필요한 것을 볼 수 있도록하는 것이 었습니다.

usermod -aG psacln nginx

그리고 실제로 nginx를 다시 시작하고 Ctrl + F5로 페이지를 다시로드하십시오.


0

해결 방법을 찾았습니다. 폴더를 nginx 구성 폴더로 이동했습니다 (제 경우에는 "/ etc / nginx / my-web-app"). 그런 다음 루트 사용자 "sudo chown -R root : root"my-web-app "로 권한을 변경했습니다.


0

nginx를 실행할 사용자를 추가 할 수도 있습니다. nginx.conf 파일에서 다음과 같이 변경하십시오.

user root;

nginx conf의 첫 번째 줄로 위의 줄을 추가 할 수 있습니다. 해당 디렉토리에 쓰기 권한이있는 모든 사용자의 이름을 쓸 수 있습니다.


0

이것은 일반적으로 권한 문제입니다 ... 저에게는 / root / **를 nginx 루트로 사용하기 때문에 더 높은 권한이 필요합니다. 쉬운 방법은 프로젝트를 직접 만든 디렉토리로 이동하는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.