Supervisord 是用Python实现的一款非常实用的进程管理工具,类似于monit(关于monit见我的博客:用monit监控系统关键进程),monit和supervisord的一个比较大的差异是supervisord管理的进程必须由supervisord来启动,monit可以管理已经在运行的程序;supervisord还要求管理的程序是非daemon程序,supervisord会帮你把它转成daemon程序,因此如果用supervisord来管理nginx的话,必须在nginx的配置文件里添加一行设置daemon off让nginx以非daemon方式启动。(此段话引用链接:http://feilong.me/2011/03/monitor-processes-with-supervisord)

注意:如果用supervisorctlstart nginx启动nginx显示错误nginx: ERROR(abnormal termination),查看日志说是nginx已经启动,这就是因为nginx本身是daemon程序,要在nginx的配置文件中把它转为非daemon程序.

1.Supervisor安装:

  1. # 安装  
  2. easy_install supervisor 

也可采用离线安装的方式:

安装python
安装meld3-0.6.8.tar.gz

安装elementtree-1.2.6-20050316.tar.gz
安装supervisor-3.0a12.tar.gz

官方安装文档:
http://supervisord.org/installing.html

依赖软件:

  1. setuptools (latest) from http://pypi.python.org/pypi/setuptools.  
  2. meld3 (latest) from http://www.plope.com/software/meld3/.  
  3. elementtree (latest) from http://effbot.org/downloads#elementtree.  

2.生成默认配置文件:

  1. # 生成默认配置文件  
  2. echo_supervisord_conf > /etc/supervisord.conf  
  3. mkdir /etc/supervisord.conf.d  


3.修改配置文件

  1. include区段修改为:  
  2. [include]  
  3. files = /etc/supervisord.conf.d/*.conf  
  1. 如需要访问web控制界面,inet_http_server区段修改为:  
  2. [inet_http_server]  
  3. port=0.0.0.0:9001  
  4. username=username ; 你的用户名  
  5. password=password ; 你的密码  
  1. 每个需要管理的进程分别写在一个文件里面,放在/etc/supervisord.conf.d/目录下,便于管理。例如:test.conf  
  2. [program:sqlparse]  
  3. directory = /var/www/python  
  4. command = /bin/env python test.py  


4.把supervisord服务设为开机自启动,把下面程序复制下来生成supervisord文件放到/etc/init.d/目录下面:

CentOS环境下:

  1. #!/bin/sh  
  2. #  
  3. # /etc/rc.d/init.d/supervisord  
  4. #  
  5. # Supervisor is a client/server system that  
  6. # allows its users to monitor and control a  
  7. # number of processes on UNIX-like operating  
  8. # systems.  
  9. #  
  10. # chkconfig: - 64 36  
  11. # description: Supervisor Server  
  12. # processname: supervisord  
  13.   
  14. # Source init functions  
  15. . /etc/init.d/functions  
  16.   
  17. RETVAL=0  
  18. prog="supervisord"  
  19. pidfile="/tmp/supervisord.pid"  
  20. lockfile="/var/lock/subsys/supervisord"  
  21.   
  22. start()  
  23. {  
  24.         echo -n $"Starting $prog: "  
  25.         daemon --pidfile $pidfile supervisord -c /etc/supervisord.conf  
  26.         RETVAL=$?  
  27.         echo  
  28.         [ $RETVAL -eq 0 ] && touch ${lockfile}  
  29. }  
  30.   
  31. stop()  
  32. {  
  33.         echo -n $"Shutting down $prog: "  
  34.         killproc -p ${pidfile} /usr/bin/supervisord  
  35.         RETVAL=$?  
  36.         echo  
  37.         if [ $RETVAL -eq 0 ] ; then  
  38.                 rm -f ${lockfile} ${pidfile}  
  39.         fi  
  40. }  
  41.   
  42. case "$1" in  
  43.   
  44.   start)  
  45.     start  
  46.   ;;  
  47.   
  48.   stop)  
  49.     stop  
  50.   ;;  
  51.   
  52.   status)  
  53.         status $prog  
  54.   ;;  
  55.   
  56.   restart)  
  57.     stop  
  58.     start  
  59.   ;;  
  60.   
  61.   *)  
  62.     echo "Usage: $0 {start|stop|restart|status}"  
  63.   ;;  
  64.   
  65. esac  

 

Ubuntu环境下:

  1. #! /bin/sh  
  2. ### BEGIN INIT INFO  
  3. # Provides:          supervisord  
  4. # Required-Start:    $remote_fs  
  5. # Required-Stop:     $remote_fs  
  6. # Default-Start:     2 3 4 5  
  7. # Default-Stop:      0 1 6  
  8. # Short-Description: Example initscript  
  9. # Description:       This file should be used to construct scripts to be  
  10. #                    placed in /etc/init.d.  
  11. ### END INIT INFO  
  12.    
  13. # Author: Dan MacKinlay <danielm@phm.gov.au>  
  14. # Based on instructions by Bertrand Mathieu  
  15. # http://zebert.blogspot.com/2009/05/installing-django-solr-varnish-and.html  
  16.    
  17. # Do NOT "set -e"  
  18.    
  19. # PATH should only include /usr/* if it runs after the mountnfs.sh script  
  20. PATH=/sbin:/usr/sbin:/bin:/usr/bin  
  21. DESC="Description of the service"  
  22. NAME=supervisord  
  23. DAEMON=/usr/local/bin/supervisord  
  24. DAEMON_ARGS=""  
  25. PIDFILE=/tmp/$NAME.pid  
  26. SCRIPTNAME=/etc/init.d/$NAME  
  27.    
  28. # Exit if the package is not installed  
  29. [ -x "$DAEMON" ] || exit 0  
  30.    
  31. # Read configuration variable file if it is present  
  32. [ -r /etc/default/$NAME ] && . /etc/default/$NAME  
  33.    
  34. # Load the VERBOSE setting and other rcS variables  
  35. . /lib/init/vars.sh  
  36.    
  37. # Define LSB log_* functions.  
  38. # Depend on lsb-base (>= 3.0-6) to ensure that this file is present.  
  39. . /lib/lsb/init-functions  
  40.    
  41. #  
  42. # Function that starts the daemon/service  
  43. #  
  44. do_start()  
  45. {  
  46.     # Return  
  47.     #   0 if daemon has been started  
  48.     #   1 if daemon was already running  
  49.     #   2 if daemon could not be started  
  50.     start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \  
  51.         || return 1  
  52.     start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \  
  53.         $DAEMON_ARGS \  
  54.         || return 2  
  55.     # Add code here, if necessary, that waits for the process to be ready  
  56.     # to handle requests from services started subsequently which depend  
  57.     # on this one.  As a last resort, sleep for some time.  
  58. }  
  59.    
  60. #  
  61. # Function that stops the daemon/service  
  62. #  
  63. do_stop()  
  64. {  
  65.     # Return  
  66.     #   0 if daemon has been stopped  
  67.     #   1 if daemon was already stopped  
  68.     #   2 if daemon could not be stopped  
  69.     #   other if a failure occurred  
  70.     start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME  
  71.     RETVAL="$?"  
  72.     [ "$RETVAL" = 2 ] && return 2  
  73.     # Wait for children to finish too if this is a daemon that forks  
  74.     # and if the daemon is only ever run from this initscript.  
  75.     # If the above conditions are not satisfied then add some other code  
  76.     # that waits for the process to drop all resources that could be  
  77.     # needed by services started subsequently.  A last resort is to  
  78.     # sleep for some time.  
  79.     start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON  
  80.     [ "$?" = 2 ] && return 2  
  81.     # Many daemons don't delete their pidfiles when they exit.  
  82.     rm -f $PIDFILE  
  83.     return "$RETVAL"  
  84. }  
  85.    
  86. #  
  87. # Function that sends a SIGHUP to the daemon/service  
  88. #  
  89. do_reload() {  
  90.     #  
  91.     # If the daemon can reload its configuration without  
  92.     # restarting (for example, when it is sent a SIGHUP),  
  93.     # then implement that here.  
  94.     #  
  95.     start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME  
  96.     return 0  
  97. }  
  98.    
  99. case "$1" in  
  100.   start)  
  101.     [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"  
  102.     do_start  
  103.     case "$?" in  
  104.         0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;  
  105.         2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;  
  106.     esac  
  107.     ;;  
  108.   stop)  
  109.     [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"  
  110.     do_stop  
  111.     case "$?" in  
  112.         0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;  
  113.         2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;  
  114.     esac  
  115.     ;;  
  116.   #reload|force-reload)  
  117.     #  
  118.     # If do_reload() is not implemented then leave this commented out  
  119.     # and leave 'force-reload' as an alias for 'restart'.  
  120.     #  
  121.     #log_daemon_msg "Reloading $DESC" "$NAME"  
  122.     #do_reload  
  123.     #log_end_msg $?  
  124.     #;;  
  125.   restart|force-reload)  
  126.     #  
  127.     # If the "reload" option is implemented then remove the  
  128.     # 'force-reload' alias  
  129.     #  
  130.     log_daemon_msg "Restarting $DESC" "$NAME"  
  131.     do_stop  
  132.     case "$?" in  
  133.       0|1)  
  134.         do_start  
  135.         case "$?" in  
  136.             0) log_end_msg 0 ;;  
  137.             1) log_end_msg 1 ;; # Old process is still running  
  138.             *) log_end_msg 1 ;; # Failed to start  
  139.         esac  
  140.         ;;  
  141.       *)  
  142.         # Failed to stop  
  143.         log_end_msg 1  
  144.         ;;  
  145.     esac  
  146.     ;;  
  147.   *)  
  148.     #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2  
  149.     echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2  
  150.     exit 3  
  151.     ;;  
  152. esac  

 

用root用户执行下面命令把supervisord服务设为开机自启动:

CentOS系统下:

  1. chmod +x /etc/init.d/supervisord  
  2. chkconfig supervisord on  
  3. service supervisord start

Ubuntu系统下:

  1. chmod +x /etc/init.d/supervisord  
  2. update-rc.d supervisord defaults

添加示例:

update-rc.d supervisord defaults
 Adding system startup for /etc/init.d/supervisord ...
   /etc/rc0.d/K20supervisord -> ../init.d/supervisord
   /etc/rc1.d/K20supervisord -> ../init.d/supervisord
   /etc/rc6.d/K20supervisord -> ../init.d/supervisord
   /etc/rc2.d/S20supervisord -> ../init.d/supervisord
   /etc/rc3.d/S20supervisord -> ../init.d/supervisord
   /etc/rc4.d/S20supervisord -> ../init.d/supervisord
   /etc/rc5.d/S20supervisord -> ../init.d/supervisord

 

 

 

5.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都不会自动重启。

 

6.supervisord的配置文件(/etc/supervisord.conf)

  1. ; Sample supervisor config file.  
  2. ;  
  3. ; For more information on the config file, please see:  
  4. ; http://supervisord.org/configuration.html  
  5. ;  
  6. ; Note: shell expansion ("~" or "$HOME"is not supported.  Environment  
  7. ; variables can be expanded using this syntax: "%(ENV_HOME)s".  
  8.   
  9. [unix_http_server]  
  10. file=/tmp/supervisor.sock   ; (the path to the socket file)  
  11. ;chmod=0700                 ; socket file mode (default 0700)  
  12. ;chown=nobody:nogroup       ; socket file uid:gid owner  
  13. ;username=user              ; (default is no username (open server))  
  14. ;password=123               ; (default is no password (open server))  
  15.   
  16. ;[inet_http_server]         ; inet (TCP) server disabled by default  
  17. ;port=127.0.0.1:9001        ; (ip_address:port specifier, *:port for all iface)  
  18. ;username=user              ; (default is no username (open server))  
  19. ;password=123               ; (default is no password (open server))  
  20.   
  21. [inet_http_server]         ; inet (TCP) server disabled by default  
  22. port=0.0.0.0:9001        ; (ip_address:port specifier, *:port for all iface)  
  23. username=supervisor              ; (default is no username (open server))  
  24. password=supervisor               ; (default is no password (open server))  
  25.   
  26. [supervisord]  
  27. logfile=/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log)  
  28. logfile_maxbytes=50MB        ; (max main logfile bytes b4 rotation;default 50MB)  
  29. logfile_backups=10           ; (num of main logfile rotation backups;default 10)  
  30. loglevel=info                ; (log level;default info; others: debug,warn,trace)  
  31. pidfile=/tmp/supervisord.pid ; (supervisord pidfile;default supervisord.pid)  
  32. nodaemon=false               ; (start in foreground if true;default false)  
  33. minfds=1024                  ; (min. avail startup file descriptors;default 1024)  
  34. minprocs=200                 ; (min. avail process descriptors;default 200)  
  35. ;umask=022                   ; (process file creation umask;default 022)  
  36. ;user=chrism                 ; (default is current user, required if root)  
  37. ;identifier=supervisor       ; (supervisord identifier, default is 'supervisor')  
  38. ;directory=/tmp              ; (default is not to cd during start)  
  39. ;nocleanup=true              ; (don't clean up tempfiles at start;default false)  
  40. ;childlogdir=/tmp            ; ('AUTO' child log dir, default $TEMP)  
  41. ;environment=KEY="value"     ; (key value pairs to add to environment)  
  42. ;strip_ansi=false            ; (strip ansi escape codes in logs; def. false)  
  43.   
  44. ; the below section must remain in the config file for RPC  
  45. ; (supervisorctl/web interface) to work, additional interfaces may be  
  46. ; added by defining them in separate rpcinterface: sections  
  47. [rpcinterface:supervisor]  
  48. supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface  
  49.   
  50. [supervisorctl]  
  51. serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL  for a unix socket  
  52. ;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket  
  53. ;username=chris              ; should be same as http_username if set  
  54. ;password=123                ; should be same as http_password if set  
  55. ;prompt=mysupervisor         ; cmd line prompt (default "supervisor")  
  56. ;history_file=~/.sc_history  ; use readline history if available  
  57.   
  58. ; The below sample program section shows all possible program subsection values,  
  59. ; create one or more 'real' program: sections to be able to control them under  
  60. ; supervisor.  
  61.   
  62. ;[program:theprogramname]  
  63. ;command=/bin/cat              ; the program (relative uses PATH, can take args)  
  64. ;process_name=%(program_name)s ; process_name expr (default %(program_name)s)  
  65. ;numprocs=1                    ; number of processes copies to start (def 1)  
  66. ;directory=/tmp                ; directory to cwd to before exec (def no cwd)  
  67. ;umask=022                     ; umask for process (default None)  
  68. ;priority=999                  ; the relative start priority (default 999)  
  69. ;autostart=true                ; start at supervisord start (default: true)  
  70. ;autorestart=unexpected        ; whether/when to restart (default: unexpected)  
  71. ;startsecs=1                   ; number of secs prog must stay running (def1)  
  72. ;startretries=3                ; max # of serial start failures (default 3)  
  73. ;exitcodes=0,2                 ; 'expected' exit codes for process (default 0,2)  
  74. ;stopsignal=QUIT               ; signal used to kill process (default TERM)  
  75. ;stopwaitsecs=10               ; max num secs to wait b4 SIGKILL (default 10)  
  76. ;stopasgroup=false             ; send stop signal to the UNIX process group (default false)  
  77. ;killasgroup=false             ; SIGKILL the UNIX process group (def false)  
  78. ;user=chrism                   ; setuid to this UNIX account to run the program  
  79. ;redirect_stderr=true          ; redirect proc stderr to stdout (default false)  
  80. ;stdout_logfile=/a/path        ; stdout log path, NONE for none; default AUTO  
  81. ;stdout_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)  
  82. ;stdout_logfile_backups=10     ; # of stdout logfile backups (default 10)  
  83. ;stdout_capture_maxbytes=1MB   ; number of bytes in 'capturemode' (default 0)  
  84. ;stdout_events_enabled=false   ; emit events on stdout writes (default false)  
  85. ;stderr_logfile=/a/path        ; stderr log path, NONE for none; default AUTO  
  86. ;stderr_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)  
  87. ;stderr_logfile_backups=10     ; # of stderr logfile backups (default 10)  
  88. ;stderr_capture_maxbytes=1MB   ; number of bytes in 'capturemode' (default 0)  
  89. ;stderr_events_enabled=false   ; emit events on stderr writes (default false)  
  90. ;environment=A="1",B="2"       ; process environment additions (def no adds)  
  91. ;serverurl=AUTO                ; override serverurl computation (childutils)  
  92.   
  93. ; The below sample eventlistener section shows all possible  
  94. ; eventlistener subsection values, create one or more 'real'  
  95. ; eventlistener: sections to be able to handle event notifications  
  96. ; sent by supervisor.  
  97.   
  98. ;[eventlistener:theeventlistenername]  
  99. ;command=/bin/eventlistener    ; the program (relative uses PATH, can take args)  
  100. ;process_name=%(program_name)s ; process_name expr (default %(program_name)s)  
  101. ;numprocs=1                    ; number of processes copies to start (def 1)  
  102. ;events=EVENT                  ; event notif. types to subscribe to (req'd)  
  103. ;buffer_size=10                ; event buffer queue size (default 10)  
  104. ;directory=/tmp                ; directory to cwd to before exec (def no cwd)  
  105. ;umask=022                     ; umask for process (default None)  
  106. ;priority=-1                   ; the relative start priority (default -1)  
  107. ;autostart=true                ; start at supervisord start (default: true)  
  108. ;autorestart=unexpected        ; whether/when to restart (default: unexpected)  
  109. ;startsecs=1                   ; number of secs prog must stay running (def1)  
  110. ;startretries=3                ; max # of serial start failures (default 3)  
  111. ;exitcodes=0,2                 ; 'expected' exit codes for process (default 0,2)  
  112. ;stopsignal=QUIT               ; signal used to kill process (default TERM)  
  113. ;stopwaitsecs=10               ; max num secs to wait b4 SIGKILL (default 10)  
  114. ;stopasgroup=false             ; send stop signal to the UNIX process group (default false)  
  115. ;killasgroup=false             ; SIGKILL the UNIX process group (def false)  
  116. ;user=chrism                   ; setuid to this UNIX account to run the program  
  117. ;redirect_stderr=true          ; redirect proc stderr to stdout (default false)  
  118. ;stdout_logfile=/a/path        ; stdout log path, NONE for none; default AUTO  
  119. ;stdout_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)  
  120. ;stdout_logfile_backups=10     ; # of stdout logfile backups (default 10)  
  121. ;stdout_events_enabled=false   ; emit events on stdout writes (default false)  
  122. ;stderr_logfile=/a/path        ; stderr log path, NONE for none; default AUTO  
  123. ;stderr_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)  
  124. ;stderr_logfile_backups        ; # of stderr logfile backups (default 10)  
  125. ;stderr_events_enabled=false   ; emit events on stderr writes (default false)  
  126. ;environment=A="1",B="2"       ; process environment additions  
  127. ;serverurl=AUTO                ; override serverurl computation (childutils)  
  128.   
  129. ; The below sample group section shows all possible group values,  
  130. ; create one or more 'real' group: sections to create "heterogeneous"  
  131. ; process groups.  
  132.   
  133. ;[group:thegroupname]  
  134. ;programs=progname1,progname2  ; each refers to 'x' in [program:x] definitions  
  135. ;priority=999                  ; the relative start priority (default 999)  
  136.   
  137. ; The [include] section can just contain the "files" setting.  This  
  138. ; setting can list multiple files (separated by whitespace or  
  139. ; newlines).  It can also contain wildcards.  The filenames are  
  140. ; interpreted as relative to this file.  Included files *cannot*  
  141. ; include files themselves.  
  142.   
  143. ;[include]  
  144. ;files = relative/directory/*.ini  
  145.   
  146. [include]  
  147. files = /etc/supervisord.conf.d/*.conf 

 

 

7.管理实例

7.1.测试一个简单的python程序:

在/etc/supervisord.conf.d/目录下生成testsupervisor.conf文件

  1. [program:testsupervisor]  
  2. directory = /opt/testsupervisor  
  3. command = /usr/local/bin/python testsupervisor.py  
  4. priority=1  
  5. numprocs=1  
  6. autostart=true  
  7. autorestart=true  

 

directory表示testsupervisor.py所在的工作目录

command表示执行的命令,注意python要用绝对路径:/usr/local/bin/python

priority表示优先级,用supervisord管理的程序会按优先级从高到低依次启动,数字越多,优先级越高

autostart表示自动启动

autorestart表示自动重启

 

7.2.用supervisord管理 redis程序:

/etc/supervisord.conf.d/目录下生成redis.conf文件

  1. [program:redis]  
  2. directory=/usr/local/src/redis-2.6.16  
  3. command=/usr/local/src/redis-2.6.16/src/redis-server redis.conf  
  4.   
  5. stdout_logfile=/tmp/redis_access.log  
  6. stderr_logfile=/tmp/redis_error.log  
  7. autostart=true  
  8. autorestart=true  
  9. startsecs=10  
  10.   
  11. ; Need to wait for currently executing tasks to finish at shutdown.  
  12. ; Increase this if you have very long running tasks.  
  13. stopwaitsecs = 600  
  14.   
  15. if rabbitmq is supervised, set its priority higher  
  16. ; so it starts first  
  17. priority=10  

7.3.用supervisord管理nginx程序,因为nginx默认就是以daemon方式启动的,所以如果用supervisord来管理nginx的话,必须在nginx的配置文件里添加一行设置daemon off让nginx以非daemon方式启动。(supervisord还要求管理的程序是非daemon程序,supervisord会帮你把它转成daemon程序)

 

在/usr/local/nginx/conf/目录下面修改nginx.conf文件:

  1. worker_processes 2;  
  2. daemon off;  
  3. events {  
  4. #use epoll;  
  5. worker_connections 1024;  
  6. }  
  7. http{  
  8.         #gzip on;  
  9.         #gzip_min_length  100;  
  10.         #gzip_buffers     4 16k;  
  11.         #gzip_http_version 1.0;  
  12.         #gzip_comp_level 2;  
  13.         #gzip_types       text/plain application/x-javascript text/css application/xml;  
  14.         #gzip_vary on;  
  15.   
  16.         upstream 192.168.56.11 {  
  17.         #这里指定多个源服务器,ip:端口,80端口的话可写可不写    
  18.                 server 127.0.0.1:8003;  
  19.                 server 127.0.0.1:8004;  
  20.                 server 127.0.0.1:8005;  
  21.                 server 127.0.0.1:8006;  
  22.   
  23.         }  
  24.         server {  
  25.                 listen 8010;  
  26.                 location / {  
  27.                         #rewrite ^/smmp/servletsendmoremsg\.do$ /send last;  
  28.                         proxy_redirect off;  
  29.                         proxy_set_header Host    $host;  
  30.                         proxy_set_header X-Forwarded-For $remote_addr;  
  31.                         proxy_pass http://192.168.56.11;  
  32.   
  33.                 }  
  34.   
  35.         }  
  36.   
  37. #       server {  
  38. #               listen 443;  
  39. #                ssl                  on;  
  40. #               ssl_certificate      server.crt;  
  41. #               ssl_certificate_key  server.key;  
  42. #  
  43. #               ssl_session_timeout  5m;  
  44. #  
  45. #               ssl_protocols  SSLv2 SSLv3 TLSv1;  
  46. #               ssl_ciphers  HIGH:!aNULL:!MD5;  
  47. #               ssl_prefer_server_ciphers   on;  
  48. #               location / {  
  49. #                        proxy_redirect off;  
  50. #                        proxy_set_header Host    $host;  
  51. #                        proxy_set_header X-Forwarded-For $remote_addr;  
  52. #                        proxy_pass http://192.168.56.11;  
  53. #  
  54. #                }  
  55. #                 
  56. #       }    
  57. }  

 

/etc/supervisord.conf.d/目录下生成nginx.conf文件

 

  1. [program:nginx]  
  2. command=/usr/local/nginx/sbin/nginx  
  3.   
  4. stdout_logfile=/tmp/nginx.log  
  5. stderr_logfile=/tmp/nginx.log  
  6. autostart=true  
  7. autorestart=true  
  8. startsecs=10  
  9.   
  10. ; Need to wait for currently executing tasks to finish at shutdown.  
  11. ; Increase this if you have very long running tasks.  
  12. stopwaitsecs = 600  
  13.   
  14. if rabbitmq is supervised, set its priority higher  
  15. ; so it starts first  
  16. priority=55  

 

7.4.用supervisord管理celery服务(python环境下):

celery官方链接:https://github.com/celery/celery/tree/3.0/extra/supervisord

/etc/supervisord.conf.d/目录下生成celeryd.conf文件,启了两个worker,配置文件中要注意celeryconfig.py的路径:

  1. ; ============================  
  2. ;  celeryd supervisor example  
  3. ; ============================  
  4.   
  5. ; NOTE: If you're using Django, you shouldn't use this file.  
  6. ; Use  
  7. ; http://github.com/celery/django-celery/tree/master/extra/supervisord/celeryd.conf  
  8. ; instead!  
  9.   
  10. [program:celery]  
  11. command=/usr/local/bin/celery worker --loglevel INFO --queues=low_send_task_queue,high_send_task_queue  
  12.   
  13. process_name = %(program_name)s-%(process_num)d  
  14.   
  15. ; Set PYTHONPATH to the directory containing celeryconfig.py  
  16. environment=PYTHONPATH=/usr/local/workspace_eclipse3.7.2/venus  
  17.   
  18. directory=/usr/local/workspace_eclipse3.7.2/venus  
  19.   
  20. numprocs=2  
  21. stdout_logfile=/tmp/celery_sendsms_access.log  
  22. stderr_logfile=/tmp/celery_sendsms_error.log  
  23. autostart=true  
  24. autorestart=true  
  25. startsecs=10  
  26.   
  27. ; Need to wait for currently executing tasks to finish at shutdown.  
  28. ; Increase this if you have very long running tasks.  
  29. stopwaitsecs = 600  
  30.   
  31. if rabbitmq is supervised, set its priority higher  
  32. ; so it starts first  
  33. priority=998  

 

7.5.用supervisord管理celery服务(django环境下):

/etc/supervisord.conf.d/目录下生成celeryd_worker.conf文件

 

  1. ; ==============================================  
  2. ;  celery worker supervisor example for Django  
  3. ; ==============================================  
  4.   
  5. [program:celeryworker]  
  6. command=/usr/local/bin/python manage.py celery worker --loglevel=INFO --queues=db_write_back_queue  
  7. directory=/usr/local/workspace_eclipse3.7.2/sms_web  
  8.   
  9. numprocs=1  
  10. stdout_logfile=/tmp/celeryworker.log  
  11. stderr_logfile=/tmp/celeryworker.log  
  12. autostart=true  
  13. autorestart=true  
  14. startsecs=10  
  15.   
  16. ; Need to wait for currently executing tasks to finish at shutdown.  
  17. ; Increase this if you have very long running tasks.  
  18. stopwaitsecs = 600  
  19.   
  20. if rabbitmq is supervised, set its priority higher  
  21. ; so it starts first  
  22. priority=15  
  23.   
  24. ;process_name = %(program_name)s-%(process_num)d  
  25. ;numprocs=2  

 

/etc/supervisord.conf.d/目录下生成celeryd_beat.conf文件,django环境下的心跳服务

  1. ; ==============================================  
  2. ;  celery worker supervisor example for Django  
  3. ; ==============================================  
  4.   
  5. [program:celerybeat]  
  6. command=/usr/local/bin/python manage.py celery beat -s /var/log/sms_web/celerybeat-schedule --loglevel=INFO  
  7. directory=/usr/local/workspace_eclipse3.7.2/sms_web  
  8.   
  9. numprocs=1  
  10. stdout_logfile=/tmp/celerybeat.log  
  11. stderr_logfile=/tmp/celerybeat.log  
  12. autostart=true  
  13. autorestart=true  
  14. startsecs=10  
  15.   
  16. ; Need to wait for currently executing tasks to finish at shutdown.  
  17. ; Increase this if you have very long running tasks.  
  18. stopwaitsecs = 600  
  19.   
  20. if rabbitmq is supervised, set its priority higher  
  21. ; so it starts first  
  22. priority=14  
  23.   
  24. ;process_name = %(program_name)s-%(process_num)d  
  25. ;numprocs=2  

7.6.用supervisord管理venus服务(启了四个进程):

/etc/supervisord.conf.d/目录下生成venux.conf文件

  1. [program:venus-8003]  
  2. directory=/usr/local/workspace_eclipse3.7.2/venus  
  3. command=/usr/local/bin/python main.py --port=8003  
  4. stdout_logfile=/tmp/venus_8003.log  
  5. stderr_logfile=/tmp/venus_8003.log  
  6. autostart=true  
  7. autorestart=true  
  8. priority=50  
  9.   
  10. [program:venus-8004]  
  11. directory=/usr/local/workspace_eclipse3.7.2/venus  
  12. command=/usr/local/bin/python main.py --port=8004  
  13. stdout_logfile=/tmp/venus_8004.log  
  14. stderr_logfile=/tmp/venus_8004.log  
  15. autostart=true  
  16. autorestart=true  
  17. priority=51  
  18.   
  19. [program:venus-8005]  
  20. directory=/usr/local/workspace_eclipse3.7.2/venus  
  21. command=/usr/local/bin/python main.py --port=8005  
  22. stdout_logfile=/tmp/venus_8005.log  
  23. stderr_logfile=/tmp/venus_8005.log  
  24. autostart=true  
  25. autorestart=true  
  26. priority=52  
  27.   
  28. [program:venus-8006]  
  29. directory=/usr/local/workspace_eclipse3.7.2/venus  
  30. command=/usr/local/bin/python main.py --port=8006  
  31. stdout_logfile=/tmp/venus_8006.log  
  32. stderr_logfile=/tmp/venus_8006.log  
  33. autostart=true  
  34. autorestart=true  
  35. priority=53  
  36. ~             

 

7.7.用supervisord管理接收短信的服务:

/etc/supervisord.conf.d/目录下生成receiver_cmpp.conf文件

  1. [program:receiver-cmpp]  
  2. directory=/usr/local/workspace_eclipse3.7.2/sms_tool  
  3. command=/usr/local/bin/python receiver_cmpp.py  
  4.   
  5. stdout_logfile=/tmp/receiver_cmpp.log  
  6. stderr_logfile=/tmp/receiver_cmpp.log  
  7. autostart=true  
  8. autorestart=true  
  9. startsecs=10  
  10.   
  11. ; Need to wait for currently executing tasks to finish at shutdown.  
  12. ; Increase this if you have very long running tasks.  
  13. stopwaitsecs = 600  
  14.   
  15. if rabbitmq is supervised, set its priority higher  
  16. ; so it starts first  
  17. priority=21  

 

/etc/supervisord.conf.d/目录下添加新的配置文件后,执行命令:

  1. supervisorctl update  

就会把新添加的服务启动起来,且不会影响正在运行的 服务。