서버 배포하기 Step by Step

가람·2021년 10월 28일
0

AWS를 이용해 Flask앱을 배포하는 과정의 기록입니다.

1. AWS에 계정을 만들고 인스턴스를 생성해줍니다.

사용할 리눅스 버전은 Ubuntu 20.04입니다.


우분투의 버전은 여러가지가 있는데, 정식출시 "연도.월" 식으로 되어있습니다.
20.04 버전의 경우 2020년 04월에 출시된 우분투 버전입니다.
그리고 버전을 살펴보다 보면 LTS ( Long Term Support ) 버전이 있는데, 지원기간이 8~10년으로 긴 버전들 입니다.
16.04, 18.04, 20.04 가 이에 해당하며 2년마다 출시하는 것을 알 수 있습니다.
LTS 버전이 아닌 것들은 지원기간이 9개월 정도 입니다.
LTS 버전 중 최신버전인 20.04 버전을 설치했습니다.

2. AWS 인스턴스에 탄력적 IP를 추가해줍니다.

AWS 인스턴스에서 기본 제공해주는 IP는 동적 IP입니다.
인스턴스를 중지하고 다시 실행시키면 IP가 변경되는 문제점이 있습니다.
탄력적 IP ( Elastic IP, EIP )를 사용하면 고정된 IP주소가 생성되어 이런 문제를 해결할 수 있습니다.
EC2 - 네트워크 및 보안 - 탄력적IP 에서 "탄력적 IP 주소 할당"에서 지역에 맞는 IP를 할당합니다.
EIP 주소 목록에서 방금 생성한 IP를 눌러 "탄력적 IP 주소 연결"을 누르면 인스턴스를 연결 할 수 있습니다.
원하는 인스턴스에 EIP를 연결하면 해당 EIP로 인스턴스에 접근할 수 있습니다.

3. 해당 인스턴스를 SSH로 접속합니다.

PUTTY 를 이용해서 해당 인스턴스에 접속합니다.

접속을 위해서는 인스턴스-보안 에서 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로 선택해줍니다.

4. 서버 설정에 필요한 패키지들을 설치합니다.

4.1. apache 웹 서버 설치

아파치 웹 서버는 점유율 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-availablemods-enabled 디렉토리가 생기는데, mods-available에는 활성화 가능한 모듈들이 mods-enabled에는 활성화 된 모듈들이 들어있습니다.

rewrite : URL 주소 수정등의 설정을 할 수 있는 모듈입니다.


sudo service apache2 restart

설정을 적용하기위해 아파치서버를 재실행 해줍니다.

sudo service apache2 status

현재 아파치 실행상태를 확인합니다.


4.2. 필요한 라이브러리 설치

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 : 로그인 기능(세션,쿠키)을 위한 패키지


4.3. 서버 기본 설정

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 설치

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)

5. 호스팅 설정하기

AWS에서 도메인을 구매했다면 Route53 탭 - 호스팅영역 에서 도메인과 EIP를 연결할 수 있습니다.

6. 추가설정

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

profile
hello world :)

0개의 댓글