배포 후 문제점 발견
성공적으로 배포한줄 알았건만 보이는 것과 같이 장고 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
=> 감사합니다...ㅠ