supervisordとcelerydの設定

Supervisor(d)daemontools ライクなプロセス死活監視用のスーパーサーバです。 XML-RPCを使ってプロセス情報の取得やプロセスの操作もおこなえます。 今回はジョブキューサーバであるところの Celery(d) をsupervisord上で管理するまでを 紹介します。

supervisordの設定

インストールは easy_install 経由でおこないます。 バージョンは3.0a8です。 設定ファイル作成まで。

$ easy_install -U supervisor
$ echo_supervisord_conf > /etc/supervisord.conf
$ mkdir /etc/supervisord        ;; 設定用 必要に応じて
$ mkdir /var/log/supervisord    ;; ログ用 必要に応じて
$ vim /etc/supervisord.conf
[inet_http_server]
port=127.0.0.1:9001

[supervisord]
logfile=/var/log/supervisord.log
logfile_maxbytes=10MB
logfile_backups=10
loglevel=info
pidfile=/var/run/supervisord.pid
childlogdir=/var/log/supervisord

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=http://127.0.0.1:9001

[include]
files = /etc/supervisord/*.conf

init.d script は Can MacKinlayさんのもの を参考にしました。 で、起動。

$ /etc/init.d/supervisord start

celerydまわりの設定

まずCeleryのメッセージ受け渡し(Broker)用に RabbitMQ が必要です。 今回は apt-get 経由でインストールしました。バージョンは1.6.0です。 CeleryはPyPIから。バージョンは1.0.2です。

$ sudo apt-get install rabbitmq-server
$ rabbitmqctl add_user myuser mypassword
$ rabbitmqctl add_vhost myvhost
$ rabbitmqctl set_permissions -p myvhost myuser "" ".*" ".*"
$ easy_install celery

supervisordに監視させるプロセスは /etc/supervisord 配下の *.conf ファイルを読みにいくようにしているので、 celeryd用の設定を /etc/supervisord/celeryd.conf に記述します。 設定ファイルは以下のような感じになります。 (environmentの書き方でハマったので注意。ダブルクォート有り無しとかでエラーになる。)

[program:celeryd]
command = /usr/local/bin/celeryd --loglevel=INFO
environment = PYTHONPATH="/ect/celery"
directory = /app
numprocs = 1
stdout_logfile = /var/log/supervisord/celeryd.log
stderr_logfile = /var/log/supervisord/celeryd_error.log
stdout_logfile_maxbytes = 10B
stderr_logfile_maxbytes = 10B
stdout_logfile_backups = 5
stderr_logfile_backups = 5
autostart = true
autorestart = true
startsecs = 5
priority = 998

celeryd用のceleryconfig.pyをPYTHONPATHがとおったパスに配置します。 ファイルの中身は以下。

BROKER_HOST = "localhost"
BROKER_PORT = 5672
BROKER_USER = "myuser"
BROKER_PASSWORD = "myuser"
BROKER_VHOST = "myvhost"

CELERY_RESULT_BACKEND = "amqp"
CELERY_IMPORTS = ("tasks", )    # タスクを記述したtasks.pyを準備する

AMQP_SERVER = '127.0.0.1'
AMQP_PORT = 5672
AMQP_USER = 'myuser'
AMQP_PASSWORD = 'myuser'
AMQP_VHOST = 'myvhost'

rabbitmq-server 起動後、 supervisord を再起動してcelerydが起動しているかどうか確認。

$ /etc/init.d/rabbitmq-server restart
$ /etc/init.d/supervisord restart
$ supervisorctl status
celeryd                          RUNNING    pid 18662, uptime 0:14:49
$
http://image.hexacosa.net/images/container/00000000000003a6_m.png

起動しました。 あとは思いっきりceleryを堪能してください。

使ってみた感想

Supervisorは設定がすっきりしていていいなあと思いました。 少し手がかかるのはインストールしてsupervisordを起動するところまでかな と思うので、アドホックなデーモン管理に使ってみてもいいのではないでしょうか。 これで結構簡単にデーモン管理できます。らくちん。

Celeryは 以前参加したPython-Hack-a-thon#2 でIanさんが紹介されたので知って、 Djangoがなくても使えそうだったので、今回使用してみました。 現在の使用用途としては今開発してるFlickrクローンのバックエンドで処理させる 画像処理タスク用です。