本文档介绍了在类似Unix的系统上停止和重新启动Apache HTTP Server。Windows NT,2000和XP用户应看到将 httpd作为服务运行,而Windows 9x和ME用户应看到将httpd作为控制台应用程序运行,以获取有关如何在这些平台上控制httpd的信息。
为了停止或重新启动Apache HTTP Server,必须向正在运行的httpd
进程发送信号。有两种发送信号的方法。首先,您可以使用unix kill
命令将信号直接发送到进程。您会注意到httpd
系统上正在运行许多可执行文件,但是除了父对象(其pid位于内)之外,您不应向其他任何可执行文件发送信号PidFile
。也就是说,除了父进程外,您根本不需要向其他进程发送信号。有四个信号,您可以发送父:
TERM
,
USR1
,
HUP
,和
WINCH
,这将在稍后进行描述。
要将信号发送给父母,您应该发出以下命令:
kill -TERM `cat /usr/local/apache2/logs/httpd.pid`
信令的第二种方法httpd
过程是使用-k
命令行选项:stop
,
restart
,graceful
和graceful-stop
,如下所述。这些是httpd
二进制文件的参数,但是我们建议您使用apachectl
控制脚本将其发送,该脚本会将它们传递给httpd
。
发出信号后httpd
,可以通过发出以下命令来了解其进度:
tail -f /usr/local/apache2/logs/error_log
修改这些示例以匹配您的ServerRoot
和PidFile
设置。
apachectl -k stop
向父级发送TERM
或stop
信号会使它立即尝试杀死所有子级。杀死所有孩子可能要花几秒钟。然后父母本身退出。正在进行的所有请求都将终止,并且不再处理其他请求。
apachectl -k graceful
该USR1
或graceful
信号使得父进程建议他们当前的请求后的孩子退出(或立即如果他们没有任何服务出口)。父级重新读取其配置文件并重新打开其日志文件。随着每个孩子的死亡,父级将其替换为新一代配置中的一个子级,该配置立即开始处理新请求。
此代码旨在始终遵循MPM的流程控制指令,因此在重新启动过程中,可为客户使用的流程和线程数将保持在适当的值。此外,它还
StartServers
遵循以下方式:如果在一秒钟后至少StartServers
没有创建新的子代,则创建足够的子代以吸收松弛。因此,代码尝试既保持适合于服务器当前负载的子代数量,又使用StartServers
参数来满足您的期望
。
的用户mod_status
会注意到,发送
a时,服务器统计信息未设置为零USR1
。编写代码既可以最大程度地减少服务器无法处理新请求的时间(它们将由操作系统排队,因此无论如何它们都不会丢失),并且可以尊重您的调整参数。为了做到这一点,它必须保持
记分板用于跟踪几代人的所有孩子。
状态模块还将使用a G
来指示在继续正常重启之前仍在启动请求的子级。
当前,日志轮换脚本
USR1
无法确定所有编写预重启日志的孩子都已完成。我们建议您在发送USR1
信号之后使用适当的延迟,然后再对旧日志执行任何操作。例如,如果对于低带宽链接的用户而言,大多数匹配仅花费不到10分钟即可完成,那么您可以等待15分钟,然后再对旧日志执行任何操作。
apachectl -k restart
向父级发送HUP
或restart
信号会使它杀死in中的子级
TERM
,但父级不会退出。它重新读取其配置文件,并重新打开所有日志文件。然后,它会产生一组新的孩子,并继续提供热门歌曲。
的用户mod_status
会注意到,HUP
发送a时,服务器统计信息将设置为零
。
apachectl -k graceful-stop
该WINCH
或graceful-stop
信号使得父进程建议他们当前的请求后的孩子退出(或立即如果他们没有任何服务出口)。然后父级将删除其PidFile
并停止侦听所有端口。父级将继续运行,并监视正在处理请求的子级。一旦所有子项都已完成并退出或GracefulShutdownTimeout
达到所指定的超时,父项也将退出。如果达到超时,则将向所有剩余的孩子发送TERM
信号,迫使他们退出。
一个TERM
信号会立即终止在“优雅”状态的父进程和所有的孩子时。但是,由于PidFile
将被删除,您将无法使用
apachectl
或httpd
发送该信号。
该graceful-stop
信号使您可以同时运行多个相同配置的实例httpd
。在执行httpd的正常升级时,这是一项强大的功能,但是在某些配置下,它也会导致死锁和竞争情况。
注意确保磁盘文件(例如锁定文件(Mutex
)和Unix套接字文件(ScriptSock
))包含服务器PID,并且应共存而不会出现问题。但是,如果配置指令,第三方模块或持久性CGI使用任何其他磁盘上的锁或状态文件,则应确保确保多个正在运行的实例httpd
不会破坏彼此的文件。
您还应该警惕其他潜在的竞争条件,例如使用rotatelogs
样式管道记录。rotatelogs
尝试同时旋转同一日志文件的多个正在运行的实例可能会破坏彼此的日志文件。