联系
Knight's Tale » 技术

supervisor + Tornado + Nginx 使用详解

2014-06-28 00:00

安装supervisor

wget https://files.pythonhosted.org/packages/44/60/698e54b4a4a9b956b2d709b4b7b676119c833d811d53ee2500f1b5e96dc3/supervisor-3.3.4.tar.gz
tar xzvf supervisor-3.3.4.tar.gz
cd  supervisor-3.3.4
python setup.py install

配置supervisor

cd  supervisor-3.3.4
echo_supervisord_conf > supervisord.conf

supervisord.conf 就是配置文件,把它复杂到你的项目的目录下如 /home/work/web/supervisord.conf

添加以下代码至此文件的最后:(请按需更改)

[program:myprogram] 
process_name=MYPROGRAM%(process_num)s
directory=/var/www/apps/myapp 
command=/var/www/apps/myapp/virtualenv/bin/python index.py --port=%(process_num)s
startsecs=2
user=youruser
stdout_logfile=/var/log/myapp/out-%(process_num)s.log
stderr_logfile=/var/log/myapp/err-%(process_num)s.log
numprocs=4
numprocs_start=14000
user=work

这里需要注意的是,需要加入user定义,否则会报“Error: Invalid username your user supervisord” 错误。

这里使用了四个实例(numprocs)。

使用Nginx代理Tornado

upstream myappbackend {
        server 127.0.0.1:14001 ;
        server 127.0.0.1:14002 ;
        server 127.0.0.1:14003 ;
        server 127.0.0.1:14004 ;
}

server {
        listen     4.5.6.7:80;
        server_name   example.com;

        access_log   /var/log/nginx/myapp.log  main;


        location / {
                proxy_set_header   Host      $host;
                proxy_set_header  X-Real-Ip       $remote_addr;
                proxy_pass  http://myappbackend/;
        }
}

启动

在 /home/work/web/目录下,执行

supervisord -c supervisord.conf

重启

supervisorctl restart all

启动指定APP

   supervisorctl start myprogram

总结

在本应用中,supervisor 可以统一对多个同构的Python进程进行管理。当有请求过来时,Nginx先进行负载均衡,然后把动态请求发送给Python进程,这些Python则是由supervisor统一进行管理。

Supervisord管理

Supervisord安装完成后有两个可用的命令行supervisor和supervisorctl,命令使用解释如下:

supervisord,初始启动Supervisord,启动、管理配置中设置的进程。

supervisorctl stop programxxx,停止某一个进程(programxxx),programxxx为[program:chatdemon]里配置的值,这个示例就是chatdemon。

supervisorctl start programxxx,启动某个进程

supervisorctl restart programxxx,重启某个进程

supervisorctl stop groupworker: ,重启所有属于名为groupworker这个分组的进程(start,restart同理)

supervisorctl stop all,停止全部进程,注:start、restart、stop都不会载入最新的配置文件。

supervisorctl reload,载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程。

supervisorctl update,根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启。

注意:显示用stop停止掉的进程,用reload或者update都不会自动重启。

参考:

  1. http://supervisord.org/installing.html
  2. http://stackoverflow.com/questions/14749655/setting-up-a-tornado-web-service-in-production-with-nginx-reverse-proxy
  3. https://www.idndx.com/2011/10/18/ways-to-deploy-tornado-under-production-environment-using-supervisor/
  4. http://demo.pythoner.com/itt2zh/ch8.html#ch8-3
  5. https://gist.github.com/Arion-Dsh/6326454
  6. https://gist.github.com/Arion-Dsh/6325973
  7. how to restart only certain processes using supervisorctl? http://stackoverflow.com/questions/9301494/how-to-restart-only-certain-processes-using-supervisorctl