supervisordとcelerydの設定
2010-04-08 - ⧖ 1.0 minSupervisor(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 = 10 MB
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クローンのバックエンドで処理させる 画像処理タスク用です。
