본문 바로가기
개발자모드/혼자공부하는파이썬

[파이썬/장고#37] AWS 서버 환경에서 장고 Admin 사용하기 (ft. 슈퍼유저 생성, STATIC_ROOT 설정, 정적파일 복사)

by 요니L 2022. 10. 26.

 

 

서버 환경에서 장고 Admin을 사용해 보자. 장고 Admin을 사용하려면 개발 환경에서 했던 것처럼 슈퍼 유저를 먼저 생성해야 한다. 

 


슈퍼 유저 생성하기

 

(1단계) 서버 환경에서 슈퍼 유저 생성하기

 

서버 가상 환경에서 python manage.py createsuperuser 명령으로 슈퍼 유저를 생성하자.

 

# [MobaXterm] 

ubuntu@ip-172-26-8-122:~$ mysite
(mysite) ubuntu@ip-172-26-8-122:~/projects/mysite$ python manage.py createsuperuser
사용자 이름 (leave blank to use 'ubuntu'): admin
이메일 주소: admin@mysite.com
Password:
Password (again):
비밀번호가 사용자 이름와 너무 유사합니다.
비밀번호가 너무 짧습니다. 최소 8 문자를 포함해야 합니다.
비밀번호가 너무 일상적인 단어입니다.
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.
(mysite) ubuntu@ip-172-26-8-122:~/projects/mysite$

 

사용자 이름: admin

이메일 주소: admin@mysite.com

Password: admin

 

 

 

(2단계) 장고 Admin 접속하기 

 

그리고 웹 브라우저에서 장고 Admin에 접속해 보자.

 

502 Bad Gateway

nginx/1.18.0 (Ubuntu)

 

 위와 같은 오류가 나오면 아래 명령어로 Gunicorn을 실행하자.

(mysite) ubuntu@ip-172-26-8-122:~/projects/mysite$ gunicorn --bind unix:/tmp/gunicorn.sock config.ws
gi:application

 

스타일이 깨진 것처럼 보이는 장고 Admin

 

이렇게 보이는 이유는 Nginx가 장고 Admin에서 사용하는 정적 파일을 제대로 읽지 못했기 때문이다. Nginx가 바라보는 정적 파일은 /home/ubuntu/projects/mysite/static 디렉터리에 위치해야 한다. 하지만 장고 Admin이 사용하는 정적 파일들은 다음 디렉터리에 위치한다.

 

장고 Admin이 사용하는 정적 파일 디렉터리 위치
/home/ubuntu/venvs/mysite/lib/python3.8/site-packages/django/contrib/admin/static

 

장고에 내장된 개발 서버는 장고 Admin이 사용될 때 자동으로 위 디렉터리의 정적 파일을 읽도록 설계되었다. 하지만, Nginx는 그렇게 설계되지 않았다. Nginx는 장고에 특화된 웹 서버가 아니라 범용적인 웹 서버이기 때문이다.

 

 


관리자 정적 파일 복사하기

 

이 문제를 해결하려면 장고 환경설정 파일에 STATIC_ROOT 디렉터리를 설정하고 python manage.py collectstatic 명령을 수행하여 관리자 앱의 정적 파일을 STATIC_ROOT 디렉터리로 복사해야 한다.

 

 

(1단계) STATIC_ROOT 설정하기

 

다음처럼 prod.py 파일에 STATIC_ROOT 항목을 추가한다.

 

# D:\projects\mysite\config\settings\prod.py


from .base import *

ALLOWED_HOSTS = ['3.35.154.72']
STATIC_ROOT = BASE_DIR / 'static/'

Nginx에 정적 파일 위치를 /home/ubuntu/projects/mysite/static 디렉터리로 등록하였으므로 STATIC_ROOT도 위와 같이 설정해야 한다. 

 

* BASE_DIR : /home/ubuntu/projects/mysite

 

 

(2단계) STATICFILES_DIRS 설정하기 

 

prod.py에 STATICFILES_DIR를 다음처럼 추가하자. 

 

# D:\projects\mysite\config\settings\prod.py

from .base import *

ALLOWED_HOSTS = ['3.35.154.72']
STATIC_ROOT = BASE_DIR / 'static/'
STATICFILES_DIRS = []

 

그런데 base.py 파일에는 이미 다음처럼 STATICFILES_DIR 항목이 정의되어 있다.

 

# D:\projects\mysite\config\settings\base.py

STATICFILES_DIRS = [
    BASE_DIR / 'static'
]

 

base.py 파일에 STATICFILES_DIRS 항목이 이미 있는데 prod.py 파일에 다시 빈 값으로 설정하는 이유는 STATIC_ROOT가 설정된 경우 STATICFILES_DIRS 리스트에 STATIC_ROOT와 동일한 디렉터리가 포함되어 있으면 서버 실행 시 다음과 같은 오류가 발생하기 때문이다.

 

STATICFILES_DIRS 리스트에 STATIC_ROOT와 동일한 디렉터리가 포함되는 나타나는 오류
?: (staticfiles.E002) The STATICFILES_DIRS setting should not contain the STATIC_ROOT setting.

 

따라서 prod.py파일에 STATICFILES_DIRS = []으로 설정하여 오류를 방지해야 한다.

 

 

(3단계) 변경된 내용 서버에 적용

 

파일을  수정했으면 git 명령으로 commin, push 하자.

 

cmd 창에서 가상환경 들어가서 진행

(mysite) D:\projects\mysite>git commit -a -m "STATIC ROOT 생성"
[master f5a04af] STATIC ROOT 생성
 1 file changed, 3 insertions(+)

(mysite) D:\projects\mysite>git push
Enumerating objects: 9, done.
Counting objects: 100% (9/9), done.
Delta compression using up to 6 threads
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 490 bytes | 490.00 KiB/s, done.
Total 5 (delta 3), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (3/3), completed with 3 local objects.
To https://github.com/Yoni33333/pybo.git
   2841a16..f5a04af  master -> master

(mysite) D:\projects\mysite>

 

그리고 서버에서는 다음과 같이 git pull 명령으로 변경 내용을 적용하자.

 

# [MobaXterm]

(mysite) ubuntu@ip-172-26-8-122:~/projects/mysite$ git pull
remote: Enumerating objects: 9, done.
remote: Counting objects: 100% (9/9), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 5 (delta 3), reused 5 (delta 3), pack-reused 0
Unpacking objects: 100% (5/5), 470 bytes | 78.00 KiB/s, done.
From https://github.com/Yoni33333/pybo
   2841a16..f5a04af  master     -> origin/master
Updating 2841a16..f5a04af
Fast-forward
 config/settings/prod.py | 3 +++
 1 file changed, 3 insertions(+)
(mysite) ubuntu@ip-172-26-8-122:~/projects/mysite$

 

 

★ 변경된 프로그램 서버에 적용하기

# 개발 환경에서 프로그램이 변경된 경우(cmd 창)
1. git add *
2. git commit -m "수정내용 코멘트"
3. git push
# 서버 환경에서 변경된 내용 적용(MobaXterm)
1. git pull
2. git sudo systemctl restart mysite.service

 

 

(4단계) collectstatic 명령으로 정적 파일 복사하기

 

이제 python manage.py collectstatic 명령을 수행하여 관리자 앱의 정적 파일을 복사한다.

중간에 yes를 입력하여 진행하면 132개의 정적 파일이 '/home/ubuntu/projects/mysite/static' 에 복사되었다는 메시지를 확인할 수 있다.

 

# [MobaXterm]

(mysite) ubuntu@ip-172-26-8-122:~/projects/mysite$ python manage.py collectstatic

You have requested to collect static files at the destination
location as specified in your settings:

    /home/ubuntu/projects/mysite/static

This will overwrite existing files!
Are you sure you want to do this?

Type 'yes' to continue, or 'no' to cancel: yes

132 static files copied to '/home/ubuntu/projects/mysite/static'.
(mysite) ubuntu@ip-172-26-8-122:~/projects/mysite$

 

 

정적 파일들이 잘 모였는지 다음 명령어를 이용하여 확인해 본다.  ls -l 명령 수행 시 admin 디렉터리가 추가된 것을 확인할 수 있다.

 

# [MobaXterm]

(mysite) ubuntu@ip-172-26-8-122:~/projects/mysite$ cd static
(mysite) ubuntu@ip-172-26-8-122:~/projects/mysite/static$ ls -l
total 440
drwxrwxr-x 6 ubuntu ubuntu   4096 Oct 26 10:20 admin
-rw-rw-r-- 1 ubuntu ubuntu 160392 Oct 17 10:08 bootstrap.min.css
-rw-rw-r-- 1 ubuntu ubuntu  63240 Oct 17 10:08 bootstrap.min.js
-rw-rw-r-- 1 ubuntu ubuntu  89664 Oct 17 10:08 jquery-3.6.1.min.js
-rw-rw-r-- 1 ubuntu ubuntu     88 Oct 17 10:08 style.css
-rw-rw-r-- 1 ubuntu ubuntu 118231 Oct 17 10:08 글쓰기.html
drwxrwxr-x 2 ubuntu ubuntu   4096 Oct 17 10:08 글쓰기_files
(mysite) ubuntu@ip-172-26-8-122:~/projects/mysite/static$

 

그리고 다시 장고 Admin에 화면이 정상적으로 보여지는지 확인해 보자.

 

정상적으로 장고 Admin 화면이 표시

 

 

 


 

여기까지.

 

 

 

댓글