我的先前的问题发现重新加载我的 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 我,我会尽力帮助你排除故障 :-)