Django 앱을 Apache2로 배포하면 정적 파일을 읽지 못할 때

Django 앱을 tutorial대로 만들고 프로덕션 환경에 배포하면 CSS나 이미지 파일을 읽지 않게 된 경우의 대처 방법을 메모합니다.

이 슬라이드를 알기 쉽기 때문에 여기를 읽는 것이 좋습니다.
htps : // 펑크. 기주 b. 이오 / d 쟈고 곤g 렛 sjp2019 / # 43

1. Django의 정적 파일 처리



Django에서는 정적 파일의 취급이 개발중과 프로덕션 환경에서 다릅니다. 이것을 전환하는 것은 setting.py의 DEBUG = True/False입니다.

DEBUG = True일 때 /static/



django는 앱마다 폴더 나누어 개발하도록 만들어져 있기 때문에 정적 파일인 CSS나 이미지 파일도 앱의 폴더에 넣게 되어 있습니다. 그 때문에 개발중을 의미하는 DEBUG = True 사이는 setting.py에 쓴 STATIC_URL이나 STATICFILES_DIRS로 지정한 폴더 이하에 있는/static/라는 이름의 폴더를 모두/static/라는 Alias로 취급해 줍니다.

예를 들어 project/app1/static/base.css와 같은 파일이있는 경우,
h tp:// 이 m/s들 c/바세. cs 인 것으로 취급해 줍니다.

프로덕션 환경에서 django가 /static/을 전달하지 않는 이유



프로덕션 환경에서 이 기능을 사용해 버리면 메인 프로세스에 쓸데없이 부하가 걸려 버리고, 취약성의 원인이 될 수 있으므로 프로덕션 환경에서는 이 기능을 끊지 않으면 안됩니다. 이것을 강제하기 위해 Apache2 등으로 Django 앱을 배포하면 DEBUG = False로 하지 않으면 샘플 화면 밖에 표시되지 않습니다.


DEBUG = False일 때 /static/



DEBUG = True일 때는 Django가/static/라는 Alias에서 정적 파일을 제공하고 있었지만 DEBUG = False가 되면 제공하지 않으므로, 앞의 예에서 말하면 h tp:// 이 m/s들 c/바세. cs 은 존재하지 않는다는 것이 된다 합니다. 이것을 Apache등에서 제공해 주면 개발중과 같은 동작을 얻을 수 있습니다.

2. Apache2 설정 절차



python manage.py collectstatic을 사용하여 정적 파일을 한 곳에 모아서 아파치 2가/static/로 묶은 위치를 apahce2.conf에 씁니다. 장고 소녀 튜토리얼 에서하고있는 방법과 같습니다.

2-1. 정적 파일을 한 곳에 모으기



아래와 같이 프로젝트 바로 아래에 static이라는 폴더를 만들어 모아 줍니다.

/home/xxxx/django/proj1/
proj1
├── manage.py
├── mysite
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── myvenv
│   └── ...
├── static 静的ファイルを集める場所
│   ├── hoge.jpg
│   └── base.css
└── requirements.txt

정적 파일을 수집할 위치(STATIC_ROOT)를 지정합니다.
아래에서는/home/xxxx/django/proj1/static/이 STATIC_ROOT입니다.

proj1/mysite/setting.py
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

collectstatics 명령을 실행하면 STATIC_ROOT의 PATH에 정적 파일을 수집합니다.

terminal
cd /home/xxxx/django/proj1
python manage.py collectstatics

2-2. 정적 파일의 위치를 ​​apache2.conf에 추가



/home/xxxx/django/proj1/static/base.css 를 h tp:// 이 m/s들 c/바세. cs 로 취급하고 싶으므로 폴더에 Alias를 붙여 권한(Require all granted)합니다.

/etc/apache2/apache2.conf
Alias /static/ /home/xxxx/django/proj1/static/
<Directory /home/xxxx/django/proj1/static>
    Require all granted
</Directory>

설정을 변경했으므로 Apache2를 다시 시작합니다.

terminal
sudo /etc/init.d/apache2 restart

2-3. 잘 되지 않는 경우



collectstatics는 단순히 파일을 복사하기 때문에 STATIC_ROOT에 파일이 복사되어 있는지 확인하면 동작을 확인할 수 있습니다.

Apache2의 등록이 잘 되어 있지 않은 경우는, Apache2의 에러 로그에 Django wsgi Apache2: 'AH01630: client denied by server configuration' 가 나올 것입니다. apache2.conf의 내용이 STATIC_ROOT와 동일한지 확인하십시오.

기본 설정을 그대로두면 Apache2 오류 로그는 다음과 같습니다.

terminal
tail -f /var/log/apache2/error.log

좋은 웹페이지 즐겨찾기