전체적인 흐름을 먼저 잡고가자면
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
방화벽 설정
sudo ufw allow {applications}
방화벽 상태 확인
sudo ufw status
0.3 웹 서버 확인하기
nginx가 설치되면 자동으로 실행되지만 그래도 상태 확인해주기
systemctl status nginx
만약 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하게 잘 돌아가고 있으면 성공!
'Dev' 카테고리의 다른 글
[Linux] Failed to initialize NVML: Driver/library version mismatch 에러 해결 (1) | 2023.11.08 |
---|---|
[Linux] Flask 앱 배포 - Nginx 와 Gunicorn 사용하기 (2) (0) | 2023.08.25 |
[Linux] 파일 및 디렉토리(directory) 용량 확인하기 (0) | 2023.07.27 |
[Linux] 압축(tar, tar.gz, tar.xz) 및 압축 풀기 (0) | 2023.07.17 |
[Linux] 파일 해시(hash) 값 추출하기 (0) | 2023.07.17 |