Nginx에서 403 Forbidden 오류 솔루션(Rails+AWS+Nginx+Unicorn 환경)
빠진 것
Rails로 만든 앱을 AWS에 배포하고 가끔 액세스하려고하면 403 Forbidden 오류가 발생했습니다. (아래 그림)
전제 조건
Ruby: 2.6.3
Rails: 6.0.2
Nginx: 1.12.2
서버 OS: Amazon Linux 2
해결책(먼저 결론만)
chmod 701 /home/ec2-user
에서 해결되었습니다 (ec2-user 디렉토리의 권한을 700 → 701로 변경했습니다)
※ /home/ec2-user/
바로 아래에 Rails 앱을 배치하고 있습니다
오류가 발생할 때까지의 경위
아래 페이지를 참고하면서 Rails 앱을 AWS에 배포하는 작업을 진행하고 있었습니다.
htps : // 코 m / 유키_ 나가오카 /
위의 페이지에서는 Rails 앱의 설치 장소를 /var/www/rails/
아래로 하고 있습니다만, 「앱의 설치 장소는 좋아하는 곳에서 좋을 것」이라고 생각하고, 자신의 경우는 ~/
( /home/ec2-user/
와 동의)에 배치했습니다.
결과적으로, 이 설치 장소의 차이가 이번 에러를 발생하게 되었습니다.
오류가 발생한 후 해결할 때까지의 경위
애초에 403 Forbidden이란?
페이지가 존재하지만 페이지를 볼 권한이 없어 액세스가 거부되었음을 나타내는 HTTP 상태 코드입니다.
(이번에는 Nginx가 Rails 앱이있는 디렉토리에 대한 액세스 권한이 없기 때문에 403 오류가 발생했습니다.)
참고 : htps : // 그럼.ぃきぺぢ아. 오 rg / 우키 / H tP_403
로그를 검토하고 오류의 원인을 확인합니다.
Nginx 로그 파일의 위치는 Nginx 구성 파일에 설명되어 있습니다.
Nginx 구성 파일은 OS마다 다르지만 Amazon Linux의 경우 /etc/nginx/nginx.conf
, /etc/nginx/nginx.conf.default
, /etc/nginx/conf.d/***.conf
에 있습니다.
/etc/nginx/conf.d/***.conf
의 내용을 살펴보면 로그의 위치가 기술되어 있을 것입니다.
/etc/nginx/conf.d/***.conferror_log /home/ec2-user/***/log/nginx.error.log;
access_log /home/ec2-user/***/log/nginx.access.log;
.
.
.
오류 로그(/home/ec2-user/***/log/nginx.error.log)의 내용을 살펴보면 다음과 같이 Permission denied
오류가 발생하고 있음을 알 수 있습니다.
/home/ec2-user/***/log/nginx.error.log2020/02/23 05:01:35 [crit] 26964#0: *47 stat() "/home/ec2-user/***/public/" failed (13: Permission denied), client: ***, server: ***, request: "GET / HTTP/1.1", host: "***"
2020/02/23 05:01:35 [crit] 26964#0: *47 connect() to unix:/home/ec2-user/***/tmp/sockets/.unicorn.sock failed (13: Permission denied) while connecting to upstream, client: ***, server: ***, request: "GET / HTTP/1.1", upstream: "http://unix:/home/ec2-user/***/tmp/sockets/.unicorn.sock:/", host: "***"
2020/02/23 05:01:35 [error] 26964#0: *47 open() "/home/ec2-user/***/public/500.html" failed (13: Permission denied), client: ***, server: ***, request: "GET / HTTP/1.1", upstream: "http://unix:/home/ec2-user/***/tmp/sockets/.unicorn.sock/", host: "***"
만약을 위해, Unicorn의 로그 파일도 봐 두는 것이 좋습니다. 서버상의 페이지에 브라우저로부터 액세스해, Nginx의 로그는 나오지만 Unicorn의 로그에 아무것도 표시되지 않는다면, Nginx로 에러가 일어나고 있는 것을 알기 때문입니다.
Unicorn 로그에 뭔가가 표시되면 Rails 앱 내에서 오류가 발생한다는 것입니다.
권한이란?
아래 사이트를 참고하십시오.
htps : // 엔 g 엔 t 란세. 코 m / ぃ ん x ぺr 미시 온 바시 c
왜 권한이 deny되는가?
사용자 디렉토리(/home/ec2-user/)의 권한은 700이므로 다른 사용자가/home/ec2-user/하위 디렉토리에 액세스할 수 없기 때문입니다.
브라우저에서 서버의 페이지에 액세스 할 때 nginx 실행 파일은 nginx
라는 사용자 이름으로 Rails 앱이있는 디렉토리에 액세스하여 일부 파일 (예 : tmp/sockets/.unicorn.sock 또는 public/등)을 로드합니다.
즉, nginx
라는 사용자에게는 해당 파일에 대한 액세스 권한이 있어야 합니다. 또한 파일에 액세스하려면 루트 디렉토리에서 해당 파일이 있는 디렉토리까지의 모든 디렉토리에 대한 액세스 권한이 있어야 합니다.
덧붙여서 액세스 권한은 권한으로 말하는 실행 권한 (x)입니다.
해결책
따라서 nginx 사용자가 ec2-user 디렉토리 아래에 있는 Rails 앱에 액세스할 수 있도록 하려면 ec2-user 디렉토리의 '기타 사용자'에게 실행 권한을 부여해야 합니다.
(즉, 다음을 실행하여 해결)chmod 701 /home/ec2-user
참고로 한 사이트
Reference
이 문제에 관하여(Nginx에서 403 Forbidden 오류 솔루션(Rails+AWS+Nginx+Unicorn 환경)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/shuhei_takada/items/3bc56e8ab78212a2abcc
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Ruby: 2.6.3
Rails: 6.0.2
Nginx: 1.12.2
서버 OS: Amazon Linux 2
해결책(먼저 결론만)
chmod 701 /home/ec2-user
에서 해결되었습니다 (ec2-user 디렉토리의 권한을 700 → 701로 변경했습니다)
※ /home/ec2-user/
바로 아래에 Rails 앱을 배치하고 있습니다
오류가 발생할 때까지의 경위
아래 페이지를 참고하면서 Rails 앱을 AWS에 배포하는 작업을 진행하고 있었습니다.
htps : // 코 m / 유키_ 나가오카 /
위의 페이지에서는 Rails 앱의 설치 장소를 /var/www/rails/
아래로 하고 있습니다만, 「앱의 설치 장소는 좋아하는 곳에서 좋을 것」이라고 생각하고, 자신의 경우는 ~/
( /home/ec2-user/
와 동의)에 배치했습니다.
결과적으로, 이 설치 장소의 차이가 이번 에러를 발생하게 되었습니다.
오류가 발생한 후 해결할 때까지의 경위
애초에 403 Forbidden이란?
페이지가 존재하지만 페이지를 볼 권한이 없어 액세스가 거부되었음을 나타내는 HTTP 상태 코드입니다.
(이번에는 Nginx가 Rails 앱이있는 디렉토리에 대한 액세스 권한이 없기 때문에 403 오류가 발생했습니다.)
참고 : htps : // 그럼.ぃきぺぢ아. 오 rg / 우키 / H tP_403
로그를 검토하고 오류의 원인을 확인합니다.
Nginx 로그 파일의 위치는 Nginx 구성 파일에 설명되어 있습니다.
Nginx 구성 파일은 OS마다 다르지만 Amazon Linux의 경우 /etc/nginx/nginx.conf
, /etc/nginx/nginx.conf.default
, /etc/nginx/conf.d/***.conf
에 있습니다.
/etc/nginx/conf.d/***.conf
의 내용을 살펴보면 로그의 위치가 기술되어 있을 것입니다.
/etc/nginx/conf.d/***.conferror_log /home/ec2-user/***/log/nginx.error.log;
access_log /home/ec2-user/***/log/nginx.access.log;
.
.
.
오류 로그(/home/ec2-user/***/log/nginx.error.log)의 내용을 살펴보면 다음과 같이 Permission denied
오류가 발생하고 있음을 알 수 있습니다.
/home/ec2-user/***/log/nginx.error.log2020/02/23 05:01:35 [crit] 26964#0: *47 stat() "/home/ec2-user/***/public/" failed (13: Permission denied), client: ***, server: ***, request: "GET / HTTP/1.1", host: "***"
2020/02/23 05:01:35 [crit] 26964#0: *47 connect() to unix:/home/ec2-user/***/tmp/sockets/.unicorn.sock failed (13: Permission denied) while connecting to upstream, client: ***, server: ***, request: "GET / HTTP/1.1", upstream: "http://unix:/home/ec2-user/***/tmp/sockets/.unicorn.sock:/", host: "***"
2020/02/23 05:01:35 [error] 26964#0: *47 open() "/home/ec2-user/***/public/500.html" failed (13: Permission denied), client: ***, server: ***, request: "GET / HTTP/1.1", upstream: "http://unix:/home/ec2-user/***/tmp/sockets/.unicorn.sock/", host: "***"
만약을 위해, Unicorn의 로그 파일도 봐 두는 것이 좋습니다. 서버상의 페이지에 브라우저로부터 액세스해, Nginx의 로그는 나오지만 Unicorn의 로그에 아무것도 표시되지 않는다면, Nginx로 에러가 일어나고 있는 것을 알기 때문입니다.
Unicorn 로그에 뭔가가 표시되면 Rails 앱 내에서 오류가 발생한다는 것입니다.
권한이란?
아래 사이트를 참고하십시오.
htps : // 엔 g 엔 t 란세. 코 m / ぃ ん x ぺr 미시 온 바시 c
왜 권한이 deny되는가?
사용자 디렉토리(/home/ec2-user/)의 권한은 700이므로 다른 사용자가/home/ec2-user/하위 디렉토리에 액세스할 수 없기 때문입니다.
브라우저에서 서버의 페이지에 액세스 할 때 nginx 실행 파일은 nginx
라는 사용자 이름으로 Rails 앱이있는 디렉토리에 액세스하여 일부 파일 (예 : tmp/sockets/.unicorn.sock 또는 public/등)을 로드합니다.
즉, nginx
라는 사용자에게는 해당 파일에 대한 액세스 권한이 있어야 합니다. 또한 파일에 액세스하려면 루트 디렉토리에서 해당 파일이 있는 디렉토리까지의 모든 디렉토리에 대한 액세스 권한이 있어야 합니다.
덧붙여서 액세스 권한은 권한으로 말하는 실행 권한 (x)입니다.
해결책
따라서 nginx 사용자가 ec2-user 디렉토리 아래에 있는 Rails 앱에 액세스할 수 있도록 하려면 ec2-user 디렉토리의 '기타 사용자'에게 실행 권한을 부여해야 합니다.
(즉, 다음을 실행하여 해결)chmod 701 /home/ec2-user
참고로 한 사이트
Reference
이 문제에 관하여(Nginx에서 403 Forbidden 오류 솔루션(Rails+AWS+Nginx+Unicorn 환경)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/shuhei_takada/items/3bc56e8ab78212a2abcc
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
아래 페이지를 참고하면서 Rails 앱을 AWS에 배포하는 작업을 진행하고 있었습니다.
htps : // 코 m / 유키_ 나가오카 /
위의 페이지에서는 Rails 앱의 설치 장소를
/var/www/rails/
아래로 하고 있습니다만, 「앱의 설치 장소는 좋아하는 곳에서 좋을 것」이라고 생각하고, 자신의 경우는 ~/
( /home/ec2-user/
와 동의)에 배치했습니다.결과적으로, 이 설치 장소의 차이가 이번 에러를 발생하게 되었습니다.
오류가 발생한 후 해결할 때까지의 경위
애초에 403 Forbidden이란?
페이지가 존재하지만 페이지를 볼 권한이 없어 액세스가 거부되었음을 나타내는 HTTP 상태 코드입니다.
(이번에는 Nginx가 Rails 앱이있는 디렉토리에 대한 액세스 권한이 없기 때문에 403 오류가 발생했습니다.)
참고 : htps : // 그럼.ぃきぺぢ아. 오 rg / 우키 / H tP_403
로그를 검토하고 오류의 원인을 확인합니다.
Nginx 로그 파일의 위치는 Nginx 구성 파일에 설명되어 있습니다.
Nginx 구성 파일은 OS마다 다르지만 Amazon Linux의 경우 /etc/nginx/nginx.conf
, /etc/nginx/nginx.conf.default
, /etc/nginx/conf.d/***.conf
에 있습니다.
/etc/nginx/conf.d/***.conf
의 내용을 살펴보면 로그의 위치가 기술되어 있을 것입니다.
/etc/nginx/conf.d/***.conferror_log /home/ec2-user/***/log/nginx.error.log;
access_log /home/ec2-user/***/log/nginx.access.log;
.
.
.
오류 로그(/home/ec2-user/***/log/nginx.error.log)의 내용을 살펴보면 다음과 같이 Permission denied
오류가 발생하고 있음을 알 수 있습니다.
/home/ec2-user/***/log/nginx.error.log2020/02/23 05:01:35 [crit] 26964#0: *47 stat() "/home/ec2-user/***/public/" failed (13: Permission denied), client: ***, server: ***, request: "GET / HTTP/1.1", host: "***"
2020/02/23 05:01:35 [crit] 26964#0: *47 connect() to unix:/home/ec2-user/***/tmp/sockets/.unicorn.sock failed (13: Permission denied) while connecting to upstream, client: ***, server: ***, request: "GET / HTTP/1.1", upstream: "http://unix:/home/ec2-user/***/tmp/sockets/.unicorn.sock:/", host: "***"
2020/02/23 05:01:35 [error] 26964#0: *47 open() "/home/ec2-user/***/public/500.html" failed (13: Permission denied), client: ***, server: ***, request: "GET / HTTP/1.1", upstream: "http://unix:/home/ec2-user/***/tmp/sockets/.unicorn.sock/", host: "***"
만약을 위해, Unicorn의 로그 파일도 봐 두는 것이 좋습니다. 서버상의 페이지에 브라우저로부터 액세스해, Nginx의 로그는 나오지만 Unicorn의 로그에 아무것도 표시되지 않는다면, Nginx로 에러가 일어나고 있는 것을 알기 때문입니다.
Unicorn 로그에 뭔가가 표시되면 Rails 앱 내에서 오류가 발생한다는 것입니다.
권한이란?
아래 사이트를 참고하십시오.
htps : // 엔 g 엔 t 란세. 코 m / ぃ ん x ぺr 미시 온 바시 c
왜 권한이 deny되는가?
사용자 디렉토리(/home/ec2-user/)의 권한은 700이므로 다른 사용자가/home/ec2-user/하위 디렉토리에 액세스할 수 없기 때문입니다.
브라우저에서 서버의 페이지에 액세스 할 때 nginx 실행 파일은 nginx
라는 사용자 이름으로 Rails 앱이있는 디렉토리에 액세스하여 일부 파일 (예 : tmp/sockets/.unicorn.sock 또는 public/등)을 로드합니다.
즉, nginx
라는 사용자에게는 해당 파일에 대한 액세스 권한이 있어야 합니다. 또한 파일에 액세스하려면 루트 디렉토리에서 해당 파일이 있는 디렉토리까지의 모든 디렉토리에 대한 액세스 권한이 있어야 합니다.
덧붙여서 액세스 권한은 권한으로 말하는 실행 권한 (x)입니다.
해결책
따라서 nginx 사용자가 ec2-user 디렉토리 아래에 있는 Rails 앱에 액세스할 수 있도록 하려면 ec2-user 디렉토리의 '기타 사용자'에게 실행 권한을 부여해야 합니다.
(즉, 다음을 실행하여 해결)chmod 701 /home/ec2-user
참고로 한 사이트
Reference
이 문제에 관하여(Nginx에서 403 Forbidden 오류 솔루션(Rails+AWS+Nginx+Unicorn 환경)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/shuhei_takada/items/3bc56e8ab78212a2abcc
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
error_log /home/ec2-user/***/log/nginx.error.log;
access_log /home/ec2-user/***/log/nginx.access.log;
.
.
.
2020/02/23 05:01:35 [crit] 26964#0: *47 stat() "/home/ec2-user/***/public/" failed (13: Permission denied), client: ***, server: ***, request: "GET / HTTP/1.1", host: "***"
2020/02/23 05:01:35 [crit] 26964#0: *47 connect() to unix:/home/ec2-user/***/tmp/sockets/.unicorn.sock failed (13: Permission denied) while connecting to upstream, client: ***, server: ***, request: "GET / HTTP/1.1", upstream: "http://unix:/home/ec2-user/***/tmp/sockets/.unicorn.sock:/", host: "***"
2020/02/23 05:01:35 [error] 26964#0: *47 open() "/home/ec2-user/***/public/500.html" failed (13: Permission denied), client: ***, server: ***, request: "GET / HTTP/1.1", upstream: "http://unix:/home/ec2-user/***/tmp/sockets/.unicorn.sock/", host: "***"
Reference
이 문제에 관하여(Nginx에서 403 Forbidden 오류 솔루션(Rails+AWS+Nginx+Unicorn 환경)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/shuhei_takada/items/3bc56e8ab78212a2abcc텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)