본문 바로가기
개발 이야기/Linux

Ubuntu 16.04 Flask, django uwsgi 서비스 등록하기

by _ppuing 2020. 11. 27.
반응형

Flask, django로 개발을 마친 후에 우분투 기반으로 서버를 가동하고 싶을 때, 사전 작업으로 기존에 쓰던 app.py 혹은 manage.py 를 사용하지 않고, 서버용 스크립트를 따로 만든다. 나는 보통 네이밍을 wsgi_{environment}.py 로 만드는데, 스크립트는 기존 앱과 거의 비슷하게 생겼지만, 해당 서버용 스크립트는 기존 디버그 환경과는 다른 변수로 세팅하는 목적이 있다. (환경 변수로 커버할 수 있으면 같은 것 써도 무방하긴 할 듯..)

 

우선 ubuntu 에서 uwsgi 설치를 해야 한다. 

pip3 install uwsgi

 

그 다음 서비스에 관련된 정보를 넣을 dev.ini 파일을 만든다

[uwsgi]
module = wsgi:app  # wsgi.py 에서 app 으로 정의된 값이 모듈이 된다는 뜻

master = true
processes = 5  # 마스터 아래에 둘 프로세스 수 (이러면 총 6개의 프로세스가 돌게 된다.)

socket = :5000  # 요청을 받을 포트 (nginx 설정에서 80, 443 포트로 넘어올 때 이 포트로 포워드 해줄 예정)
chmod-socket = 664 
vacuum = true

die-on-term = true
enable-threads = true
pidfile = /var/run/uwsgi/{my_program}.pid  # 프로세스 실행시 pid를 저장할 장소

env = MY_ENV=dev  # 환경변수 넣어줄 수 있음(예시로 환경변수 MY_ENV를 "dev"로 설정함)

 

 

위 ini 파일을 기반으로 우분투에 서비스 등록을 한다. ubuntu 16.04 의 경우에는 /etc/init/ 이나 /etc/init.d/ 에 정의하는 것과 달리, /etc/systemd/system/ 아래에 서비스 정의를 한다. 

sudo vi /etc/systemd/system/myservice.service

그런 다음 서비스 상세 정보를 기입한다.

[Unit]
Description=uWSGI instance to serve myproject
After=network.target

[Service]
User={우분투계정명}  # 이 서비스의 계정은 {우분투계정명}이 되므로, 혹시 권한 dependent한 것이 있으면 변경해준다.
Group=www-data	# 이 서비스의 그룹은 www-data 가 되므로, 혹시 권한 dependent한 것이 있으면 변경해준다.
WorkingDirectory=/{path}/{to}/{myproject}
Environment="PATH=/{path}/{to}/{myproject}/venv/bin"  # 나 같은 경우 보통 프로젝트마다 venv를 활용하기 때문에 서비스 실행 시에도 환경변수 활용을 하도록 해당 라인을 넣어줬다. 
ExecStart=/{path}/{to}/{myproject}/venv/bin/uwsgi --ini dev.ini  # 위에서 정의한 dev.ini를 기반으로 서비스 실행하는 커맨드라인

[Install]
WantedBy=multi-user.target

 

그런 다음 서비스 실행/중지/재시작을 하려면 아래 키워드를 입력하면 된다.

sudo service {myproject} status # 서비스 실행 상태 확인
sudo service {myproject} start # 서비스 시작
sudo service {myproject} stop # 서비스 정지
sudo service {myproject} restart # 서비스 재시작

journalctl -u {myproject} -f # 서비스 로그 확인, -f: follow

 

만약 서비스 상태를 조회했는데 에러가 났고, 그 에러가 위에 dev.ini 에서 정의되어 있는 pid 파일이 생성되지 못한 에러라면, /var/run/ 경로가 sudo 권한이 필요하기 때문이다. 그런 경우, pid 파일의 경로를 바꿔주거나, 아래 명령어로 해결하면 된다. 

sudo mkdir /var/run/uwsgi
sudo chown {우분투계정명} /var/run/uwsgi/

그 다음 서비스 실행 명령어를 다시 호출하고, 그 다음 서비스 상태를 조회한다.

반응형

댓글