본문 바로가기

Dev

[Linux] Flask 앱 배포 - Nginx 와 Gunicorn 사용하기 (1)

전체적인 흐름을 먼저 잡고가자면

1. 내가 배포하려고 하는 앱 : Flask app

2. 웹 서버 : Nginx

3. 앱과 웹 서버를 연결하는 미들웨어 : Gunicorn

 

클라이언트로 부터 요청이 들어올 때

client request → nginx : web proxy server → gunicorn : application server → flask app

 

서버가 응답 할 때

flask app → gunicorn : application server → nginx : web proxy server → client

 


0. Nginx

 

유용하게 쓰는 명렁어

 

# nginx 시작하기
sudo systemctl start nginx 

# nginx 멈추기
sudo systemctl stop nginx

# nginx 재시작
sudo systemctl restart nginx

# 연결 끊지 않고 수정사항만 적용시키기
sudo systemctl reload nginx

# 서버가 부팅되면 nginx가 자동으로 시작되는 옵션 끄기
sudo systemctl disable nginx

# 서버가 부팅되면 nginx가 자동으로 시작되는 옵션 켜기
sudo systemctl enable nginx

 

 

0.1 Nginx 설치하기

 

sudo apt update
sudo apt install nginx

 

0.2 방화벽 설정하기

 

설정 가능한 방화벽 확인

 

sudo ufw app list

 

Full 은 HTTP와 HTTPS 모두 허용

 

방화벽 설정

 

sudo ufw allow {applications}

 

방화벽 상태 확인

 

sudo ufw status

 

0.3 웹 서버 확인하기

 

nginx가 설치되면 자동으로 실행되지만 그래도 상태 확인해주기

 

systemctl status nginx

 

active

 

만약 inactive 상태로 나온다면 active 시켜준다

 

sudo ufw enable

 

1. Gunicorn & Flask

 

1.1 의존 패키지 설치

 

sudo apt update
sudo apt install python3-pip python3-dev build-essential libssl-dev libffi-dev python3-setuptools

sudo apt install python3-venv
sudo apt-get install curl

sudo nano ~/.bashrc

# 해당 줄 추가
alias pip=pip3

# 저장 후 적용
source ~/.bashrc

 

1.2 가상환경 설치 및 접속

 

# 작업 경로로 이동
python -m venv flaskvenv
source flaskvenv/bin/activate

 

이제부터 가상환경 내에서 작업

필요한 패키지들을 설치해준다

 

1.3 Gunicorn 과 Flask 설치하기

 

pip install wheel
pip install gunicorn flask
pip install requests flask_executor

 

1.4 Entry Point 파일 생성

 

만들어둔 app 을 import 시킬 wsgi.py 파일을 만든다

 

from projects import app

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

 

실행되는지 체크

 

gunicorn wsgi:app

 

실행

 

에러 없이 돌아가면 성공

 

1.5 Service 파일 생성

 

가상환경 종료 후 진행

 

#가상환경 종료
deactivate

 

/etc/systemd/system/ 디렉토리 내에 /etc/systemd/system/flaskrest.service 파일 생성

 

sudo nano /etc/systemd/system/flaskrest.service

 

여기서 편집하는 것 보다 아래 방법이 더 편하다

 

생성 후 안에서 편집해도 되지만 flaskrest.service 파일을 만들어서 /etc/systemd/system/안에 copy 하여 써도 무방

 

[Unit]
Description=Gunicorn instance to serve flask application
After=network.target

[Service]
User=ss3080
Group=www-data
WorkingDirectory=/work/web/dev
Environment="PATH=/work/web/dev/flaskvenv/bin"
ExecStart=/work/web/dev/flaskvenv/bin/gunicorn --access-logfile /work/web/dev/access.log --error-logfile /work/web/dev/error.log --config gunicorn_config.py wsgi:app

[Install]
WantedBy=multi-user.target

 

생성 후 copy

 

sudo cp flaskrest.service /etc/systemd/system/flaskrest.service

 

시작 및 symlink 만들기

 

sudo systemctl start flaskrest.service
sudo systemctl enable flaskrest.service

 

Created symlink 라는 메세지 뜨면 성공

 

1.6 gunicorn_config.py 파일 생성

 

필요한 config 내용을 담은 파일

 

import multiprocessing

workers = 4
bind = '0.0.0.0:7561'

reload = False
timeout = 300

#logging
accesslog = "/work/web/dev/access.log"
erorlog = "/work/web/dev/error.log"

 

1.7 실행 확인

 

sudo systemctl status flaskrest.service

 

에러가 난다면 restart 한 후 status 확인

 

sudo systemctl restart flaskrest.service

 

예쁜 형광색

 

active하게 잘 돌아가고 있으면 성공!