Django 개발중 이슈 발생
Django 사이트 개발이 막바지 단계라 이제 Debug를 True에서 False로 변경하여 민감한 정보들을 사용자에게 노출시키지 않으려고 했다.
settings.py에서 기존의 Debug = True를 Debug = False로 변경하고 아래 코드를 추가하였다.
SECURE_SSL_REDIRECT = True
SECURE_HSTS_SECONDS = 3600
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True
SECURE_CONTENT_TYPE_NOSNIFF = True
SECURE_BROWSER_XSS_FILTER = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
그리고 서버를 다시 켰는데....
static폴더안의 파일과의 링크가 끊겼다.
html이나, static경로를 사용하는 모든 webp, css, js 등의 파일이 정상적으로 로드되지 않는 증상이 발생하였다....
<link rel="stylesheet" href="{% static 'css/test_css/style.css' %}">
위 코드와 같은 형태가 동작하지 않는 건데,,,, 원인은 간단하다.
django가 해당 파일의 경로를 못찾는것이다.
debug=True일때와 debug=False일때의 static 경로를 찾는 방식이 달라서 발생하는 문제이다.
Difference Between DEBUG=True and DEBUG=False
DEBUG=True일 때
- 개발 환경에서의 정적 파일 서빙
- 개발 중에는 Django가 개발 서버(runserver)를 통해 정적 파일을 자동으로 서빙합니다. 즉, Django 자체가 STATIC_URL로 설정된 경로를 처리하고, 정적 파일을 요청하는 브라우저에 바로 전달합니다.
- 개발 시에는 웹 서버(Nginx, Apache 등)가 따로 필요하지 않으며, python manage.py runserver 명령어만으로 정적 파일이 제공됩니다. 이때 collectstatic 명령을 실행할 필요도 없습니다.
- 임시로 개발용 서버가 정적 파일을 제공
- 개발 중에는 파일을 빠르게 로드하기 위해 Django의 자체 서버(runserver)가 정적 파일을 서빙하는 임시적인 용도로 동작합니다. 이 방식은 오직 개발 환경에서만 사용되며, 성능이 떨어지고, 보안상의 문제가 있을 수 있습니다.
DEBUG=False일 때
- 운영 환경에서는 Django가 정적 파일을 서빙하지 않음
- 운영 환경에서는 Django가 성능과 보안 문제로 인해 직접 정적 파일을 서빙하지 않습니다. 즉, DEBUG=False일 때는 Django가 정적 파일 요청을 처리하지 않도록 설계되어 있습니다.
- 대신, **웹 서버(예: Nginx, Apache)**가 정적 파일을 서빙하는 역할을 해야 합니다. Django는 운영 환경에서 웹 서버가 정적 파일을 처리할 수 있도록 collectstatic 명령어로 모든 정적 파일을 한 곳으로 모아야 합니다.
- 정적 파일 서빙을 위한 준비 작업 필요
- DEBUG=False에서 정적 파일이 제공되기 위해서는 다음 작업들이 필요합니다:
- 정적 파일을 수집(collectstatic): python manage.py collectstatic 명령어를 통해 정적 파일들을 한 곳(STATIC_ROOT)에 모아야 합니다.
- 웹 서버 설정: 웹 서버(Nginx, Apache 등)가 정적 파일을 제공할 수 있도록 설정해야 합니다. 예를 들어, Nginx는 /static/ 경로에 대한 요청을 STATIC_ROOT로 지정된 디렉터리에서 처리하도록 설정합니다.
- DEBUG=False에서 정적 파일이 제공되기 위해서는 다음 작업들이 필요합니다:
요약하자면 로컬 PC에서 서버를 실행할때에는 웹서버를 안쓰므로(쓰는 경우도 있지만) 정적경로를 찾는 역할을 웹서버 대신에 runserver가 처리해주는거고, 웹서버를 쓰는 경우에는 웹서버에서 정적파일의 경로를 찾아주므로 runserver에서 debug=False일때 정적파일을 찾는 작업을 실행하지 않는 것이다.
해결방법
1. setting.py에서 경로를 지정한다.
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent
STATIC_URL = 'static/'
STATICFILES_DIRS = [
BASE_DIR / 'static',
]
INSTALLED_APPS = [
'django.contrib.staticfiles',
]
ALLOWED_HOSTS = ['your-domain.com', 'your-server-ip']
2. collectstatic 명령어 실행하기
python manage.py collectstatic
3. nginx에서 진행할 경우 정적파일 경로 지정하기
location /static/ { alias /path/to/your/project/staticfiles/; # STATIC_ROOT 경로 }
4. html에 {% load static %} 이 있는지 확인하기
위 모든 작업을 진행한 이후 서버를 재시작하면 됩니다.
끝.
728x90
반응형