Мой более ранняя проблема показал, что перезагрузка конфигурации моего обратного прокси-сервера 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 действительно перезагружается, но не перезагружается, то ... свяжитесь со мной, и я постараюсь помочь вам в устранении неполадок :-)