ec2 Ubuntu 18.04 python 버전 변경하기 with apache,django

문석·2021년 8월 15일
1

😇 실서버의 python 버전을 변경할 일이 생겼다.

가장 큰 이유는 python3.5 버전의 django-redis library 와 fstring 미지원. 그래서 python3.8로 버전 변경을 하기로 했다.

오류없이 무중단으로 교체를 하기위해

  • 실서버의 AMI 생성
  • 생성한 AMI를 시작하여 작업
  • 버전 변경 완료 후 ELB target group 변경
    의 순서로 진행하기로 했다.

일단 서버에 python3.8 버전이 없기에 설치부터 해줘야한다.

sudo apt install python3.8

그리고 기존에 python3.5 excute somthing 과 같이 버전을 명시한 커맨드가 아닌 python excute something 과 같이 default python 버전으로 실행되는 스크립트의 혹시 모를 버전 충돌을 방지하기 위해 ubuntu 디폴트 python 버전을 python3.8로 교체한다.

sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.8 100 

마지막의 100은 해당 숫자가 클 수록 해당 버전에 우선순위를 부여한다는 느낌이고 100으로 설정한다면 1,2,3,13,14 등의 숫자보다 크기에 우선순위가 될거다. 해당 서버에는 100 이상의 alternatives가 존재하지 않아 이제 python 을 입력하면 python3.8 로 실행된다. 물론 가상환경에서 실행되기에 버전이 충돌할 케이스가 생기면 안되지만 혹시 모르니 설정.

sudo apt install python3.8-distutils

이후 pip 설치를 위해 필요한 패키지다. 설치해두자.
pip에도 버전이 있기에 신경써줘야 한다. 새로운 가상환경을 생성하지만 pip은 별도로 설치하기 위해 옵션을 부여하여 가상환경을 생성하고 실행시키자.

python -m venv venv_3.8 --without-pip
source venv_3.8/bin/activate

이제 해당 버전에 맞는 pip을 설치해보자

curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py

이제 가상환경 내부에서의 pip은 pip3.8로 실행된다. 혹시 pip이 구버전으로 작동한다면 버전을 명시하여 pip을 사용해보자

pip3.8 install -r requirements.txt
or
pip install -r requirements.txt

우리는 Apache2를 사용하고 있고 apache 는 django의 wsgi.py 를 바라본다. 그렇기에 몇가지 설정을 해주어야 하는데

project/wsgi.py 의 venv 디렉토리를 새로 생성한 venv_3.8 로 변경
/etc/apache2/apache2.conf의 venv path 변경

거의 다 끝났지만 한 가지가 더 필요하다. 기존에는 python webserver 실행을 위한 mod_wsgi가 기존 python 버전으로 컴파일 되어있다. 이를 3.8버전으로 변경해 주어야한다. 이를 위한 패키지를 설치해보자

sudo apt-get install apache2-dev
sudo apt-get install python3.8-dev

mod_wsgi 를 컴파일 할 수 있는 패키지를 설치하고 압축해제 해보자.

wget https://github.com/GrahamDumpleton/mod_wsgi/archive/4.7.1.tar.gz
tar xvfz 4.7.1.tar.gz

압축해제한 디렉토리에 들어가서 python 버전을 설정해주자.

cd mod_wsgi-4.7.1
./configure --with-python=/usr/bin/python3.8

컴파일 해준다.

make
sudo make install

이제 apache 서비스를 재시작 해주자. 잘되지 않는다면 관련 로그들을 꼼꼼히 살펴 기존 버전의 python이 실행되는 것은 아닌지 확인하고 다시 프로세스를 진행해주자.

추가로 권한 문제로 상기 명령어들이 실행되지 않아 sudo를 사용할 때는 주의해주자. pip 관련해서 나중에 심각하게 꼬일 수가 있다.

이제 기존 로드밸런스의 타겟그룹에 새로운 인스턴스를 등록, 기존에 있는 인스턴스를 삭제해주면 된다.
👌👌👌

0개의 댓글