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 |