알쓸전컴(알아두면 쓸모있는 전자 컴퓨터)
Apache2에서 Django 배포 (renew) 본문
Apache2에서 Django 배포
재작성의 이유
- 최근에 python 버전의 다양화에 따른 mod_wsgi 의 실행 환경의 변화
- Django의 많은 버전 업그레이드
- DjangoRestFrameWork 인증 이슈(JWT 포함)
- ubuntu 에서 설정 디테일 하게 하기 위해.
위와 같은 이유로 배포 절차를 다시 작성 하게 되었습니다.
Django Project
기본 정보
- 프로젝트 이름 : bwaferMap
- static 파일 경로: static
- collectstatic 경로: staticfiles
settings.py
STATIC_URL = '/bWaferMap/static/'
STATICFILES_DIRS = [
BASE_DIR / 'static'
]
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
MEDIA_ROOT = os.path.join(BASE_DIR, 'static/images')
ALLOWED_HOSTS = ["*"]
이렇게 되면 static와 관련된 url은 http://배포IP:Port/bWaferMap/static/ 이 됩니다.
python manage collectstatic 을 하게 되면 staticfiles 폴더에 static 파일이 모이게 됩니다.
ALLOWED_HOSTS = ["*"] 로 설정 하여 모든 IP 에서 접속 가능 하도록 설정 하였습니다.
wsgi.py
os.environ["DJANGO_SETTINGS_MODULE"] = "bwaferMap.settings"
# os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'bwaferMap.settings')
application = get_wsgi_application()
저는 apache 에 한개의 Django Project만 띄울게 아니게 때문에 위와 같이 설정 했습니다.
설정 참조 : https://docs.djangoproject.com/en/4.1/howto/deployment/wsgi/modwsgi/
mod_wsgi 모듈 Build
mod_wsgi 모듈을 직접 Build 해야 하는 이유
- apt-get install libapache2-mod-wsgi-py3 로 설치시 작성 날짜 기준 python 3.6을 실행하는 module로 설치 됨.
- python 3.6 을 실행하는 Module 은 python 3.8 project 의 경우 실행시 에러 발생
- 다양한 python 버전을 3.6으로 통일화 하는건 불가능 하기에 프로젝트에 맞는 python 버전으로 mod_wsgi을 실행하기 위해서
위와 같은 이유로 직접 자신의 Python 프로젝트에 맞는 mod_wsgi 모듈이 필요 합니다.
작업
- sudo apt-get install apache2 apache2-dev
- https://github.com/GrahamDumpleton/mod_wsgi/releases 에서 Source code (tar.gz) 다운로드
- ubuntu에 Source code 압축 풀기
- cd mod_wsgi-4.9.3 (소스 코드 압축 풀은 폴더로 경로 변경 저의 경우 4.9.3 버전)
- ./configure --with-apxs=/usr/local/apache/bin/apxs \
--with-python=/home/user/bwaferMap/venv/bin/python (자신의 가상환경 파이썬 위치) - make
- sudo make install
- /usr/lib/apache2/modules/mod_wsgi.so 파일 생성 확인
위와 같은 작업을 하고 난뒤 mod_wsgi.so 파일이 생성 됨을 확인 할수 있습니다.
저의 경우 저의 가상 환경 python은 python 3.8 버전이여서 3.8로 실행 되는 mod_wsgi 가 생성 되었습니다.
빌드 참조 사이트 : https://modwsgi.readthedocs.io/en/master/user-guides/quick-installation-guide.html
Apache2 설정
/etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
LoadModule wsgi_module /usr/lib/apache2/modules/mod_wsgi.so
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
Alias /bWaferMap/static/ /home/user/bwaferMap/staticfiles/
<Directory /home/user/bwaferMap/staticfiles>
Require all granted
</Directory>
<Directory /home/user/bwaferMap/bwaferMap>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
WSGIDaemonProcess bwaferMap python-home=/home/user/bwaferMap/venv python-path=/home/user/bwaferMap
WSGIProcessGroup bwaferMap
WSGIScriptAlias /bwaferMap /home/user/bwaferMap/bwaferMap/wsgi.py process-group=bwaferMap
WSGIPassAuthorization On
</VirtualHost>
설정 설명
1. LoadModule wsgi_module /usr/lib/apache2/modules/mod_wsgi.so
- mod_wsgi 모듈을 로딩 합니다.
2. Alias /bWaferMap/static/ /home/user/bwaferMap/staticfiles/
- /bWaferMap/static/ 라는 경로의 Url 이 들어 오면 /home/user/bwaferMap/staticfiles/ 파일로 경로를 이동시켜
/bWaferMap/static/ 의 기본 경로로 바꾸게 됩니다.
3. <Directory /home/user/bwaferMap/staticfiles>
Require all granted
</Directory>
- 해당 /home/user/bwaferMap/staticfiles 경로의 파일을 mod_wsgi 에서 접속 가능 하도록 합니다.
4. <Directory /home/user/bwaferMap/bwaferMap>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
- Django 프로젝트 안에 wsgi.py 파일을 실행 가능 하도록 권한을 줍니다.
5. WSGIDaemonProcess bwaferMap python-home=/home/user/bwaferMap/venv python-path=/home/user/bwaferMap
- python-home 은 가상 환경 폴더의 경로 입니다.
- python-path은 Django Project의 폴더 경로 입니다.
6. WSGIProcessGroup bwaferMap
- group의 이름을 설정 합니다. (5번 설정의 WSGIDaemonProcess bwaferMap 와 똑같이 설정 합니다..)
7. WSGIScriptAlias /bwaferMap /home/user/bwaferMap/bwaferMap/wsgi.py process-group=bwaferMap
- /bwaferMap 은 url 접속 Root 경로 입니다 (example: http://100.0.100.50/bwaferMap)
- /home/user/bwaferMap/bwaferMap/wsgi.py 은 Django Project의 wsgi.py의 경로 입니다.
- process-group=bwaferMap 은 6번 설정에서 설정한 그룹 이름입니다.
8. WSGIPassAuthorization On
- 해당 설정이 없을때는 Django에 http Header 데이터중 Auth(인증) 관련된 데이터가 들어오지 않게 됩니다.
- 해당 설정이 없으면 JWT 또한 Django 프로그램 안에 데이터가 누락 되어 들어 오게 되니 설정 하여야 합니다.
Apache2 실행
sudo service apache2 start 을 실행 합니다.
Apache2 실행 에러 발생시
journalctl -u apache2.service 를 실행 시켜 apache 설정 관련 에러 원인을 알수 있습니다.
tail -f /var/log/apache2/error.log 을 통해서 Django 실행시 생기는 문제를 알수 있습니다.
Django 실행시 문제가 생기는 부분은 로그를 남겨서 문제를 디버깅 하는것도 좋은 방법 입니다 .
Apache2 실행시 Django Project 내 파일 참조 문제
Django 에서 파일을 참조하거나 저장하거나 할때
os.path.join(BASE_DIR, '파일 이름')
os.path.join(BASE_DIR,'xxxxx') 을 이용하여 소스 폴더내 경로를 참조 하여야 합니다.
안그러면 엉뚱한 곳에 파일을 참조하거나 저장 할수 있습니다.
'Web > Django' 카테고리의 다른 글
django bootstrap 테마 적용 (4) | 2017.09.10 |
---|---|
django css 적용하기 (0) | 2017.08.15 |
DjangoTEST 하기 (0) | 2017.08.15 |
제너릭 뷰 사용하기 (0) | 2017.08.14 |
django HttpResponseRedirect 하기 (0) | 2017.08.14 |