drexqq

[Python] Flask, Gunicorn, Nginx로 EC2배포하기[1] 본문

Back-End/Python

[Python] Flask, Gunicorn, Nginx로 EC2배포하기[1]

drexqq 2022. 3. 16. 21:00
728x90
반응형

업무중에 새롭게 서버를 만들어야할 일이 있어서 기존에 사용하던 apahce를 버리고 Nginx를 사용하기로 했다.

 

지금까지의 구성은 

EC2(ubuntu 20.04), nginx(1.18.0), python3(3.8.10)를 서버에 올려서 사용하였고

추가적으로 호스팅을 위해서 AWS Route53을 사용하고 AWS상에서 ELB를 사용해서 SSL인증을 받는 방식으로 진행하였다.

추가적으로 mysql을 설치해서 사용할 예정이다.

 

일단 기존에 사용하던 스펙들이 아니여서 처음에 많이 갈팡질팡을 했지만 결국엔 여기저기 구글링을 통해 연결을 해둔상태이다.

 

하나씩 다시 생각해보면서 정리를 해보겠다.

 

1. EC2 인스턴스 생성 및 elastic IP연결

- 인스턴스 생성과 elastic IP연결하는 방법은

https://drexpp.tistory.com/entry/AWS-EC2-%ED%94%84%EB%A6%AC%ED%8B%B0%EC%96%B4-%EC%84%B8%ED%8C%85-%EB%B0%8F-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EC%83%9D%EC%84%B1

 

[AWS] EC2 프리티어 세팅 및 인스턴스 생성

1 . AWS접속 portal.aws.amazon.com/billing/signup#/start AWS Console - Signup portal.aws.amazon.com 위 사이트에 접속하여서 회원가입을 진행한다. 회원가입을 완료하게되면 해당 사이트 좌측에 작성된 것 처..

drexpp.tistory.com

이 글에 설명을 해두었다. 저 글은 프리티어를 기준으로 작성되었지만 인스턴스의 유형이 바뀌어도 달라지는건 없으니 보면 도움이 될 듯하다.

 

2. EC2에 접속 후 nginx와 python을 설치해준다

sudo apt-get update #패키지 리스트 최신화
sudo apt-get install -y nginx python3-pip python3.8-venv #nginx, pip(파이썬 패키지매니저), 가상환경 라이브러리 설치

3. 프로젝트 디렉토리생성 후 파이썬 가상환경 설치

mkdir ~/apiserver #프로젝트 디렉토리생성
python3 -m venv env #파이썬 가상환경 설치
source env/bin/activate #가상환경실행

#가상환경 내에서
pip install flask gunicorn #flask, gunicorn설치
#pip freeze명령어를 통해 설치된 패키지들을 확인할 수 있음

pip freeze > requirements.txt #패키지를 requirements.txt로 저장
vi app.py #app.py라는 이름으로 파이썬 파일을 하나 생성

3. app.py작성

from flask import Flask

app = Flask(__name__)

@app.route("/")
def index():
    return "Hi Flask Project"

if __name__ == "__main__":
    app.run()

4. 파이썬 프로젝트가 잘 실행되는지 확인

python3 app.py & #백그라운드로 파이썬 프로젝트 실행
curl localhost:5000 #플라스크 기본 포트로 확인

확인시 "Hi Flask Project"라는 문구가 나오는 것을 확인후 

ps -a | grep python3 #구동중인 프로세스중에 'python3'를 찾아서
kill -9 [PID] #python3를 종료시켜준다

 

5. gunicorn 세팅

# 현재 source /env/bin/activate를 통해 파이썬 가상환경에 있는 상태

gunicorn --bind 0.0.0.0:5000 wsgi:app #gunicorn을 통해 5000포트로 열어준다

그 후에 해당 ec2의 IP:5000에 접속을 하면 "Hi Flask Proejct"라는 글을 볼 수 있다.

 

잘 나온다면 deactivate명령어로 파이썬 가상환경을 일단 나와준 뒤 6번부터 다시 진행하면 된다.

 

6. socket과 service등록

 

root계정으로 접속을 하여서 /etc/systemd/system로 이동한다

 

apiserver.socket

[Unit]
Description=apiserver gunicorn socket

[Socket]
ListenStream=/run/apiserver.sock

[Install]
WantedBy=sockets.target

 

apiserver.service

[Unit]
Description=apiserver gunicorn daemon
Requires=apiserver.socket
After=network.target

[Service]
User=sunghlee
Group=www-data
WorkingDirectory=/home/sunghlee/apiserver
Environment="PATH=/home/sunghlee/apiserver/env/bin"
ExecStart=/home/sunghlee/apiserver/env/bin/gunicorn --workers 3 --bind unix:/run/apiserver.sock -m 007 wsgi:app

[Install]
WantedBy=multi-user.target

 

socket과 service를 모두 등록했다면 

 

# root계정상태

systemctl start apiserver.socket #소켓 시작
systemctl enable apiserver.socket #소켓 활성화

systemctl start apiserver.service #서비스 시작
systemctl enable apiserver.service #서비스 활성화

 

위 명령어로 socket과 service를 실행 및 활성화 시켜준다.

 

7. nginx설정

 

# root 계정상태

# 일단 /etc/nginx/sites-enabled에 있는 default파일을 지워준다
rm /etc/nginx/sites-enabled/default

# 그 후 /etc/nginx/sites-available에 파일을 하나 만들어준다
touch /etc/nginx/sites-available/apiserver

 

apiserver

server {
        listen 80;
        server_name _;

        location / {
                proxy_pass http://unix:/run/apiserver.sock;
        }
}

 

nginx설정파일을 다 작성했다면 심볼릭링크를 연결해준다

ln -s /etc/nginx/sites-available/apiserver /etc/nginx/sites-enabled/

# 심볼릭링크 연결후
nginx -t #nginx 문법 체크후 이상없다면
service nginx restart

모두 완료하였고 정상적으로 작동을 한다면 ec2의 IP에 접속을 한다면 5000번 포트에서 보던것과 같이
"Hi Flask Project"가 보일 것이다 !

 

다음 글에서는 route53으로 호스팅하는 방법과 elb를 사용하여 ssl인증을 받는 방법을 써보겠다 끘

728x90
반응형
Comments