본문 바로가기
DJango

[AWS배포 & DJango] AWS nginX 적용했는데도 static 파일을 읽어오지 못하는 오류 해결방법

by 지식을 쌓는 개구리 2024. 7. 8.

배포 후 문제점 발견

 

성공적으로 배포한줄 알았건만 보이는 것과 같이 장고 admin 페이지를 포함해서

모든 페이지에 css파일이 하나도 적용이 안되는 문제가 발생했다.

문제를 보니.. Nginx가 실행되는 사용자가 www-data로 설정되어 있을 때 해당 사용자가 Django 정적 파일 디렉토리인 /home/ubuntu/프로젝트/static/에 접근할 권한이 없었다. 그 때문에 Nginx는 정적 파일을 제공하지 못했던것,,

이를 해결하기 위해 Nginx 설정 파일에서 user www-data;를 user ubuntu;로 변경했다.

이렇게 함으로써 Nginx가 ubuntu 사용자 권한으로 실행되게 되고 ubuntu 사용자는 해당 디렉토리에 대한 접근 권한을 가지고 있기 때문에 정적 파일을 정상적으로 제공할 수 있다.

 

해결 방법은 2단계

(이 방식도 물론 해결책이나 좋은 방법은 아닐 수 있다. 이 해결책 밑에 새로운 해결책 역시 정리해두었으니 참고.)

 

1. nginx.conf 파일의 user 데이터를 ubuntu로 변경해준다.

 

sudo vi /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;
}

http {

        ##
        # Basic Settings
        ##

        sendfile on;
        tcp_nopush on;
        types_hash_max_size 2048;
        # server_tokens off;

        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ##
        # SSL Settings
        ##

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;

=> 이런 내용이 출력된텐데.

- i <- 입력해서 인서트 모드로 들어간다.

- 맨 상단에 user www-data;를 user ubuntu;로 변경한다.

- esc 키를 누르고 :wq 를 입력한뒤 엔터하고 저장 및 나온다.

 

2. nginX를 재시작한다.

sudo systemctl restart nginx

 

=> 위 명령어로 nginx를 재시작해주자

 

결과

=> css 정적 파일들이 잘 먹히는 것을 확인할 수 있다..ㅠㅠ

 

문제점 추가 고민 + 더 좋은 해결 방법

아무리 생각해도 위 방식으로 진행하는 것에 대한 의문이 들었다. www-data임에도 정상 동작되는 케이스가

분명 있었기 때문에...

 

찝찝했기에 구글링과 각종 문서를 확인하였고 더 정확한 문제 인식을 하며 더 좋은 해결책을 찾았다.

 

EC2 인스턴스를 처음 생성하면 기본적으로 ubuntu 사용자 계정을 사용하게 된다.

이때 기본 홈 디렉토리는 /home/ubuntu로 설정된다.

Nginx와 연결하려는 WAS(웹 애플리케이션 서버)가 해당 디렉토리에 접근하려면 각 디렉토리에 적절한 실행 권한이 필요하다.

 

문제의 원인은... /home/ubuntu 디렉토리에 실행 권한이 없어서 Nginx가 해당 디렉토리의 파일에 접근할 수 없기 때문이었고..

이것 때문에 Nginx가 정적 파일을 제공하지 못하고 403 Forbidden 오류를 발생시켰다.

기본적으로 Nginx는 웹 서버로서 정적 파일을 제공하는 역할을 하며

정적 파일이 위치한 디렉토리와 그 상위 디렉토리들에 실행 권한이 필요하다.

 

내 Django 프로젝트의 경로는 /home/ubuntu/MARU_EGG_LLM에 위치해 있었다.

이 경로의 각 디렉토리에 실행 권한을 추가로 부여해야 Nginx가 파일에 접근할 수 있었다.

따라서 다음과 같이 각 디렉토리에 실행 권한을 부여했다

 

sudo chmod +x /home

sudo chmod +x /home/ubuntu

sudo chmod +x /home/ubuntu/본인프로젝트이름

=> 따라 치기

 

먼저, 루트 디렉토리 /home에 실행 권한을 부여했다. 이는 모든 사용자들이 이 디렉토리를 탐색할 수 있도록 하기 위함이다. 그 다음으로, /home/ubuntu 디렉토리에도 실행 권한을 부여하여 Nginx가 이 경로를 통해 파일에 접근할 수 있도록 했다. 마지막으로, 실제 Django 프로젝트가 위치한 /home/ubuntu/django-project 디렉토리에도 실행 권한을 부여했다.

 

이와 같은 설정을 통해 Nginx가 Django 애플리케이션의 정적 파일에 접근할 수 있게 되었음.

 

Nginx는 웹 서버로서 정적 파일을 제공하는데 중요한 역할을 한다.

이러한 파일들은 일반적으로 CSS, JavaScript, 이미지 파일 등을 포함한다. Django는 개발 서버에서 이러한 파일들을 자동으로 제공하지만,,,

배포 환경에서는 Nginx와 같은 웹 서버를 통해 제공된다.

이를 위해 Django의 collectstatic 명령어를 사용하여 정적 파일들을 하나의 디렉토리에 모으고

Nginx가 이 디렉토리의 파일들을 제공하도록 설정하였던 것이다.

 

결론적으로는 /home/ubuntu 디렉토리와 그 하위 디렉토리에 실행 권한을 부여함으로써 Nginx가 Django 애플리케이션의 정적 파일에 접근할 수 있도록 설정하였다. 이렇게 함으로써 Nginx가 문제없이 정적 파일을 제공할 수 있게 되었고 403 Forbidden 오류를 해결할 수 있었다.

 

명령어 막 치다가,, 그냥 나와있는거 복붙하다가 어디서 잘못 꼬였던 것 같다..

역시 하나하나 잘 이해하면서 명령어를 사용하는 것이 매우 중요하다는 것을 깨닫게 되었다.

 

문제해결에 큰 도움이 된 블로그 링크 : https://taltal-dev-note.tistory.com/119

 

Nginx static file 403 forbidden error # Nginx Static file을 못잡는 경우

실행환경: AWS EC2 - Ubuntu22.04 문제상황: EC2 환경에서 Nginx로 django의 static file이 읽어와지지 않는 오류를 마주했습니다. static file들이 있는 경로에 접근을 못하는 403 error (permission denied)가 발생 원인

taltal-dev-note.tistory.com

=> 감사합니다...ㅠ