[우분투] Flask + Gunicorn + Nginx 연결 (flask 프로젝트 구조)

2022. 05 
지금까지 virtualenv를 사용했었는데
좀더 편하게 가상환경을 구축하고 쉽게 의존성 패키지들을 관리하고
dev용 패키지도 따로 쉽게 관리하고 싶어서
pipenv를 사용하다보니
git 도 신경써야되고..

그러다보니 기존에 야매처럼 하던 flask project 폴더 구조로는 힘들었다.

새롭게 공부하다가 이제 결정하게 된 flask project 구조를 먼저 확인해보자

project_root/
├── app/
│   ├── __init__.py
│   ├── db.py
│   ├── auth.py
│   ├── blog.py
│   ├── templates/
│   │   ├── base.html
│   │   ├── auth/
│   │   │   ├── login.html
│   │   │   └── register.html
│   │   └── blog/
│   │       ├── create.html
│   │       ├── index.html
│   │       └── update.html
│   └── static/
│       └── style.css
├── Pipfile
├── Pipfile.lock
├── .env
└── .gitignore

나의 프로젝트 구조와 완전 같은건 아니지만 대략 이런형식이라는것만 알아두자.

중요한건 Pipfile  .env  .gitignore 위치이다. 

이렇게 하면 실제 flask는 프로젝트 루트 폴더내에 별도의 폴더안에 들어가게 된다.
-----------------------------------------------------------------------------------------------

Django를 공부하다가 
Django는 너무 복잡하니까

Flask로 웹 프레임워크의 기본 개념을 잡고 가자는 생각에 Flask 도전

WSGI로 uwsgi랑 gunicorn 중에서 
uwsgi는 저번에 해봤으니 (링크) 이번엔 gunicorn으로 도전
더 간편하면서도 성능상으로는 비슷하다고 한다.

그리고 Gunicorn측에서은 Nginx를 강력히 추천한다.
Gunicorn 공식홈페이지에서 nginx와 연결방법에 대해 그닥 자세히 나와있지 않다..

저번 uwsgi 셋업할때도 그랬지만
WSGI와 웹서버(Nginx)를 연결하는 방식에는 웹포트방식과 유닉스소켓방식이 있다.
둘다 방식에는 큰 차이가 없지만
유닉스소켓방식이 좀더 신뢰성이 높다고 한다.
웹포트방식은 nginx없이도 웹서비스가 가능하지만 그닥 추천은 하지 않는다.

그래서 이왕하는거 유닉스소켓방식으로 하기로 했다.


기본적인 프로그램들 설치
pip install gunicorn
apt install nginx

gunicorn 서비스 등록을 해서 우분투 재시작시 자동으로 실행되게 하자

[/etc/systemd/system/gunicorn.service]

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=ubuntu
Group=ubuntu
WorkingDirectory=/path/to/project/root/
ExecStart=/usr/bin/pipenv run gunicorn \
	--bind unix:/home/ubuntu/gunicorn.sock \
	--workers 3 \
	--threads 3 \ # 부하가 걸리면 thread는 없애는것도 괜찮다.
        --worker-class gthread \  # 비동기 워커를 이용해 502 에러 최소화
	app:create_app()
[Install]
WantedBy=multi-user.target


systemctl daemon-reload    #서비스데몬 리로드

systemctl enable --now gunicorn.service    #서비스데몬 등록



nginx site-available 에 새로운 파일을 생성

[/etc/nginx/sites-available/mysite]

server {
        listen 80;
        server_name your_domain.com;

        #location = /favicon.ico { access_log off; log_not_found off; }        access_log     /var/log/nginx/gunicorn-access.log;        error_log     /var/log/nginx/gunicorn-error.log;

        location /static {
                alias /path/to/project/root/app/static;
        }

        location / {
                include proxy_params;
                proxy_pass http://unix:/home/ubuntu/gunicorn.sock;
        }
}


static 폴더는 따로 지정해줘야 한다. Gunicorn이 static은 관리하지 못한다.


그리고 이 file을 sites-enabled폴더에 심볼릭 링크를 건다.

나머지 심볼릭 링크파일은 삭제해주자. 


이러고 난뒤에 nginx 재시작

systemctl restart nginx

이제 해당 아이피로 접속해보자. 

물론 flask 어플리케이션이 이미 작성되어 있어야한다.


** 경로와 사용자이름 같은 세세한 것들은 자신의 환경에 맞추어 변경해줘야 한다. 

** flask app이 애플리케이션 팩토리 방식으로 작성되어 있는 기준으로 설명하였다.

No comments:

Post a Comment