circus —— supervisord 的完美替代品

简介:

circus (http://circus.readthedocs.org) 是 mozilla 开发的一个 socket 管理工具,用来代替 supervisord ,circus 与 supervisor 的区别这2张图一目了然。

supervisor:

circus:

chaussette 是专门用来配合 circus 的 wsgi 服务,不过 chaussette 官方说 “Chaussette is just a bit of glue code on the top of existing WSGI servers, and is organized around back ends. ”,因为 chaussette 自己并不做为 server 来运行程序,而是支持已有的 backend,支持列表参见 http://chaussette.readthedocs.org/en/0.8/#backends

折腾了几天 circus 的配置,留一份备忘。

运行服务:

基于 pyramid 的 Project:

pyramid 的 Project 模式是用 paste 运行的,而 chaussette 完美支持这种方式,如下的配置是在 8000 端口开启一个服务

[watcher:project1]
working_dir = /path/to/project1
cmd = env/bin/chaussette --fd $(circus.sockets.project1) paste:production.ini use_sockets = True numprocesses = 5 
[socket:project1] 
host = 127.0.0.1 
port = 8000

基于  pyramid 的 app:

chaussette 运行 app 的方式同样简单,其中 server.py 里 app = config.make_wsgi_app()

[watcher:project2]
working_dir = /path/to/project2
cmd = env/bin/chaussette --fd $(circus.sockets.project2) server.app
use_sockets = True
numprocesses = 5

[socket:project2]
host = 127.0.0.1
port = 8001

cmd 中的变量:

很多时间运行多进程是需要不同参数的,比如说我的 rabbitmq 的 worker 是用 celery 实现的,但时运行多个 celery 会因 nodename 相同而后面运行的 worker 无法工作,解决方案如下:

[watcher:celery]
working_dir = /path/to/celery
cmd = celery
args = worker -n w$(circus.wid).domain -A tasks.tasks -l info
numprocesses = 5

这里的 w$(circus.wid).domain 是 nodename,其中的 $(circus.wid) 会被替换成对应的进程号,来区分不同的进程,神似 supervisor 中的 %(process_num)02d 。

Web 监控:

circus 自带了非常优秀的 Web 监控程序,而且从 circus 0.7 开始,circus-web 从 circus 主程序中分离出去,需要单独安装,具体过程官方说得很清楚了,就不在这里啰嗦了,移步 http://circus.readthedocs.org/en/0.7/circushttpd/ 在配置过程中,我遇到了以下问题

import curses 失败:

服务器系统用的 Centos,Python 是编译安装的,这是错误是因为在编译 Python 之前没有安装 ncurses 导致的, yum install ncurses-devel 之后,重新编译 Python 问题解决。

nginx 反代:

官方说得也比较清楚, Nginx 从 1.3.13 开始支持 websocket 的反向代理,服务器通常使用 stable 版的软件,所以需要升级 Nginx,同样重新编译之后问题解决。如果不想升级,可以选择 Nginx + Varnish 方案。

总结:

Circus 是 Supervisor 很好的代替品,它利用 ZemoMQ 做通信,又有优秀的 socket 管理模型和 Web 监控接口,还有对开发者友好的 Library 接口,更多功能,值得去做更详细的学习!