본문 바로가기
개발환경/Web Server

우분투 20.04에서 Flask를 서비스 등록: 부팅 시 자동 실행

by Kibua20 2020. 8. 24.

이전 Post에서 Flask Web 서버를 설명을 했고, 본 포스팅은 우분투 20.04에서 Flask Web 서버를 서비스 형태로 등록하는 방법입니다.  Flask Web server를 우분투의 서비스로 등록했을 때 장점은 아래와 같습니다. 

 

  • Flask Web 서버를 재 부팅 시 자동 실행 가능
  • Flask Web 서버가 crash가 발생했을 경우 자동으로 재 실행
  • 쉽게 Flask 서비스의 시작, 정지, 상태 확인, 재 시작

우분투에서 서비스 등록하기 위해서는 systemctl을 사용하며 아래 2단계 과정이 필요합니다. 

 

  1. /lib/systemd/system 에 service configuration파일 작성 - 서비스 실행 파일, 부팅 시 실행 조건, 실행 권한 등을 설정
  2. 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

[개발환경/우분투] - 리눅스 시스템 정보 확인 방법 (우분투 버전, gcc 버전, libc 버전)




댓글