이전 Post에서 Flask Web 서버를 설명을 했고, 본 포스팅은 우분투 20.04에서 Flask Web 서버를 서비스 형태로 등록하는 방법입니다. Flask Web server를 우분투의 서비스로 등록했을 때 장점은 아래와 같습니다.
- Flask Web 서버를 재 부팅 시 자동 실행 가능
- Flask Web 서버가 crash가 발생했을 경우 자동으로 재 실행
- 쉽게 Flask 서비스의 시작, 정지, 상태 확인, 재 시작
우분투에서 서비스 등록하기 위해서는 systemctl을 사용하며 아래 2단계 과정이 필요합니다.
- /lib/systemd/system 에 service configuration파일 작성 - 서비스 실행 파일, 부팅 시 실행 조건, 실행 권한 등을 설정
- systemctl 명령어로 서비스 등록 및 시작
1. Flask Web 서버용 서비스 configuration 파일 작성
/lib/systemd/system/<서비스이름>.service 파일을 아래와 같이 작성합니다.
$ vi /lib/systemd/system/flask.service
# vi 에서 아래 파일을 작성
[Unit]
Description=Flask web server
After=network.target
[Install]
WantedBy=multi-user.target
[Service]
User=root
Group=root
PermissionsStartOnly=true
ExecStart=/home/kibua20/git/getgoogle/server/server.py
WorkingDirectory=/home/kibua20/git/getgoogle/server
TimeoutSec=600
Restart=on-failure
RuntimeDirectoryMode=755
각 항목에 대한 설명은 아래와 같습니다. 실무에서는 User, Group, ExecStart, Restart, Environment정도가 사용될 것 같습니다. (상세 설명)
[Unit]
Description=Flask web server → 서비스 설명
After=network.target → 서비스 실행 순서 설정. Web server 이기 때문에 netwrok 모듈 실행 후 Flask web server를 실행
[Install]
WantedBy=multi-user.target → 리눅스 run level을 multi-user mode로 설정합니다. (참고)
[Service]
User=root → 서비스 실행 시 user 설정, root permission 으로 동작 (상용에서는 root가 아니고 서비스 계정으로 실행해야 함)
Group=root → 서비스 실행 시 user 설정, root permission으로 동작
PermissionsStartOnly=true → User/Group are only applied to ExecStart. So switching to the new syntax will be :
ExecStart=/home/flask_server.py
→ 서비스 실행 파일 설정 (절대 경로)
→ 여러 개의 command 실행할 때 : /usr/bin/bash -c ' ls | tee log.txt'
WorkingDirectory=/home/kibua20/webserver → 서비스 실행 파일 설정
TimeoutSec=600
Restart=on-failure → 서비스가 죽었을 경우 재 시작 조건
RuntimeDirectoryMode=755 → Directory mode
Environment=FLASK_CONFIG=production → 환경 변수 등록
2. systemctl 명령어로 서비스 등록
systemctl 명령어 서비스를 ① 데몬을 재 실행(systemctl daemon-reload)하고 ② 서비스를 등록(systemctl enable)하고 ③ 서비스 시작(systemctl start)합니다.
# ① systemctl 데몬 재 실행 (서비스 unit 파일 변경 시)
$ sudo systemctl daemon-reload
# ② 서비스 등록 (부팅 시 서비스를 자동으로 실행하기 위해서는 enable을 꼭 실행해야 합니다.)
$ sudo systemctl enable <서비스이름>.service
(실행 예)
$ sudo systemctl enable flask.service
→ Created symlink /etc/systemd/system/multi-user.target.wants/flask.service → /lib/systemd/system/flask.service.
# ③ 서비스 시작
$ sudo systemctl start flask.service
기타 유용한 systemctl 명령어
# 서비스 list 확인
$ sudo systemctl list-units --all --type=service --no-pager
$ sudo systemctl list-units --type=service --state=running
$ sudo systemctl list-unit-files
# 서비스 중지 (재 부팅 시 실행됨)
systemctl stop [service name]
# 서비스 disable systemd (symlink가 삭제되어 재 부팅 시에도 실행되지 않음)
systemctl disable [service name]
# 서비스 재 시작
systemctl restart [service name]
# reload systemd
systemctl reload [service name]
서비스 실행 화면:
systemctl 디버깅 - journalctl로 로그 보기 (참고)
# 에러 로그 보기
$ sudo journalctl -xe
# flask 서비스 로그 보기
$ journalctl -u flask
# 부팅 로그
$ journalctl -b
# 오늘 로그 또는 특정 시간
$ journalctl --since=today
$ journalctl --since "1 hour ago"
# journalctl --disk-usage
관련 글
[개발환경/Web Server] - Python: Web Framework Flask 사용하기
[모바일 SW 개발/Python] - Python: OSError: [Errno 98] Address already in use (Flask)
[개발환경/Web Server] - 우분투 20.04에서 lighttpd의 fastcgi 개념 및 사용법
[개발환경/Web Server] - Web 서버 GET/POST CGI 사용법 (QUERY_STRING / CONTENT_LENGTH)
[개발환경/Web Server] - 우분투 20.04에서 lighttpd CGI 설정 방법 및 C와 Python 예제 코드
[개발환경/Web Server] - 우분투 20.04에서 lighttpd Web Server 설치 (Embedded용으로 활용 가능)
[개발환경/Web Server] - 우분투 20.04에서 Apache와 Tomcat 완전 삭제 방법
[블로그 관리/모바일 마케팅] - [용어 정리 #2] UTM (Urchin Tracking Module) campaign
댓글