linux

[Ubuntu] Flask / Django 등을 서비스로 등록하자

끼발자 2022. 7. 28. 14:56
반응형

Python으로 웹 개발을 진행하면 그런 생각이 든다.

nohup으로 상용 배포하면 안될까?

답은 <안된다> 란다.

https://dailyheumsi.tistory.com/21 

위의 링크에 설명되어있다.

간략하게 설명하자면.... 보안상의 이슈때문이란다. 

그래서 작성해보는 서비스 등록하는 방법.!

flask나 django 모두 gunicorn 이라는 middleware를 통해서 서비스 할 수 있다.

더보기

나는 지유니콘 이라고 발음하는데 어디는 구니콘이라고도 발음하더라.

이미 지-유니콘이 입에 붙어서 구니콘이 어색하지만 뭐 읽는사람 마음

그럼 일단 gunicorn을 설치해야하는데,

pip install gunicorn <<

간단하게 설치하자.

만약 conda 환경에서 작업하고, 프로젝트또한 conda 가상환경에서 작동한다면, 해당 conda 에서 gunicorn을 설치해야한다.

그 다음은 wsgi.py 파일을 생성해야하는데,

우선, django는 프로젝트를 생성할 때 기본적으로 wsgi라는 파일이 생성된다.

python manage.py runserver 도 마찬가지로 wsgi를 실행시키는 형태이기때문에 굳이 따로 생성할 필요는 없다.

그렇다면 flask는?

flask의 장점이 가볍고 간단한 마이크로 프레임워크이니만큼 wsgi도 만들어줘야한다.

당신의 flask web이 다음과같이 선언되어있다고 가정하자.

# main.py
from flask import Flask , ......
....

app = Flask(__name__)
...
...

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

물론 Flask 객체명, 파이썬파일명은 다를 수 있다. main.py 안에 app라는 이름의 Flask 객체라고 가정한다면,

다음과같이 wsgi.py 를 만들자.

# wsgi.py
from main import app

if __name__ == '__main__':
	app.run(host='0.0.0.0',port='<your port number>')

끝이다.

이제 테스트를 해볼 시간이다. 이 다음부턴 django / flask 동일하다.

터미널에서 wsgi가 있는 디렉터리로 이동한 다음,

gunicorn -w 1 --bind 0.0.0.0:8000 wsgi:app

이런식으로 입력한 다음, 정상적으로 실행되는지 확인해보자.

설명하자면, -w, --worker ==> worker로, 해당 app를 몇 개의 worker에 할당할 것인지 정하는 변수이고,

--bind , -b ==> gunicorn을 통해서 서비스할 ip와 port를 정하면 된다. localhost로 바인딩하므로 0.0.0.0으로 하고, 포트는 원하는 포트를 적으면 된다.

wsgi:app ==> wsgi라는 파일의 app 객체를 실행시킨다. 라고 생각하면 된다. 만약 temp_dir/wsgi.py 이런식으로 디렉터리를 표현하고 싶다면 wemp_dir.wsgi:app 이렇게 . 점으로 경로를 지정해주면 된다.

실행에 문제가 없다면 이제 서비스로 등록할 시간이다.

그 전에 gunicorn이 어디에 설치되어있는지 아래의 명령어로 확인한 다음, 복사해놓자

which gunicorn

다들 개발환경이 다르기때문에 반드시 위의 명령어로 gunicorn이 설치되어있는 경로를 확인해야한다.

그 다음 아래의 명령어를 입력해서 원하는 서비스를 생성하자.

cd /etc/systemd/system/
sudo vi <your service name>.service

systemd는 sudo권한으로 생성해야 편집이 가능하니 유의하자.

서비스의 내용은

[Unit]
Description=<서비스의 설명을 적자>
After=network.target

[Service]
User=<linux 사용자명>
WorkingDirectory=<flask / django 프로젝트의 절대경로>
ExecStart=<위에서 복사해둔 gunicorn의 경로> --workers <worker 수> --bind 0.0.0.0:<port 번호> wsgi:app

[Install]
WantedBy=multi-user.target
~

간략하게 위처럼 생성할 수 있고,  접속 로그를 따로 관리하고싶다면

--log-level debug --access-logfile wsgi_access.log --error-logfile wsgi_error.log

이렇게 access log, error log를 따로 관리할 수 있다.

저렇게 만든 다음 저장하고나서 아래의 명령어로 시스템에 등록하고, 구동시키면 끝이다.

sudo systemctl daemon-reload
sudo systemctl enable <servicename>.service  ## 재부팅시 자동으로 서비스 재시작 ( 선택 )
sudo systemctl start <servicename>
sudo systemctl status <servicename>

이렇게 서비스 등록이 끝났다.

반응형

'linux' 카테고리의 다른 글

[방화벽 설정] 외부에서 접속 허용하기  (0) 2022.11.24
[Ubuntu 20.04 LTS] apt-get 삭제 후 재설치  (0) 2022.03.22
Nvidia 설치 ( Ubuntu 20.04 )  (0) 2022.03.10
406 Not Acceptable  (0) 2022.01.19
crontab 설정하기  (0) 2021.07.19