🕹️

6. Collectstatic

Created
2020/12/26 05:17
Tags
그런데, DNS/admin 으로 접속해 보면 아주 원시적인 모양의 페이지가 나타나는 것을 볼 수 있다. 나는 이런 환경에서 작업하는 것을 매우 좋아하지 않기 때문에, 다시 쓸 만한 Django Admin으로 만들어 줘야겠다.
우선 Django Admin에 스타일이 전혀 적용되어 있지 않은 이유는, Django Admin을 위한 static 파일의 경로를 Nginx가 알아서 찾아 뿌려주지 않기 때문이다. 이런 static 파일은 여기저기 흩어져(?) 있는데, 로컬에서 실행할 때는 고마운 manage.py 가 알아서 해 주었다고 한다. 어쨌거나 Nginx가 이러한 static 파일을 발견해 뿌려줄 수 있도록 설정해야 한다.
다행히도, 친절한 Django는 이를 쉽게도 만들어 놓았다. 바로 python manage.py collectstatic 이다. collectstatic 은 여기저기 흩어져 있는 static 파일들을 하나의 디렉토리에 모아 주는 역할을 한다. 앞서 settings/base.py 파일에서 STATIC_*** 와 같은 설정들을 이미 해 놓았다. 이제 해야 할 일은 collectstatic을 통해 static 파일들을 찾기 편하게 모으고, 이를 Nginx에 알려주는 것이다.

Collectstatic

앞서 static에 대해 다음과 같이 설정했었다.
# settings/base.py ... STATIC_URL = '/static/' STATIC_DIR = os.path.join(BASE_DIR, 'static') STATICFILES_DIRS = [ STATIC_DIR, ] STATIC_ROOT = os.path.join(ROOT_DIR, '.static_root') ...
Python
복사
이는 대충 /static/ 으로 들어오는 요청을 static 요청으로 간주하겠다는 것이고, collectstatic 을 통해 ROOT_DIR의 .static_root 디렉토리에 static 파일을 모두 모으겠다는 것이다. 설정이 완료되었다면 서버에 접속해 다음의 명령어로 collectstatic 을 실행한다.
python manage.py collectstatic
Plain Text
복사
이제 /srv/[PROJECT_NAME]/.static_root 디렉토리에 static 파일들이 복사된 것을 볼 수 있다.

Nginx location 설정

이제 Nginx에게 /static/ 으로 들어온 요청에 대해서는 .static_root 디렉토리를 찾아보라고 알려줘야 한다. .config/nginx/[PROJECT_NAME].conf 의 설정을 다음과 같이 수정하자.
server { listen 80; server_name [YOUR_SERVER_NAME]; charset utf-8; client_max_body_size 128M; # 이 부분이 추가되었다. location /static/ { alias /srv/[PROJECT_NAME]/.static_root/; } location / { uwsgi_pass unix:///tmp/[PROJECT_NAME].sock; include uwsgi_params; } }
Shell
복사
location은 들어온 요청을 다음과 같이 처리한다는 것을 의미한다.
이제 다시 다음의 명령어로 Nginx configuration을 적용해 주고, 서비스를 재시작하면 Django Admin 스타일이 적용되어 있을 것이다.
# Nginx config 적용 (변경할 때마다 실행해야 하니 alias로 지정해 놓읍시다) sudo cp -f /srv/[PROJECT_NAME]/.config/nginx/[PROJECT_NAME].conf /etc/nginx/sites-available/[PROJECT_NAME].conf sudo ln -sf /etc/nginx/sites-available/[PROJECT_NAME].conf /etc/nginx/sites-enabled/[PROJECT_NAME].conf # 서비스 재시작 sudo systemctl restart uwsgi nginx
Shell
복사
E.O.D.