nginx Permission Denied 문제 해결방법

하얀설표 | 작성시간 2024.11.08.

(2024.12.18. 수정됨.)

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

nginx 403 forbidden 에러

nginx의 에러로그 파일인 "/var/log/nginx/error.log"을 "nano /var/log/nginx/error.log" 명령으로 열어보면 다음과 같이 "failed (13: Permission denied)" 라는 기록이 남아있는 것을 확인할 수 있습니다.

2023/01/21 09:50:00 [error] 12912#12912: *266 open() "/home/ubuntu/mystie/static/style.css" failed (13: Permission denied), client: xxx.xxx.xxx.xxx, server: xxxxx.net, request: "GET /static/style.css HTTP/1.1", host: "django.seolpyo.com", referrer: "https://django.seolpyo.com/entry/31/"
2023/01/21 09:50:01 [error] 12912#12912: *266 open() "/home/ubuntu/mystie/media/images/werkstujk_1_Far44Li.2e16d0ba.fill-322x247-c100.jpg" failed (13: Permission denied), client: xxx.xxx.xxx.xxx, server: xxxxx.net, request: "GET /media/images/werkstujk_1_Far44Li.2e16d0ba.fill-322x247-c100.jpg HTTP/1.1", host: "django.seolpyo.com", referrer: "https://django.seolpyo.com/entry/31/"

이는 nginx에서 media 또는 static 폴더를 발견했지만, 폴더에 접근할 수 있는 권한이 없어 파일을 읽을 수 없었다는 것을 뜻합니다.

nginx Permission Denied 해결방법

대부분 장고 프로젝트는 "ubuntu" 계정에 할당되어있는데, nginx는 "www-data"라는 이름의 user를 이용하여 접근하는 것이 문제입니다.

많이 알려진 방법

nginx의 user를 ubuntu로 변경하는 것이 대중적으로 알려져있습니다.

터미널에 sudo nano /etc/nginx/nginx.conf 명령을 입력해 nginx의 confg 파일을 열어보면 다음과 같은 내용을 확인할 수 있는데,

# /etc/nginx/nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 768;
        # multi_accept on;
}
...

가장 상단의 user www-data;user {username};와 같이 권한을 가진 이용자로 변경합니다. 보통 ubuntu로 되어있기 때문에, user ubuntu;로 변경하게 됩니다.
그 다음 sudo systemctl restart nginx 명령으로 nginx를 재시작해주면 됩니다.

현재 터미널을 이용 중인 username은 sudo whoami 명령으로 확인할 수 있습니다.

간단하긴 하지만, nginx가 root 권한을 가진 user를 사용하게 될 수도 있으므로 마음에 드는 방법은 아닙니다.

다른 방법

nginx의 conf 파일을 수정하는게 아닌, user의 권한을 추가하는 방법입니다.

그룹에 추가하기

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$



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