본문 바로가기

만들고 싶은거 만들기

광고 수익을 창출할 웹사이트 만들어보기 3-5(EC2 서버에 Python 최신버전 설치 Flask 서버 배포준비)

지난편에서까지 탄력이 토끼푸딩 같은 EC2서버를 빌려보았다.

 

 

좋다.

이번편엔 빌린 EC2서버에 내 플라스크 백앤드로직을 배포해보겠다.

 

빠로시작.


 

일단 플라스크를 배포할수있게 필요한 소프트웨어 설치가 먼저다.

당연 파이썬이 설치되어야 한다.

리눅스 환경에서 파이썬설치를 먼저 아래 명령어로 해주자.

sudo yum update -y
sudo yum install python3 python3-pip -y

 

그럼 이렇게 나온다.

무슨뜻이냐면 이미 설치 완료되어있다는 뜻이다.

그게 뭘 의미하냐면

 

AWS에서 빌린 EC2 리눅스2 서버의 경우

Python 3과 pip가 이미 설치되어 있으며 최신 버전으로 유지

 

되고 있다는 뜻이다.

Good 이다.


이제 그 다음은 기존에 CORS에 적용되어있는 localhost를 버셸에 배포된 url로 바꿔주는 작업이 필요하다.

url도 웬만하면 배포되지 않는 편이 좋으니 .env로 따로 빼서 관리하겠다.

 

일단 .env에 Vercel URL을 아래와 같이 추가해준다.

CORS_ORIGIN=<Vercel URL>

 

app.py부분에서는 기존에 하드코딩 되어있던 localhost부분을 아래와 같이 바꿔준다.

CORS(app, resources={r"/generate": {"origins": os.getenv("CORS_ORIGIN")}})

 

그리고 app을 실행하는 마지막부분인 app.run에 host와 포트를 허용해준다.

if __name__ == "__main__":
    app.run(debug=DEBUG_MODE, host='0.0.0.0', port=5000)

 

이 정도면 배포하는데 무리는 없을 것 같다.

 

하지만 배포하기 전 기존에 pip install했던 수 많은 라이브러리를 다시 리눅스에 설치해야 되는 과정이 필요한데....

 

이부분은 requirements.txt 를 사용해 쉽게 관리할 수 있다.

이전에 만들기만 해놨던  requirements.txt가 있거나 없으면 생성한 뒤 아래 명령어를 입력해보자.

pip freeze > requirements.txt

 

그리고 requirements.txt를 확인해보면 ?

뭔가 잔뜩 만들어져있다.

 

이걸 활용해서 EC2서버에서 간단하게 한번의 명령어로 내가 필요한 패키지를 설치할 수 있다.

바로 하러가보자.

 

requirements.txt 파일을 리눅스서버로 옮긴 후 임의의 경로에 두고 아래 명령어 한줄 입력하면 된다.

sudo pip3 install -r requirements.txt

입력해보면 바로 에러 발생한다.

 

파이썬버전과 패키지버전이 호환되지 않기 때문인데....

버전 체크해보니 2.7.18이다.....

 

개발환경의 파이썬버전은 Python 3.12.6 이므로 파이썬 업그레이드부터 먼저 해주자.

 

(여기부턴 맨땅에 헤딩 과정이니 만약 누군가 따라한다면 이 부분은 괜히 따라하지말고 좀 더 좋은 방법을 찾으세요!)


 

Python 3.12.6 설치를 위한 필수 패키지 설치 먼저 진행해 줘야 한다.

sudo yum groupinstall "Development Tools" -y
sudo yum install gcc libffi-devel bzip2 bzip2-devel zlib-devel xz-devel wget sqlite-devel openssl-devel -y

 

  • gcc: C/C++ 코드를 컴파일하기 위한 컴파일러입니다.
  • libffi-devel: 다른 언어의 함수를 호출할 수 있게 해주는 라이브러리의 개발 도구입니다.
  • bzip2: 데이터를 압축하거나 압축 해제하는 도구입니다.
  • bzip2-devel: bzip2를 사용하는 프로그램 개발에 필요한 파일을 제공합니다.
  • zlib-devel: 데이터 압축을 지원하는 zlib의 개발 도구입니다.
  • xz-devel: xz 압축 알고리즘 관련 개발 파일을 제공합니다.
  • wget: 인터넷에서 파일을 다운로드할 수 있는 명령줄 도구입니다.
  • sqlite-devel: SQLite 데이터베이스를 사용하는 개발에 필요한 파일을 제공합니다.
  • openssl-devel: 암호화와 보안을 위한 OpenSSL 라이브러리의 개발 도구입니다.

파이썬 설치 시 필요한 패키지정보는 위와 같다.

 

다음은 Python 3.12.6 소스 코드 다운로드이다.

/usr/src 경로로 이동해서 아래 명령어를 입력해준다.

sudo wget https://www.python.org/ftp/python/3.12.6/Python-3.12.6.tgz

 

다운로드가 완료되었다.

tgz형식으로 다운로드 되기 때문에 압축을 풀어준다.

sudo tar xzf Python-3.12.6.tgz

압축이 해제되면 해제된 디렉토리에 접근해 아래 명령어로 빌드 및 설치한다.

 

일단 아래 명령어로 빌드를 준비해 준뒤

sudo ./configure --enable-optimizations

하면 뭐가 잔뜩 체킹 될텐데 기다린 후 완료되면 아래 명령어로 실제 빌드 및 설치한다.

sudo make altinstall

 

  • altinstall을 사용하는 이유는 기존의 기본 python3 바이너리를 덮어쓰지 않기 위해서입니다.
  • 설치가 완료되면 /usr/local/bin/python3.12에 바이너리가 생성됩니다.

설치에는 시간이 좀 소요된다. 체감상 한 10분?

기다리다 보면 Successfully 라고 기분 좋은 초록색이 보인다.

python3.12 --version

 

버전도 잘 표기 된다.

하지만 python --version 명령어로 확인하면 이전버전이 표시 된다.

python3 --version

찾아보니 python3 명령어로 버전을 확인해야 3이 나온다.

python3은 3.7로 설치되어 있지만 나는 3.12.6을 원한다.

 

기본 Python3 명령어가 Python 3.12.6을 가리키도록 변경하려면 다음을 실행하면 된다.

sudo alternatives --install /usr/bin/python3 python3 /usr/local/bin/python3.12 1
sudo alternatives --config python3

 

이후 python3으로 버전 체크해보면 이제 3.12.6이 잘 표시된다.

 

다음으로는 Python 3.12.6과 함께 최신 pip를 설치한다.

sudo python3 -m ensurepip
sudo python3 -m pip install --upgrade pip

이번엔 다른 에러가 발생했다.

 

출력된 내용을 보면 Python 3.12.6 설치는 완료되었지만,

SSL 모듈이 제대로 작동하지 않아 HTTPS를 통한 pip 작업이 실패하고 있다고 한다.

SSL 모듈이 없으면 Python 패키지를 설치하거나 업데이트하는 데 문제가 발생할 수 있으므로, 이를 해결해야 한다고 한다.

 

망했다. 다시 처음부터 한다. 

Python 빌드 전에 필요한 SSL 관련 라이브러리를 설치한다.

sudo yum install gcc libffi-devel bzip2 bzip2-devel zlib-devel xz-devel wget sqlite-devel openssl openssl-devel -y

 

SSL 모듈을 포함하도록 Python을 다시 빌드해야 한다고 한다.

cd /usr/src/Python-3.12.6
sudo make clean

 

위 디렉토리로 이동해서 clean 명령어로 이전에 빌드된 파일을 삭제한다.

그 후 아래 명령어로  SSL 지원을 포함하도록 Python을 재구성한다.

sudo ./configure --enable-optimizations

 

이 후 아래 명령어로 다시 빌드 및 설치를 한다.... ㅠㅠ (다시 10분 유튜브 보고옴)

sudo make altinstall

 

이제 Python 설치가 완료되면 SSL 모듈이 제대로 작동하는지 확인한다.

그래도 안된다.....

 

하는수없이 기존 openSSL은 뒤로하고

 

requirements.txt에서 필요없는 라이브러리는 다빼고 내가 import한 것 관련해서만 패키지를 설치해볼 예정이다. 

/emoji-gen 경로에  requirements.txt 내용을 수정해준다.

Flask==3.1.0
Flask-Cors==5.0.0
python-dotenv==1.0.1
openai==0.27.8

 

이번엔 안전하게 /emoji-gen경로에 가상환경을 만들어 실행해준다.

sudo python3 -m venv venv
source venv/bin/activate

앞에 (venv)가 보이면 가상환경이다.

 

그래도 안된다!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

아무것도 안되니 그냥 openSSL을 업그레이드 해 봐야겠따.

 

빠르게 기존 빌드 지워준다.

cd /usr/src/Python-3.12.6
sudo make clean

 

OpenSSL 소스 다운로드 및 설치를 진행한다.

cd /usr/local/src
sudo wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz
sudo tar -xvzf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w
sudo ./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl
sudo make
sudo make install

 

이 후 설치가 잘 되었는지 아래 명령어로 확인한다.

/usr/local/openssl/bin/openssl version

 

설치가 완료되었다.

 

이제 다시 Python을 빌드 해주는데 OpenSSL 경로를 명시적으로 지정해서 구성해보겠다.(진짜 이번엔 되라...)

cd /usr/src/Python-3.12.6
sudo ./configure --enable-optimizations --with-openssl=/usr/local/openssl

 

설치되는데 이상하게 엄청 오래걸렸따. 한 30분 걸린듯

 

이 후 모듈테스트 시 이번엔 이상없이 잘나온다!!!!!!!!!!!!!

import ssl
print(ssl.OPENSSL_VERSION)

 

드디어 다음단계로 넘어갈수 있다.


pip 업그레이드 및 설치 를 진행해보자.

/usr/local/bin/python3.12 -m ensurepip
/usr/local/bin/python3.12 -m pip install --upgrade pip

명령어 입력 후 인스톨에 성공했다는 문구를 확인할 수 있다.

 

설치 전 venv 디렉토리의 사용권한을 변경해주자.

sudo chown -R $(whoami):$(whoami) /emoji-gen/venv
sudo chmod -R u+w /emoji-gen/venv

 

이제 드디어 가상환경에 진입해서 관련패키지를 설치할 수 있게 되었다.

cd /emoji-gen/
source venv/bin/activate

 

위 명령어로 진입 한 후 (venv)가 있는지 확인하고 install 명령어로 패키지 설치를 진행한다.

pip install -r requirements.txt

 

드디어 설치가 완료되었따.

(멀고도 험난했다.)

 

이제 패키지 설치도 끝났으니 드디어 배포로 넘어갈 차례다.


배포는 다음편에 하겠다.

너무 힘들다........................

 

쪼금쉬고..... 다음편에끼숙.......