/etc/init.d/nginx重新加载不工作

我以前的问题显示,重新加载我的Debian GNU / Linux 6.0 nginx反向代理的configuration不起作用,而重新启动,或直接通过二进制重新加载确实工作。

我已经看了/etc/init.d/nginx文件,看看究竟会出现什么问题,但是由于这是从Nginx的Sergey Budnevitch写的,我不敢捣鼓它。

我可能旧版本的文件的内容:

#!/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 

我也无法findlog_daemon_msg写入的日志文件。

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

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

双重和三重检查nginx是否真的不重新加载,即使在重新启动(nginx可能卡住在不健康的状态)。 错误地认为nginx不会重新加载很容易。

以下是您可以validation的方法:

请注意,在许多默认configuration中,nginx不是Apache而是在其日志中提及重载! 例如,在我的Ubuntus上,如果我将error_log级别增加到“debug”,我只会在日志中得到一个反应。 因此,我build议您在每次重新加载时都对您的configuration进行一些小而明确的更改。 例如添加

 add_header X-config-version 0001; 

并在每次重新加载之前增加它。 然后你可以检查女巫configurationnginx正在使用通过

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

另外,在每次重新加载之前validationconfiguration语法(是的,当尝试重新加载一个错误的configuration时,nginx会给你一个正确的错误信息,但是仍然要排除这个可能的原因):

 $PATH_TO/nginx -t 

现在testing重新加载。 可以肯定的是,要避免操作系统提供的脚本(/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` 

如果你已经certificatenginx真的是重新启动,但不能重新加载,那么… ping我,我会尽力帮助你排除故障:-)