알쓸전컴(알아두면 쓸모있는 전자 컴퓨터)

Apache2에서 Django 배포 (renew) 본문

Web /Django

Apache2에서 Django 배포 (renew)

백곳 2022. 8. 26. 11:29

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/

 

How to use Django with Apache and mod_wsgi | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com


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 모듈이 필요 합니다. 

 

작업

  1. sudo apt-get install apache2 apache2-dev 
  2. https://github.com/GrahamDumpleton/mod_wsgi/releases 에서 Source code (tar.gz) 다운로드 
  3. ubuntu에 Source code 압축 풀기
  4. cd mod_wsgi-4.9.3 (소스 코드 압축 풀은 폴더로 경로 변경 저의 경우 4.9.3 버전)
  5. ./configure --with-apxs=/usr/local/apache/bin/apxs \
      --with-python=/home/user/bwaferMap/venv/bin/python (자신의 가상환경 파이썬 위치)
  6. make
  7. sudo make install 
  8. /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
Comments