IT技术博客大学习 共学习 共进步

进程管理器supervisor的使用(django实例)

the5fire的技术博客 2013-07-31 13:32:23 浏览 3,645 次

   

   Supervisor是一个多进程管理工具,在python生产环境中使用很频繁。它是由python实现的,在github上可以找到它的源码。

   在目前的使用中,个人觉得最重要的就是同时启动多个应用,至于在网上看到的其他人说所的,在程序crash之后会自动重启,这是它有的功能不过在真实使用中还没碰到程序crash的情况。

   常见的情景是这样,用supervisor启动多个django或者tornado程序,分别监听在不同的端口上。然后前面用一个nginx打到这几个端口。这样你访问监听在80端口的nginx的时候其实访问的是后面的几个django或者tornado程序,至于这样算不算是负载均衡,目前the5fire还没有搞清楚。不管怎样吧,这个东西就是这么用的。

   下面就来具体说下supervisor的安装和配置(我是ubuntu12.04环境)。

   首先,shell下命令:

mkvirtualenv super

   cd ~/.virtualenvs/super

   这段命令的作用是创建一个虚拟环境super,然后跳到这个目录下。不了解内情的到这里先补下基础:《使用virtualenv创建虚拟python环境》

   然后就是安装supervisor以及django:pip install supervisor django。

   好,现在环境就初始化好了,先在super环境的etc下创建一个django项目,命名为sayhello:django-admin.py startproject sayhello。

   然后就是配置supervisor的配置文件了。

   根据官方指示,要执行下名的命令来创建配置文件:

   echo_supervisord_conf > etc/supervisord.conf

   但是在一开始接触的时候,标准配置文件中的东西实在是太多,不如把程序给弄起来先。因此我的配置文件是这样的:

[unix_http_server]

   file=~/.virtualenvs/super/tmp/supervisor.sock                       ; path to your socket file

   chmod=0777                 ; socket file mode (default 0700)

   sockchown=root:the5fire       ; socket file uid:gid owner

   username=user              ; (default is no username (open server))

   password=123               ; (default is no password (open server))

   [supervisord]

   logfile=~/.virtualenvs/super/tmp/supervisord.log                    ; supervisord log file

   logfile_maxbytes=50MB                           ; maximum size of logfile before rotation

   logfile_backups=10                              ; number of backed up logfiles

   loglevel=debug                                   ; info, debug, warn, trace

   pidfile=~/.virtualenvs/super/tmp/supervisord.pid                    ; pidfile location

   nodaemon=false                                  ; run supervisord as a daemon

   minfds=1024                                     ; number of startup file descriptors

   minprocs=200                                    ; number of process descriptors

   #user=root                                   ; default user

   #childlogdir=~/.virtualenvs/super/logs

   [rpcinterface:supervisor]

   supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

   [supervisorctl]

   serverurl=unix://~/.virtualenvs/super/tmp/supervisor.sock           ; use a unix:// URL  for a unix socket

   username=user

   password=123

   [program:sayhello]

   command=/home/the5fire/.virtualenvs/super/bin/python /home/the5fire/.virtualenvs/super/etc/sayhello/manage.py runserver 800%(process_num)1d --noreload

   process_name=%(program_name)s_%(process_num)d

   autostart=true

   stdout_logfile= ~/.virtualenvs/super/logs/supervisord_stdout_%(process_num)02d.log

   numprocs=2

   numprocs_start=0

   各个参数的意思都很明确,其中有几个需要着重解释下,在配置的过程中the5fire卡壳在这里。

   一开始的时候设置sock文件的拥有者的时候用:chown=root:the5fire,启动失败,安居提示修改为:sockchown=root:the5fire方成功,貌似the5fire:the5fire也可以,看文档说是用户和用户组。

   后面还有一点要说明的就是端口的配置,在[program]配置项中,有两个参数numprocs=2,numprocs_start=0用来配置启动进程数和启动进程号。这样就有一个变量可以使用了:process_num,它就用来表示当前进程号。

   在[program]项中还有一个command,就是要执行的程序。

   这个配置总的目的是启动前面创建的那个django程序,分别监听在8000和8001端口。

   -EOF-

建议继续学习

  1. Oracle MTS模式下 进程地址与会话信息 (阅读 14,187)
  2. Linux内存点滴 用户进程内存空间 (阅读 12,946)
  3. 深入理解Nginx之调试优化技巧 (阅读 8,104)
  4. Linux上进程的表示以及入门 (阅读 7,642)
  5. Linux下进程绑定多CPU运行 (阅读 7,102)
  6. 分析进程内存分配情况,解决程序性能问题 (阅读 6,684)
  7. Linux下如何知道文件被那个进程写 (阅读 6,325)
  8. 使用GDB调试多进程程序 (阅读 6,242)
  9. 使用django+celery+RabbitMQ实现异步执行 (阅读 6,083)
  10. 进程运行于不同的 CPU 核 (阅读 5,825)