/etc/init.d/nginx reload 不起作用

/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 <[email protected]>

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 写入的日志文件。

这是我不知道还能做什么的地方;谷歌以及这个网站“可能已经有答案的问题” - 建议只能找到要求重新加载功能的问题的答案。

答案1

(我知道这不是一个完整的答案,只建议如何排除故障。但至少在这种情况下是有帮助的)

反复检查 nginx 是否确实没有重新加载,即使重新启动后也是如此(nginx 可能处于不健康状态)。很容易误以为 nginx 不会重新加载。

您可以按照以下方式进行验证:

请注意,在许多默认配置中,nginx(Apache 除外)不会在其日志中提及重新加载!例如,在我的 Ubuntu 上,只有当我增加错误日志级别到“调试”。因此我建议每次重新加载时都对配置应用一些小而明确的更改。例如添加

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 确实重新启动但没有重新加载,那么... ping 我,我会尽力帮助你排除故障 :-)

相关内容