Supervisor는 유닉스 계열의 시스템에서 여러 프로세스를 모니터링하고, 제어하는 프로그램이다.
여러 프로젝트를 진행할 때, 개발 서버를 환경에 따라 매번 세팅해야 했다. 이 프로젝트는 이 개발 서버, 저건 저 개발 서버, 프로젝트가 많아지면서 개발 서버가 분산되어 관리하기 어려웠다. Docker로 로컬 PC에서 환경을 돌려서 꽤 오랫동안 정착했었지만, 몇몇 문제점이 나타나게 됐다.
윈도 환경이라 docker-machine을 올리려면 Virtualbox를 써야 하는데, 자원이 부족한 경우가 많이 발생했다. 보안 업데이트 때문에 재부팅 하면 docker-machine 올리고, 컨테이너 올리고, 프로세스를 실행하는 작업을 해줘야 했는데, 꽤 귀찮았다. 그리고 개발할 때는 컨테이너가 실행되고, 자동으로 프로세스가 뜨도록 세팅하지 않아야 할 경우도 많았다.
그래서 원격의 한 개발 서버에서 모든 프로젝트를 작업할 수 있게 환경을 만들었다. 이때, Supervisor를 사용해서 스위치 on/off 하는 방식으로 프로세스를 관리하며 작업을 할 수 있게 만들었다.
Supervisor 설치하기 :
Python 모듈이라서 간단하게 설치할 수 있다.
# supervisor 설치
pip install supervisor
# 설정 파일 생성
echo_supervisord_conf > /etc/supervisord.conf
# 설정 파일 적절히 수정
vi /etc/supervisord.conf
# 데몬 실행
/usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf
이제 설정 파일을 어떻게 작성하는지 보겠다.
예:
기존 설정 파일 다른 부분은 수정하지 않고, 다음과 같이 파이선 프로그램을 추가했다.
[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로 프로세스 관리하는 방법을 알아볼 것이다.
# 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개를 보여주고 있다.
# 모든 프로세스 보기
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에 사용한 사례가 있는지 확인은 필요할 것 같다.