-
[Django] Python 3.5에서 Python 3.7로 업그레이드 하기(mod_wsgi업그레이드) (Ubuntu)Web/Django 2020. 8. 9. 02:18
정말 하루하루 새로워지는 재미가 있는 것 같다.
저번달까지만 해도 새로운 서버에서 뚝딱 30분 안으로 장고에 아파치, MySQL 연결하는 것이 간단했는데
django channels (web socket)기능을 추가해서 그런지 새로운 업데이트가 생겨서인지
또 새로운 서버를 파서 장고를 연결해보려고 했을 때에
AttributeError: module 'asyncio' has no attribute 'coroutine'
이러한 에러와 마주쳤다 ...
열심히 검색을 해본 결과 새로운 서버에서의 파이썬의 버전이 3.5.2인데 django channels에서 사용하는 함수가 3.5.3 이상이여야 해서 그런 것 같다. 그래서 파이썬을 3.7로 업그레이드 하기로 했다
파이썬 3.7로 업그레이드
또 검색을 열심히 해보다가 내린 결과는 현재 사용하는 가상환경의 파이썬 버전을 업그레이드 하는 것보다는
업그레이드한 파이썬으로 새로운 가상환경을 만드는 것이 더 나을 것이다.
따라서 아래 명령어를 사용해서 일단 현재 가상환경에서 탈출을 했다.
$ deactivate
다음에 아래 명령어들을 사용해서 python3.7을 설치하고 python3이 python3.7이 되게 했다.
$ sudo apt update -y $ sudo apt install python3.7 $ sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 1 $ sudo update-alternatives --config python3
가상환경 새로 만들기
이제 전에 했던 것처럼 가상환경을 새로 만들자
virtualenvwrapper를 새로 설치하고
$ sudo pip3 install virtualenvwrapper
기존에 ~/.bashrc에서 python3으로 가리키던 부분을 python3.7로 바꿔주어서 ~/.bashrc에 이제 아래의 내용이 들어있다.
export WORKON_HOME=$HOME/.virtualenvs export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3.7 export VIRTUALENVWRAPPER_VIRTUALENV_ARGS=' -p /usr/bin/python3.7 ' export PROJECT_HOME=$HOME/Devel source /usr/local/bin/virtualenvwrapper.sh
이제 가상환경을 만들면 된다
$ source ~/.bashrc $ mkvirtualenv new_django
이제 새로운 가상환경에서 django를 돌리기 위해 필요한 module들을 설치하면 된다
예를 들어서 본인은 아래의 module들을 설치했다.
pip3 install django pip3 install django-allauth pip3 install channels pip3 install PyMySQL
아파치 설정
정말 놀랍지 않게도 여전히 장고는 제대로 돌아가지 않을 것이다.
가상환경을 바꿨기 때문에 아파치 설정에서 사용한다고 명시된 가상환경을 바꿔주어야 한다.
아래와 비슷한 명령어로 아파치 설정해준 파일에 간다. (000-defaul.conf가 아니라 각자 사용하는 파일에 가면 된다)
sudo vim /etc/apache2/sites-available/000-default.conf
WSGIDaemonProcess 의 마지막 python-home이 가상환경을 가리키는 주소일텐데 이 주소를 새로 생성한 가상환경의 이름으로 바꿔주어햐 한다 !!
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined <Directory /home/dodo/project/django_project/photo/photo> <Files wsgi.py> Require all granted </Files> </Directory> WSGIDaemonProcess photo python-path=/home/dodo/project/django_project python-home=/home/dodo/.virtualenvs/new_django WSGIProcessGroup photo WSGIScriptAlias / /home/21300109/project/django_project/photo/photo/wsgi.py </VirtualHost>
자 이제 아파치를 아래 명령어로 restart해보면 정말 놀랍게도 아직도 되지 않는다는 것을 확인할 수 있다.
sudo service apache2 restart
이는 mod_wsgi를 업데이트 해줘야 하는 문제였다.
mod_wsgi 업그레이드
일단 현재 존재하는 mod_wsgi를 삭제하자
sudo apt remove libapache2-mod-wsgi
그리고 본인은 https://github.com/GrahamDumpleton/mod_wsgi/releases 에서 제일 최신버전의 파일을 아래의 명령어로 다운로드 했다 (장고 디렉토리 밖에서) .
wget https://github.com/GrahamDumpleton/mod_wsgi/archive/4.7.1.tar.gz tar xvfz 4.7.1.tar.gz
이제 압축을 푼 mod_wsgi 디렉토리 안에 들어갔다. 그리고
./configure --with-python=/usr/bin/python3.7 sudo apt-get install apache2-dev sudo apt-get install python3.7-dev make make install
wsgi.py path 설정
이 이후에도 안되서 아파치의 error.log를 확인하러 갔다.
vim /var/log/apache2/error.log
확인해보니까 wsgi.py 에서부터 시작해서 현재 사용하고 있는 프로젝트의 이름이 'photo'인데
ModuleNotFoundError: No module named 'photo'
이런 에러가 발생되었다.
wsgi.py 파일에 가서 현재 장고 파일을 향한 path를 설정해주었더니 비로소 서버에서 장고가 돌아가기 시작했다.
import os, sys from django.core.wsgi import get_wsgi_application sys.path.append('/home/dodo/project/my_project/photo') sys.path.append('/home/dodo/project/my_project/photo/photo’) os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'photo.settings') application = get_wsgi_application()
같은 문제가 있는 사람들은 많이 헤메지 않고 금방 해결할 수 있다면 좋겠다.
참고
https://dev.to/serhatteker/how-to-upgrade-to-python-3-7-on-ubuntu-18-04-18-10-5hab
https://medium.com/@garethbjohnson/serve-python-3-7-with-mod-wsgi-on-ubuntu-16-d9c7ab79e03a
'Web > Django' 카테고리의 다른 글
[Django] Django Channels 배포 서버에서 사용하기 (Apache) (0) 2020.09.06 [Django] webhook을 사용하여 잔디(JANDI)에 알림 보내기 (0) 2020.08.18 [Django] Google 계정으로 로그인하기 (로컬 서버 + 실제 서버) (0) 2020.08.05 [Django] Django와 MySQL 연동하기 (0) 2020.07.09 [Django] Ubuntu에서 Django + Apache2 연결하기 (0) 2020.07.07