AWS를 이용해 Flask앱을 배포하는 과정의 기록입니다.
우분투의 버전은 여러가지가 있는데, 정식출시 "연도.월" 식으로 되어있습니다.
20.04 버전의 경우 2020년 04월에 출시된 우분투 버전입니다.
그리고 버전을 살펴보다 보면 LTS ( Long Term Support ) 버전이 있는데, 지원기간이 8~10년으로 긴 버전들 입니다.
16.04, 18.04, 20.04 가 이에 해당하며 2년마다 출시하는 것을 알 수 있습니다.
LTS 버전이 아닌 것들은 지원기간이 9개월 정도 입니다.
LTS 버전 중 최신버전인 20.04 버전을 설치했습니다.
AWS 인스턴스에서 기본 제공해주는 IP는 동적 IP입니다.
인스턴스를 중지하고 다시 실행시키면 IP가 변경되는 문제점이 있습니다.
탄력적 IP ( Elastic IP, EIP )를 사용하면 고정된 IP주소가 생성되어 이런 문제를 해결할 수 있습니다.
EC2 - 네트워크 및 보안 - 탄력적IP 에서 "탄력적 IP 주소 할당"에서 지역에 맞는 IP를 할당합니다.
EIP 주소 목록에서 방금 생성한 IP를 눌러 "탄력적 IP 주소 연결"을 누르면 인스턴스를 연결 할 수 있습니다.
원하는 인스턴스에 EIP를 연결하면 해당 EIP로 인스턴스에 접근할 수 있습니다.
접속을 위해서는 인스턴스-보안 에서 SSH 연결 설정을 해줘야합니다.
그 뒤, Host Name은 "ubuntu@[퍼블릭 IPv4 DNS]" 로 설정합니다. (ex. ubuntu@ec2-15-xxx-xxx-xxx.ap-northeast-2.compute.amazonaws.com )
인스턴스에 설정된 private key 인 .pem을 .ppk 로 바꾸고 PUTTY의 connection - SSH - Auth에서 Browse로 선택해줍니다.
아파치 웹 서버는 점유율 1위(23.92%, 2위는 엔진엑스 20.45%)의 웹 소프트웨어로 98년부터 사용되어 왔습니다.
아래 코드를 입력해 apache2 웹 서버를 설치할 수 있습니다.
sudo apt-get update
sudo apt-get install apache2 apache2-dev python3-pip
sudo a2enmod rewrite
sudo service apache2 restart
해당 코드에 대한 설명은 아래와 같습니다.
sudo apt-get update
sudo : superuser do, 슈퍼유저 권한으로 다음 명령을 실행합니다.
apt-get : Advanced Packaging Tool, apt는 우분투에서 패키지를 관리하는 툴입니다. apt-get 명령은 apt로도 사용할 수 있는데 apt-get이 더 많은 옵션들을 가지고 있습니다.
sudo apt-get update : 사용 가능한 패키지들과 그 버전 정보를 업데이트 하는 명령
sudo apt-get upgrade
(참고) 설치 되어 있는 pakage들을 최신버전으로 upgrade 합니다.
sudo apt-get install apache2 apache2-dev python3-pip
sudo apt-get install [패키지명] : 패키지를 설치할 때 사용하는 명령
아파치2를 설치해줍니다.
아파치2 http 서버를 설치합니다.
python3 패키지 설치를 위해 pip을 설치합니다.
sudo a2enmod rewrite
a2enmod : apache2 enable module, 아파치의 모듈을 활성화 시킵니다.
sudo an2dismod [module name]
apach2 disable module, 아파치의 모듈을 비활성화 시킵니다.
etc/apache2/ 디렉토리에 mods-available과 mods-enabled 디렉토리가 생기는데, mods-available에는 활성화 가능한 모듈들이 mods-enabled에는 활성화 된 모듈들이 들어있습니다.
rewrite : URL 주소 수정등의 설정을 할 수 있는 모듈입니다.
sudo service apache2 restart
설정을 적용하기위해 아파치서버를 재실행 해줍니다.
sudo service apache2 status
현재 아파치 실행상태를 확인합니다.
sudo pip install mod_wsgi
sudo pip3 install flask flask_cors flask_login
mod_wsgi : Django, Flask 같은 python 스크립트를 배포하기 위해 필요한 패키지
flask : Flask 웹 프레임워크
flask_cors : 다른 ip주소 에서 api 호출을 위한 패키지
flask_login : 로그인 기능(세션,쿠키)을 위한 패키지
sudo vi /etc/apache2/sites-available/000-default.conf
sudo vi /etc/apache2/ports.conf
위 두가지 configuration을 설정해줘야 합니다.
flask 앱에서 8080포트를 사용한다고 하면, 해당 포트를 연결해줘야 합니다.
000-default.conf
<VirtualHost :80> ~ </ VirtualHost> 구문으로 이뤄져 있습니다.
8080포트를 추가하기 위해서는 추가로 <VirtualHost :8080> ~ </ VirtualHost>을 작성해줍니다.
<VirtualHost *:8080>
ServerAdmin garam3k@gmail.com
DocumentRoot www/sample
ServerName host.example.com
ErrorLog "logs/host.example.com-error_log"
</ VirtualHost>
ServerAdmin : 클라이언트에 노출될 관리자 연락처를 기입합니다.
DocumentRoot : 기본문서 디렉토리를 설정합니다.
www/sample/index.html 가 기본으로 제공합니다.
ServerName 서버 식별을 위한 이름을 저장합니다.
ErrorLog : 서버의 오류를 저장할 파일입니다.
ports.conf
Listen 80
Listen 8080 을 추가해줍니다.
anaconda를 설치합니다.
https://www.anaconda.com/products/individual 에 접속해서 linux 버전 (x86)installer 링크 주소를 복사합니다.
(현재 : https://repo.anaconda.com/archive/Anaconda3-2021.05-Linux-x86_64.sh)
wget으로 설치합니다
wget https://repo.anaconda.com/archive/Anaconda3-2021.05-Linux-x86_64.sh
wget : 웹 상의 파일을 다운로드 받을때 사용하는 명령어
sudo bash Anaconda3-2021.05-Linux-x86_64.sh
bash : 쉘 파일(.sh)을 실행하는 명령어, zsh, bash 등의 종류가 있습니다.
약관을 읽는 과정이있는데 q를 눌러서 나올 수 있습니다.
/home/ubuntu/anaconda3 디렉토리에 설치해줍니다.
설치 후 용량을 위해 .sh 파일은 제거해줍니다 (rm A~~.sh)
AWS에서 도메인을 구매했다면 Route53 탭 - 호스팅영역 에서 도메인과 EIP를 연결할 수 있습니다.
SSH가 끊어진 상태에서도 Flask 앱을 실행시키기 위해서는 백그라운드 실행을 해야합니다.
sudo python3 flask_app.py
'Ctrl+Z'
bg
disown -h
sudo python3 ~.py : 서버를 실행하고
Ctrl+Z : 프로세스를 중지합니다.
bg : 백그라운드에서 서버를 다시 구동합니다.
disown -h : 소유권 포기하기
이 경우, stdout 기능을 사용할 수 없으므로 print문을 모두 주석처리 해줘야 오류가 나지 않습니다. (IOError: [Errno 5] Input/output error 등의 에러가 발생)
References
https://dev.plusblog.co.kr/22
https://blog.outsider.ne.kr/346
https://zetawiki.com/wiki/%EB%A6%AC%EB%88%85%EC%8A%A4_a2enmod,_a2dismod
https://blog.cafe24.com/1927
https://ndb796.tistory.com/244
https://websetnet.net/ko/how-to-run-python-scripts-with-apache-and-mod_wsgi-on-ubuntu-18-04/
https://hiseon.me/server/apache-rewrite-examples/
https://www.woobi.net/board2/4315
https://wnw1005.tistory.com/454
https://blog.naver.com/PostView.nhn?isHttpsRedirect=true&blogId=dydaossla18&logNo=220973410449&parentCategoryNo=&categoryNo=16&viewDate=&isShowPopularPosts=false&from=postView
https://velog.io/@jakeseo_me/nohup-disown-%EB%8A%94-%EC%96%B8%EC%A0%9C-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%8D%A8%EC%95%BC%EB%90%A0%EA%B9%8C-9fjv7q9bz8