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


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.