Назад | Перейти на главную страницу

/etc/init.d/nginx reload не работает

Мой более ранняя проблема показал, что перезагрузка конфигурации моего обратного прокси-сервера Debian GNU / Linux 6.0 nginx не работает, в то время как перезапуск или перезагрузка напрямую через двоичный файл работают.

Я заглянул в файл /etc/init.d/nginx, чтобы увидеть, что именно там может пойти не так, но поскольку это написано Сергей Будневич из nginx я не осмелился возиться с ним.

Содержимое моей, вероятно, старой версии файла:

#!/bin/sh
### BEGIN INIT INFO
# Provides:          nginx
# Required-Start:    $network $remote_fs $local_fs
# Required-Stop:     $network $remote_fs $local_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Stop/start nginx
### END INIT INFO

# Author: Sergey Budnevitch <sb@nginx.com>

PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC=nginx
NAME=nginx
CONFFILE=/etc/nginx/nginx.conf
DAEMON=/usr/sbin/nginx
DAEMON_ARGS="-c $CONFFILE"
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

[ -x $DAEMON ] || exit 0

[ -r /etc/default/$NAME ] && . /etc/default/$NAME

. /lib/init/vars.sh

. /lib/lsb/init-functions

do_start()
{
    start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
        $DAEMON_ARGS
    RETVAL="$?"
    return "$RETVAL"
}

do_stop()
{
    # Return
    #   0 if daemon has been stopped
    #   1 if daemon was already stopped
    #   2 if daemon could not be stopped
    #   other if a failure occurred
    start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
    RETVAL="$?"
    rm -f $PIDFILE
    return "$RETVAL"
}

do_reload() {
    #
    start-stop-daemon --stop --signal HUP --quiet --pidfile $PIDFILE --name $NAME
    RETVAL="$?"
    return "$RETVAL"
}

do_configtest() {
    if [ "$#" -ne 0 ]; then
        case "$1" in
            -q)
                FLAG=$1
                ;;
            *)
                ;;
        esac
        shift
    fi
    $DAEMON -t $FLAG -c $CONFFILE
    RETVAL="$?"
    return $RETVAL
}

do_upgrade() {
    OLDBINPIDFILE=$PIDFILE.oldbin

    do_configtest -q || return 6
    start-stop-daemon --stop --signal USR2 --quiet --pidfile $PIDFILE --name $NAME
    RETVAL="$?"
    sleep 1
    if [ -f $OLDBINPIDFILE -a -f $PIDFILE ]; then
        start-stop-daemon --stop --signal QUIT --quiet --pidfile $OLDBINPIDFILE --name $NAME
        RETVAL="$?"
    else
        echo $"Upgrade failed!"
        RETVAL=1
        return $RETVAL
    fi
}

case "$1" in
    start)
        [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC " "$NAME"
        do_start
        case "$?" in
            0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
            2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
    stop)
        [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
        do_stop
        case "$?" in
            0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
            2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
  status)
        status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
        ;;
  configtest)
        do_configtest
        ;;
  upgrade)
        do_upgrade
        ;;
  reload|force-reload)
        log_daemon_msg "Reloading $DESC" "$NAME"
        do_reload
        log_end_msg $?
        ;;
  restart|force-reload)
        log_daemon_msg "Restarting $DESC" "$NAME"
        do_configtest -q || exit $RETVAL
        do_stop
        case "$?" in
            0|1)
                do_start
                case "$?" in
                    0) log_end_msg 0 ;;
                    1) log_end_msg 1 ;; # Old process is still running
                    *) log_end_msg 1 ;; # Failed to start
                esac
                ;;
            *)
                # Failed to stop
                log_end_msg 1
                ;;
        esac
        ;;
    *)
        echo "Usage: $SCRIPTNAME {start|stop|status|restart|reload|force-reload|upgrade|configtest}" >&2
        exit 3
        ;;
esac

exit $RETVAL

Я также не смог найти файл журнала, в который записывается log_daemon_msg.

Вот где я не знаю, что еще делать; Google, а также эти сайты "Вопросы, на которые, возможно, уже есть ваш ответ" - предложения находят ответы только на вопросы, касающиеся функции перезагрузки.

(Я знаю, что это не полный ответ, а только посоветуйте, как устранить неполадки. Но это помогло, по крайней мере, в этом случае)

Дважды и трижды проверьте, что nginx действительно не перезагружается, даже после перезапуска (nginx может зависнуть в неработоспособном состоянии). Легко ошибочно думать, что nginx не перезагружается.

Вот как вы можете проверить:

Обратите внимание, что во многих конфигурациях по умолчанию nginx - кроме Apache - не упоминает перезагрузку в своих журналах! Например. на моем Убунтусе я получаю реакцию в логах, только если увеличиваю error_log level для «отладки». Поэтому я рекомендую вносить небольшие и однозначные изменения в вашу конфигурацию при каждой перезагрузке. Например. Добавить

add_header X-config-version 0001;

и увеличивайте его перед каждой перезагрузкой. Затем вы можете проверить, что конфигурация nginx использует через

curl -s -I $URL | grep X-config-version

Кроме того, проверяйте синтаксис конфигурации перед каждой попыткой перезагрузки (да, nginx должен выдает правильное сообщение об ошибке при попытке перезагрузки неправильной конфигурации. Но все же вы хотите исключить эту возможную причину):

$PATH_TO/nginx  -t

Теперь тестовая перезагрузка. Чтобы быть уверенным, избегайте сценариев, предоставляемых ОС (/etc/init.d/nginx, service / invoke-rc.d / reload, ...), и попробуйте два официальные методы:

$PATH_TO/nginx  -s reload

и / или

kill  -HUP  $PID_OF_NGINX_MASTER_PROCESS

например

kill  -HUP  `cat /var/run/nginx.pid`

Если вы доказали, что nginx действительно перезагружается, но не перезагружается, то ... свяжитесь со мной, и я постараюсь помочь вам в устранении неполадок :-)