如何在启动时可靠地启动多个DJango FCGI服务器?

如何在启动时可靠地启动多个DJango FCGI服务器?,django,linux,bash,ubuntu,Django,Linux,Bash,Ubuntu,我目前使用以下脚本启动DJango FCGI服务器: #!/bin/bash MYAPP=$1 PIDFILE=/var/run/${MYAPP}_fcgi.pid SOCKET=/var/django/${MYAPP}/socket.sock MANAGESCRIPT=/var/django/${MYAPP}/manage.py # Maximum requests for a child to service before expiring #MAXREQ= # Spawning metho

我目前使用以下脚本启动DJango FCGI服务器:

#!/bin/bash
MYAPP=$1
PIDFILE=/var/run/${MYAPP}_fcgi.pid
SOCKET=/var/django/${MYAPP}/socket.sock
MANAGESCRIPT=/var/django/${MYAPP}/manage.py
# Maximum requests for a child to service before expiring
#MAXREQ=
# Spawning method - prefork or threaded
#METHOD=
# Maximum number of children to have idle
MAXSPARE=2
# Minimum number of children to have idle
MINSPARE=1
# Maximum number of children to spawn
MAXCHILDREN=3

cd "`dirname $0`"

function failure () {
  STATUS=$?;
  echo; echo "Failed $1 (exit code ${STATUS}).";
  exit ${STATUS};
}

function start_server () {
  $MANAGESCRIPT runfcgi socket=$SOCKET pidfile=$PIDFILE \
    ${MAXREQ:+maxrequests=$MAXREQ} \
    ${METHOD:+method=$METHOD} \
    ${MAXSPARE:+maxspare=$MAXSPARE} \
    ${MINSPARE:+minspare=$MINSPARE} \
    ${MAXCHILDREN:+maxchildren=$MAXCHILDREN} \
    ${DAEMONISE:+damonize=True}
  touch $SOCKET
  chown www-data:www-data $SOCKET
  chmod 755 $SOCKET
}

function stop_server () {
  if [ -f "$PIDFILE" ]
  then
    kill `cat $PIDFILE` || failure "Server was not running."
    rm $PIDFILE
  fi
}

DAEMONISE=$3

case "$2" in
  start)
    echo -n "Starting fcgi: "
    [ -e $PIDFILE ] && { echo "PID file exsts."; exit; }
    start_server || failure "starting fcgi"
    echo "Done."
    ;;
  stop)
    echo -n "Stopping fcgi: "
    [ -e $PIDFILE ] || { echo "No PID file found."; exit; }
    stop_server
    echo "Done."
    ;;
  restart)
    echo -n "Restarting fcgi: "
    [ -e $PIDFILE ] || { echo -n "No PID file found..."; }
    stop_server
    start_server || failure "restarting fcgi"
    echo "Done."
    ;;
  *)
    echo "Usage: $0 {start|stop|restart} [--daemonise]"
    ;;
esac

exit 0
我手动将其称为:

/var/django/server.sh mysite start
这很好,但当我的主机公司重新启动服务器时,会给我留下两个问题:

  • 我没有一种自动启动多个站点的方法
  • 我最终得到了一个
    mysite\u fcgi.pid
    文件,但没有关联的进程
  • 所以我有两个问题:

  • 如何在启动时自动启动站点列表(存储在纯文本文件中)?i、 e.调用
    /var/django/server.sh mysite1 start
    然后
    /var/django/server.sh myothersite start
  • 如果进程不存在并尝试正常启动服务器,我如何摆脱.pid文件
  • 创建init脚本并将其分配给相应的运行级别
  • 您需要在startup/init脚本(您将在步骤1中编写)中实现这一点
  • 或者,使用像这样的流程管理器来处理您的所有问题

    下面是supervisord提供的fcgi配置示例

    [fcgi-program:fcgiprogramname]
    command=/usr/bin/example.fcgi
    socket=unix:///var/run/supervisor/%(program_name)s.sock
    process_name=%(program_name)s_%(process_num)02d
    numprocs=5
    priority=999
    autostart=true
    autorestart=unexpected
    startsecs=1
    startretries=3
    exitcodes=0,2
    stopsignal=QUIT
    stopwaitsecs=10
    user=chrism
    redirect_stderr=true
    stdout_logfile=/a/path
    stdout_logfile_maxbytes=1MB
    stdout_logfile_backups=10
    stderr_logfile=/a/path
    stderr_logfile_maxbytes=1MB
    stderr_logfile_backups
    environment=A=1,B=2
    
    如何在启动时自动启动站点列表(存储在纯文本文件中)? 通常,操作系统提供了一个文件,您可以在启动时在其中挂接命令。例如,,-基本上是一个以“start”或“stop”为参数的脚本,根据发行版的不同,它位于/etc/init.d或/etc/rc.d中

    您可以使用一些bash代码

    for site in $(</path/to/text/file); do
        /var/django/server.sh $site start
    done
    
    中的站点的
    $(
    
    if [[ -f $PIDFILE ]]; then # if pidfile exists
        if [[ ! -d /proc/$(<$PIDFILE)/ ]]; then # if it contains a non running proc
            unlink $PIDFILE # delete the pidfile
        fi
    fi