supervisor는 유닉스 계열의 시스템에서 여러 프로세스를 모니터링하고, 제어하는 프로그램이다.
여러 프로젝트를 진행할 때, 개발서버를 환경에 따라 매번 세팅해야 했다.이 프로젝트는 이 개발서버, 저건 저 개발 서버, 프로젝트가 많아지면서 개발서버가 분산되어 관리하기가 어려워져갔다. docker로 로컬 PC에서 환경을 돌려서 꽤 오랫동안 정착했었지만, 몇몇 문제점이 나타나게 됐다.
윈도 환경이라 docker-machine을 올리려면 Virtualbox를 써야 하는데, 리소스가 부족한 경우가 많이 발생했다. 보안 업데이트 때문에 재부팅하면 docker-machine 올리고, 컨테이너 올리고, 프로세스를 실행하는 작업을 해줘야 했는데, 꽤 귀찮았다. 그리고 개발할 때는 컨테이너가 실행되고, 자동으로 프로세스가 뜨도록 세팅하지 않아야 할 경우도 많았다.
그래서 원격의 한 개발서버에서 모든 프로젝트를 작업할 수 있게 환경을 만들었다. 이 때, Supervisor를 사용해서 스위치 on/off 하는 방식으로 프로세스를 관리하며 작업을 할 수 있게 만들었다.
Supervisor 설치하기 :
python 모듈이라서 간단하게 설치할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 |
# supervisor 설치 pip install supervisor # 설정 파일 생성 echo_supervisord_conf > /etc/supervisord.conf # 설정파일 적절히 수정 vi /etc/supervisord.conf # 데몬 실행 /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf |
이제 설정파일을 어떻게 작성하는지 보겠다.
예:
기존 설정파일 다른 부분은 수정하지 않고, 다음과 같이 파이선 프로그램을 추가했다.
1 2 3 4 |
[program:python_web_application] command=python -m python_web_application.cli api directory=/python_web_application_working_dir autostart=true |
키 | 설명 |
---|---|
command | 어떤 커맨드를 실행할지 정의 |
directory | 어떤 디렉토리에서 실행할지 정의 |
autostart | supervisor 데몬이 시작할 때 이 프로세스도 같이 실행할지 정의 |
이번에는 supervisorctl로 프로세스 관리하는 방법을 알아볼 것이다.
1 2 3 4 5 6 7 8 9 10 11 12 |
# supervisor 실행 supervisorctl # 결과 project1_minio_sync RUNNING pid 25099, uptime 19:35:34 project1_react_app_es6 RUNNING pid 30815, uptime 6 days, 0:49:03 project1_zmq_app_api RUNNING pid 25407, uptime 18:34:25 project1_zmq_app_broker RUNNING pid 5631, uptime 4 days, 20:13:50 project1_zmq_app_worker RUNNING pid 18751, uptime 54 days, 0:57:26 ... supervisor> help |
이렇게 실행하면 REPL 상태가 된다. 여기서 각종 커맨드를 사용할 수 있다. 위 예에서는 python 프로세스 3개, webpack 프로세스 1개, 파일 동기화 하는 프로세스 1개를 보여주고 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
# 모든 프로세스 보기 status # 설정된 모든 프로세스 보기 avail # 나가기 exit or quit # foreground로 프로세스를 확인 fg process_name # 프로세스 시작, 중지, 재시작 start process_name stop process_name restart process_name # supervisord를 재시작 reload # 설정 파일을 다시 불러온다 reread # 프로세스를 그룹에 추가 add process_name |
현재 다음과 같은 프로세스를 사용하고 있다.
- node.js(gulp + webpack 포함) : 프론트엔드, 백엔드 개발
- nginx : lua 개발
- elasticsearch
- python(flask, zeromq, …)
- php-fpm
- …
mysql이나 apache 등도 foreground로 실행하도록 추가하면 되지만 이미 서비스스크립트가 있어서 따로 등록하지 않았지만 이들도 supervisor를 통해 관리할 수 있다.
production 환경에서도 사용하면 supervisor를 통해 로그를 볼 수 있고, 프로세스를 관리할 수 있어서 편할 것 같다. 그 전에 production에 사용한 사례가 있는지 확인은 필요할 것 같다.