설표의 장고




nginx Permission Denied 문제 해결방법




( 수정됨)


nginx를 이용해 웹사이트를 배포하고 제일 먼저 겪는 문제는 바로 css, media 파일 등을 정상적으로 불러올 수 없는 문제일 겁니다.
nginx 403 forbidden 에러

네트워크 상태를 확인해보면 static 파일 요청의 응답이 403 Forbidden이고, nginx의 에러 로그를 확인해보면 "Permission Denied"로 인해 디렉토리 접근을 차단당한 것이 원인임을 알 수 있습니다.

참고로 nginx의 에러로그 파일 경로는 "/var/log/nginx/error.log"입니다.

nginx Permission Denied 해결방법

문제의 원인은 웹사이트를 구성하는 파일이 "ubuntu" 계정에 할당되어있는데, nginx는 "www-data"라는 이름의 user를 이용하여 접근하는 것이 문제입니다.

nginx의 user를 ubuntu로 변경하는 것이 대중적으로 알려져있긴 하나, 이 글에서는 다른 방법을 사용합니다.

그룹에 추가하기

www-data user를 ubuntu group에 추가한 다음, nginx를 재시작합니다.

(django) $ sudo gpasswd -a www-data ubuntu
Adding user www-data to group ubuntu
(django) $ sudo systemctl restart nginx
(django) $

문제 해결

그 다음 웹사이트를 새로고침(단축키 F5)하면 다음과 같이 css 파일이 정상적으로 불러와지는 것을 확인할 수 있습니다.
만약 불러와지지 않는다면 "Ctrl" + "Shift" + "R"을 눌러 새로고침해보세요.

nginx 403 forbidden 에러 해결

그룹 권한 조정하기

다음 과정은 불필요한 경우 수행하지 않아도 됩니다.

nginx의 user를 변경하지 않고 그룹에 추가하는 이유는 권한을 별도로 관리하기 위함입니다.
"chmod g-w" 명령을 이용해 ubuntu 그룹의 쓰기 권한을 빼았을 수 있습니다.

"chmod g-w /home/ubuntu-R" 명령을 통해 ubuntu 디렉토리의 모든 파일의 쓰기 권한을 빼앗아보았습니다. 이로써 www-data는 파일을 읽거나 실행하는 것만 가능해집니다. 
"ls -l" 명령으로 현재 디렉토리의 권한을 확인할 수 있습니다.

권한 변경 이후 nginx를 재시작해 설정이 적용되도록 하는 것을 잊으면 안됩니다.

(django) ~$ ls -l
total 8
drwxrwxr-x 6 ubuntu ubuntu 4096 Jul 29 06:51 django
-rw-rw-r-- 1 ubuntu ubuntu   45 Jul 29 06:52 mysite.env
(django) ~$ chmod g-w /home/ubuntu -R
(django) ~$ ls -l
total 8
drwxr-xr-x 6 ubuntu ubuntu 4096 Jul 29 06:51 django
-rw-r--r-- 1 ubuntu ubuntu   45 Jul 29 06:52 mysite.env
(django) ~$ sudo systemctl restart nginx
(django) ~$

그룹에 쓰기 권한 부여하는 방법

상황에 따라 소유자가 아닌 그룹원이더라고 쓰기 권한이 필요할 수도 있습니다.
그럴 때는 "chmod g+w" 명령으로 그룹에 쓰기 권한을 부여할 수 있습니다.

가령 미디어 폴더에 쓰기 권한이 필요하다면 "chmod g+w ~/django/mysite/media -R" 명령으로 쓰기 권한을 부여할 수 있습니다.
마찬가지로 권한 변경 이후 nginx를 재시작해 설정이 적용되도록 하는 것을 잊으면 안됩니다.

(django) ~/django/mysite$ ls -l
total 192
drwxr-xr-x 4 ubuntu ubuntu   4096 Jul 29 06:51 board
drwxr-xr-x 4 ubuntu ubuntu   4096 Jul 29 06:51 config
-rw-r--r-- 1 ubuntu ubuntu 163840 Jul 29 06:58 db.sqlite
-rw-r--r-- 1 ubuntu ubuntu    684 Jul 29 06:51 manage.py
drwxr-xr-x 2 ubuntu ubuntu   4096 Jul 29 06:51 media
drwxr-xr-x 4 ubuntu ubuntu   4096 Jul 29 06:51 member
-rw-r--r-- 1 ubuntu ubuntu    169 Jul 29 06:51 pip.txt
drwxr-xr-x 4 ubuntu ubuntu   4096 Jul 29 06:51 static
drwxr-xr-x 2 ubuntu ubuntu   4096 Jul 29 06:51 templates
(django) ~/django/mysite$ chmod g+w ~/django/mysite/media -R
(django) ~/django/mysite$ ls -l
total 192
drwxr-xr-x 4 ubuntu ubuntu   4096 Jul 29 06:51 board
drwxr-xr-x 4 ubuntu ubuntu   4096 Jul 29 06:51 config
-rw-r--r-- 1 ubuntu ubuntu 163840 Jul 29 06:58 db.sqlite
-rw-r--r-- 1 ubuntu ubuntu    684 Jul 29 06:51 manage.py
drwxrwxr-x 2 ubuntu ubuntu   4096 Jul 29 06:51 media
drwxr-xr-x 4 ubuntu ubuntu   4096 Jul 29 06:51 member
-rw-r--r-- 1 ubuntu ubuntu    169 Jul 29 06:51 pip.txt
drwxr-xr-x 4 ubuntu ubuntu   4096 Jul 29 06:51 static
drwxr-xr-x 2 ubuntu ubuntu   4096 Jul 29 06:51 templates
(django) ~/django/mysit$ sudo systemctl restart nginx
(django) ~/django/mysite$



이 글의 댓글 기능은 일부러 막아놓았습니다. 궁금한 내용이 있다면 게시판을 이용해주세요!


공감 : 0