| Nginx-ru mailing list archive (nginx-ru@sysoev.ru) [Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
 Re: restart nginx
 
 
On 03.08.2011 12:27, Алексей Масленников wrote:
 
на системе CentOS release 5.3 (Final)
 
где Вы взяли такой древний и глючный инит-скрипт?
 
Запускается раза с 5-го
 
т.е. нормально не работает service nginx start ?
> restart пишет что все ОК, но не работает .
или проблемы только с service nginx restart ?
что при этом пишется на stderr и в error.log ?
 
make_dirs() {
    # make required directories
    user=`nginx -V 2>&1 | grep "configure arguments:" | sed
's/[^*]*--user=\([^ ]*\).*/\1/g' -`
    options=`$nginx -V 2>&1 | grep 'configure arguments:'`
    for opt in $options; do
        if [ `echo $opt | grep '.*-temp-path'` ]; then
            value=`echo $opt | cut -d "=" -f 2`
            if [ ! -d "$value" ]; then
                # echo "creating" $value
                mkdir -p $value && chown -R $user $value
            fi
        fi
    done
}
 
возможно имеет смысл эту функциональность перенести
внутрь /usr/sbin/nginx, чтобы он сам создавал каталоги.
потому что через shell-скрипт получается не очень красиво...
 
stop() {
     echo -n $"Stopping $prog: "
     killproc $prog -QUIT
     retval=$?
     echo
     [ $retval -eq 0 ] && rm -f $lockfile
     return $retval
}
 
причина глюков с restart - именно в этом,
старому экземпляру nginx посылают сигнал -QUIT
- это команда на "плавное завершение" и после
этого - сразу же запускают новый экземпляр.
если убрать -QUIT - то service nginx stop будет завершать
его работу гораздо быстрее, сразу обрывая все соединения.
 
restart() {
     configtest || return $?
     stop
     sleep 1
     start
}
 
sleep 1 - это не очень хороший workaround для вручную созданного
глюка, старый экземпляр nginx может и не успеть выйти за 1 секунду.
кроме того - нет никакого смысла использовать restart, когда
в nginx есть http://sysoev.ru/nginx/docs/control.html#upgrade
да и большинство изменений в конфигурации применяются
с помощью команды service nginx reload
 
force_reload() {
     restart
}
 
очень старый инит-скрипт, эти ошибки были исправлены
в нем еще несколько лет тому назад. по крайней мере,
в init-скрипте из EPEL этих ошибок уже давно нет.
 
Как это отдебажить ? Спасибо.
 
см. в аттаче мой вариант инит-скрипта.
после изменения настроек лучше делать service nginx reload
а после обновления бинарника или чтобы на 100 % быть уверенным,
что все изменения применились - service nginx force-reload
service nginx restart не имеет смысла вообще использовать.
разве что только в том случае когда nginx так зависнет,
что никак нельзя будет завершить, а только через kill -9
( но лучше будет причину этой ошибки найти и устранить )
там я еще сделал некоторую часть работы для того, чтобы
можно было запускать одновременно несколько независимых
экземпляров nginx на одном сервере, просто копируя
инит-скрипт, например, в nginx-frontend, nginx-static, и т.п.
меняя переменную pidfile и значение переменной instance -
но пока что полностью это сделать не удалось - в nginx
жестко вкомпилировано имя error.log файла и поэтому
разные экземпляры nginx будут писать ошибки в один
и тот же лог-файл, что не очень удобно и трудно
потом будет понять, что к чему относится.
на FreeBSD насколько я знаю, nginx "из коробки"
поддерживает такой режим работы, что можно запускать
несколько полностью независимых друг от друга экземпляров,
но на Linux - такую функциональность сейчас сделать нельзя,
не компилируя его много раз с различными параметрами configure.
--
Best regards,
 Gena
 #!/bin/sh
# chkconfig: - 85 15
# description: nginx [engine x] is a HTTP server written by Igor Sysoev
. /etc/rc.d/init.d/functions
. /etc/sysconfig/network
[ "$NETWORKING" = "no" ] && exit 0
binary=/usr/sbin/nginx
instance=nginx
pidfile="/var/run/nginx.pid"
config="/etc/nginx/$instance.conf"
lockfile="/var/lock/subsys/$instance"
sysconfig="/etc/sysconfig/$instance"
[ -f $sysconfig ] && . $sysconfig
start() {
    [ -x $binary ] || exit 5
    [ -f $config ] || exit 6
    echo -n $"Starting $instance: "
    daemon $binary -c $config 
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}
stop() {
    echo -n $"Stopping $instance: "
    killproc -p $pidfile $instance
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}
restart() {
    configtest_q || return 6
    stop
    start
}
online_upgrade() { 
    configtest_q || return 6
    echo -n $"Upgrading $instance: "
    kill -USR2 `cat /var/run/$instance.pid`
    sleep 1
    if test -f /var/run/$instance.pid.oldbin
    then
        kill -QUIT `cat /var/run/$instance.pid.oldbin`
        success $"$instance online upgrade"
        echo
    else
        failure $"$instance online upgrade"
        echo
        exit 1
    fi
}
reload() {
    configtest_q || return 6
    echo -n $"Reloading $instance: "
    killproc -p $pidfile $instance -HUP
    retval=$?
    echo
    return $retval
}
rotate(){
    configtest_q || return 6
    echo -n $"Rotating $instance logs: "
    killproc -p $pidfile $instance -USR1
    retval=$?
    echo
    return $retval
}
configtest() {
  $binary -t -c $config 
}
configtest_q() {
  $binary -t -q -c $config 
}
rh_status() {
    status -p $pidfile $instance
}
rh_status_q() {
    rh_status >/dev/null 2>&1
}
case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload|online-upgrade|upgrade)
        rh_status_q || exit 7
        online_upgrade
        ;;
    condrestart|try-restart)
        rh_status_q || exit 7
        restart
        ;;
    restart|configtest|rotate)
        $1
        ;;
    status|status_q)
        rh_$1
        ;;
    *)
        echo $"Usage: $0 
{start|stop|reload|force-reload|restart|try-restart|status|rotate|configtest}"
        exit 2
esac
/var/log/nginx/*log {
    daily
    rotate 9
    missingok
    notifempty
    compress
    sharedscripts
    postrotate
        [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
    endscript
}
# Configuration file for the nginx service
ulimit -n 16384
# set this to the location of the nginx configuration file
config=/etc/nginx/nginx.conf
 _______________________________________________
nginx-ru mailing list
nginx-ru@xxxxxxxxx
http://mailman.nginx.org/mailman/listinfo/nginx-ru
 
 |