Как я могу надежно запустить несколько серверов DJango FCGI при запуске? - PullRequest
1 голос
/ 05 марта 2012

В настоящее время я использую следующий скрипт для запуска моих серверов 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

Это работает нормально, но когда моя хостинговая компания перезагружаетсянаш сервер оставляет мне две проблемы:

  1. У меня нет автоматического способа запуска нескольких сайтов.
  2. В итоге у меня есть файл mysite_fcgi.pid, но никакого связанного процесса.

Итак, у меня есть два вопроса:

  1. Как автоматически запустить список сайтов (хранящихся в текстовом файле) при запуске?то есть звоните /var/django/server.sh mysite1 start, затем /var/django/server.sh myothersite start?
  2. Как избавиться от файла .pid, если процесс не существует, и попытаться запустить сервер как обычно?

Ответы [ 2 ]

1 голос
/ 05 марта 2012

Как автоматически запустить список сайтов (хранящихся в виде простого текстового файла) при запуске?

Как правило, ваша ОС предоставляет файл, в котором вы можете перехватить ваши команды при запуске. Например, arch linux использует rc.local , gentoo либо /etc/local.start либо /etc/local.d/*.start, debian требует от вас сделать сценарий инициализации - который в основном является сценарием, который принимает в качестве аргумента «start» или «stop» и находится в /etc/init.d или /etc/rc.d в зависимости от дистрибутива ...

Вы можете использовать некоторый код bash как таковой.

for site in $(</path/to/text/file); do
    /var/django/server.sh $site start
done

Как мне избавиться от файла .pid, если процесс не существует, и попытаться запустить сервер как обычно?

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
1 голос
/ 05 марта 2012
  1. Создайте сценарий инициализации и назначьте его соответствующему уровню выполнения.
  2. Вам необходимо реализовать это в своем сценарии запуска / инициализации (который вы напишете в шаге 1)

Или используйте менеджер процессов, например supervisord , который позаботится обо всех ваших проблемах.

Вот пример конфигурации для fcgi из supervisord.

[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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...