IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

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

the5fire的技术博客 2013-07-31 13:32:23 累计浏览 3,729 次
本机暂存

   

   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. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. 用Hyer来进行网站的抓取 (累计阅读 158,250)
  2. 配置Nginx+uwsgi更方便地部署python应用 (累计阅读 107,164)
  3. 程序员技术练级攻略 (累计阅读 35,469)
  4. python实现自动登录discuz论坛 (累计阅读 32,833)
  5. python编程细节──遍历dict的两种方法比较 (累计阅读 20,371)
  6. 每个程序员都应该学习使用Python或Ruby (累计阅读 17,917)
  7. Chrome和goagent的配置方法,你懂的 (累计阅读 16,842)
  8. 30分钟3300%性能提升――python+memcached网页优化小记 (累计阅读 13,741)
  9. 使用python爬虫抓站的一些技巧总结:进阶篇 (累计阅读 13,301)
  10. 我的PHP,Python和Ruby之路 (累计阅读 13,146)