업스트림을 읽는 중에 권한이 거부되었습니다.


40

nginx 및 passenger에 rails 응용 프로그램을 배포했습니다. 간헐적으로 응용 프로그램 페이지가 부분적으로로드됩니다. 응용 프로그램 로그에 오류가 없지만 nginx 오류 로그는 다음을 보여줍니다.

2011/02/14 05:49:34 [crit] 25389#0: *645 open() "/opt/nginx/proxy_temp/2/02/0000000022" failed (13: Permission denied) while reading upstream, client: x.x.x.x, server: y.y.y.y, request: "GET /signup/procedures?count=0 HTTP/1.1", upstream: "passenger:unix:/passenger_helper_server:", host: "y.y.y.y", referrer: "http://y.y.y.y/signup/procedures"


로그 레벨을 디버그로 설정할 수 있습니다 : nginx.org/en/docs/debugging_log.html
Rimian

답변:


39

NGINX / PHP-FPM 설정 (php-fpm = php의 개선 된 fcgi)에서 동일한 문제가 발생했습니다.

nginx 프로세스가 어떤 사용자로 실행 중인지 확인할 수 있습니다

ps aux | grep "nginx: worker process"

프록시 파일의 권한이 올바른지 확인하십시오.

ls -l /opt/nginx/proxy_temp/

필자의 경우 nginx가 실행 중이며 www-data프록시 디렉토리의 두 디렉토리가 루트에 속했습니다.

나는 그것이 어떻게 일어 났는지는 모르지만 (루트로)

chown www-data.www-data /opt/nginx/proxy_temp

4
최고의 솔루션!
efkan

왜 아직 받아 들여지지 않습니까?
Kishor Pawar

1
#openresty를 사용하는 사람들을 위해- "chown www-data : www-data -R / usr / local / openresty / nginx / * _ temp"
BG Bruno

1
내 nginx 프로세스를 중지하고 폴더 이름을 다른 이름으로 바꾸고 nginx 프로세스를 다시 시작한 후 올바른 권한으로 폴더를 다시 만들었습니다. 매력처럼 일했다!
Chirayu Shishodiya

8

아마도 root 사용자로 시작한 후 변경했을 것입니다. 이제 문제는 캐시 폴더, 즉

/var/cache/nginx/client_temp
/var/cache/nginx/fastcgi_temp
/var/cache/nginx/proxy_temp
/var/cache/nginx/scgi_temp
/var/cache/nginx/uwsgi_temp

이미 루트에 의해 소유되어 있으므로 nginx (또는 전환하려는 대상) 사용자는 700의 권한이있는 사람들에게 액세스 할 수 없습니다.

따라서 솔루션은 쉽습니다. nginx를 중지하고 다음을 수행하십시오.

rm -rf /var/cache/nginx/*

또는 배포 및 릴리스 경로가 무엇이든. 그런 다음 적절한 권한으로 이러한 폴더를 다시 생성하는 nginx를 다시 시작하십시오.


8

또한 nginx.conf 파일을 확인하여 올바른 사용자 AND 그룹을 지정했는지 확인하십시오.

디렉토리의 권한이 username / nginx에 대해 설정되었지만 nginx.conf 사용자가 username 만 지정하는 문제가있었습니다. 기본적으로 사용자 지정 문에 그룹이 제공되지 않으면 user와 동일한 이름을 사용합니다. 따라서 username / username은 username / nginx 대신 디렉토리에 액세스하려고했습니다. 구성을 업데이트하면 문제가 해결되었습니다.

참조 : http://nginx.org/en/docs/ngx_core_module.html#user


2
여기에 언급 한 구성을 게시 할 수 있습니까?
paweloque

4

그래서 위의 모든 작업을 수행했지만 불행히도 나에게 동일한 오류가 발생했습니다. nginx가있는 centos 6.7 컴퓨터에서 토크 박스가있는 jar 파일로 패키지 된 레일 앱을 실행 중입니다. 나는 다른 해결책을 찾을 때까지 약 3 시간 동안 이것과 싸웠고 그것이 다른 누군가를 돕기를 바랍니다. 이 기사 에 따르면 nginx는 시행 모드에서 실행될 수 있습니다. 방금 nginx를 허용 모드로 변경했습니다.

setenforce 0

그로 인해 오류가 사라지고 스테이징 / 프로덕션 환경에서 응용 프로그램을 실행할 수있었습니다.

audit.log에서 오류를 찾을 때까지 실마리가 없었습니다.

type=AVC msg=audit(1444454198.438:466): avc:  denied  { name_connect } for  pid=3201 comm="nginx" dest=8080 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=system_u:object_r:http_cache_port_t:s0 tclass=tcp_socket

나는 이것이 내가 잃어버린 3 시간을 누군가를 구하기를 정말로 바란다.


1
당신은 틀리지 않습니다, 나는 누군가가 왜 -1 투표하는지 모르겠습니다 (그녀에게 수치심). 문제는 RedHat / CentOS 기반 호스트 및 selinux에 있습니다. 한 가지 방법은 setenforce 0 (무례)이고 다른 방법은 setsebool 및 네트워킹 옵션입니다.
periket2000

CentOS 7.2에 도움이되었습니다.
MKatleast3 3

setsebool -P httpd_can_network_connect 1 에서 stackoverflow.com/a/24830777/721331
McKelvin

3

권한이없는 계정에서 nginx를 시작할 때 use_temp_path=off.

proxy_cache_path ... use_temp_path=off;

이것은 nginx가 파일을 기본값으로 넣으 려하지 않도록해야했습니다 proxy_temp_path. nginx 문서에서 :

임시 파일의 디렉토리는 use_temp_path 매개 변수 (1.7.10)를 기반으로 설정됩니다. 이 매개 변수를 생략하거나 값을 설정하면 지정된 위치에 대해 proxy_temp_path 지시문으로 설정 한 디렉토리가 사용됩니다. 값을 off로 설정하면 임시 파일이 캐시 디렉토리에 직접 저장됩니다.


-3
chmod 777 /opt/nginx/proxy_temp/

나는 같은 문제가 있었고 chmod에 의해 해당 디렉토리로 해결되었습니다.


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