Foreman을 사용해 Procfile로 애플리케이션 프로세스를 관리하고, 개발 환경에서 실행하며, upstart 또는 init으로 프로덕션에 내보내는 방법을 소개합니다.
최근 들어 제 웹 앱들이 실행하기 점점 더 복잡해지고 있다는 것을 느끼고 있습니다. 이제 제 앱들은 더 이상 단일 웹 프로세스로만 이루어지지 않습니다. 보통 서로 다른 종류의 작업을 처리하는 하나 이상의 백그라운드 워커와 스케줄링을 처리하는 클럭 프로세스를 함께 둡니다. 이런 방식으로 앱을 분리하는 것은 성능과 확장성 측면에서 아주 좋습니다. 하지만 단점은 앱과 그 모든 구성 요소를 실행하는 일이 훨씬 더 복잡해진다는 점입니다.
Foreman은 이 과정을 더 쉽게 만들기 위한 시도입니다. foreman을 사용하면 애플리케이션을 실행하는 데 필요한 다양한 프로세스를 Procfile을 사용해 선언할 수 있습니다.
web: bundle exec thin start -p $PORT
worker: bundle exec rake resque:work QUEUE=*
clock: bundle exec rake resque:scheduler
시작하려면 간단히 gem install foreman을 실행하면 됩니다. 프로젝트에서 Bundler와 Foreman을 함께 사용하고 있다면, 실행은 다음처럼 아주 간단합니다.
$ bundle install
$ foreman start

Foreman은 앱과 연관된 모든 프로세스를 시작하고 각 프로세스의 stdout과 stderr를 표시합니다. 읽기 쉽도록 프로세스들은 유형별로 색상이 구분됩니다. $PORT는 foreman이 자동으로 할당하며, 각 하위 프로세스에서 사용할 수 있게 됩니다.
foreman은 개발 환경에서 애플리케이션을 실행하는 데 아주 유용하지만, 프로덕션에서 프로세스를 관리하기 위한 훌륭한 기존 도구들도 있습니다. Foreman은 upstart 또는 표준 유닉스 init으로 내보낼 수 있습니다.
$ foreman export upstart /etc/init
[foreman export] writing: /etc/init/testapp.conf
[foreman export] writing: /etc/init/testapp-web.conf
[foreman export] writing: /etc/init/testapp-web-1.conf
[foreman export] writing: /etc/init/testapp-worker.conf
[foreman export] writing: /etc/init/testapp-worker-1.conf
[foreman export] writing: /etc/init/testapp-clock.conf
[foreman export] writing: /etc/init/testapp-clock-1.conf
upstart로 내보낸 뒤에는 다음 명령들을 사용할 수 있습니다.
$ start testapp
$ stop testapp-clock
$ restart testapp-worker-1
$ foreman export inittab
# ----- foreman testapp processes -----
TE01:4:respawn:/bin/su - testapp -c 'PORT=5000 bundle exec thin start -p $PORT >> /var/log/testapp/web-1.log 2>&1'
TE02:4:respawn:/bin/su - testapp -c 'PORT=5100 bundle exec rake resque:work QUEUE=* >> /var/log/testapp/worker-1.log 2>&1'
TE03:4:respawn:/bin/su - testapp -c 'PORT=5200 bundle exec rake resque:scheduler >> /var/log/testapp/clock-1.log 2>&1'
# ----- end foreman testapp processes -----
Foreman은 각 프로세스 유형을 1개보다 많이 실행하는 것도 지원합니다.
# run 1 of each process type, and 2 workers
$ foreman start -c worker=2
# do not run a clock process
$ foreman start -c clock=0
Foreman은 기본적으로 5000부터 포트 할당을 시작하며, Procfile에 사용된 순서대로 프로세스 유형마다 100개 단위 블록으로 할당합니다.
이 글 맨 위에서 사용한 Procfile의 경우 web.1에는 포트 5000이 할당되고, worker.1에는 5100, clock.1에는 5200이 할당됩니다. 웹 프로세스를 2개 실행했다면 web.2에는 5001이 할당됩니다.
-p 옵션을 사용하면 foreman이 사용할 다른 시작 포트를 지정할 수 있습니다.
사용 가능한 옵션에 대한 더 많은 정보는 man page를 확인하세요.