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
$

起動しました。 あとは思いっきりceleryを堪能してください。
使ってみた感想
Supervisorは設定がすっきりしていていいなあと思いました。 少し手がかかるのはインストールしてsupervisordを起動するところまでかな と思うので、アドホックなデーモン管理に使ってみてもいいのではないでしょうか。 これで結構簡単にデーモン管理できます。らくちん。
Celeryは 以前参加したPython-Hack-a-thon#2 でIanさんが紹介されたので知って、 Djangoがなくても使えそうだったので、今回使用してみました。 現在の使用用途としては今開発してるFlickrクローンのバックエンドで処理させる 画像処理タスク用です。