<-
Apache > HTTP Server > 文档 > 版本 2.4

停止和重启 Apache HTTP Server

可用语言:  de  |  en  |  es  |  fr  |  ja  |  ko  |  tr 

本文档介绍如何在类 Unix 系统上停止和重启 Apache HTTP Server。Windows NT、2000 和 XP 用户请参阅 运行 httpd 作为服务,Windows 9x 和 ME 用户请参阅 运行 httpd 作为控制台应用程序,了解如何在这些平台上控制 httpd。

Support Apache!

另请参阅

top

简介

为了停止或重启 Apache HTTP Server,您必须向正在运行的 httpd 进程发送信号。有两种方法可以发送信号。首先,您可以使用 unix 的 kill 命令直接向进程发送信号。您会注意到系统上运行着许多 httpd 可执行文件,但您不应该向除父进程之外的任何进程发送信号,父进程的 pid 位于 PidFile 中。也就是说,您永远不需要向除父进程之外的任何进程发送信号。您可以向父进程发送四种信号:TERMUSR1HUPWINCH,这些信号将在稍后介绍。

要向父进程发送信号,您应该发出类似以下的命令:

kill -TERM `cat /usr/local/apache2/logs/httpd.pid`

httpd 进程发送信号的第二种方法是使用 -k 命令行选项:stoprestartgracefulgraceful-stop,如下所述。这些是 httpd 二进制文件的参数,但我们建议您使用 apachectl 控制脚本发送它们,该脚本会将它们传递给 httpd

在您向 httpd 发送信号后,您可以通过发出以下命令来了解其进度:

tail -f /usr/local/apache2/logs/error_log

修改这些示例以匹配您的 ServerRootPidFile 设置。

top

立即停止

信号:TERM
apachectl -k stop

向父进程发送 TERMstop 信号会导致它立即尝试杀死所有子进程。它可能需要几秒钟才能完成杀死子进程的操作。然后父进程本身退出。任何正在进行的请求都会被终止,并且不再接受任何请求。

top

平滑重启

信号:USR1
apachectl -k graceful

USR1graceful 信号会导致父进程建议子进程在完成当前请求后退出(或者如果它们没有提供任何服务,则立即退出)。父进程会重新读取其配置文件并重新打开其日志文件。当每个子进程死亡时,父进程会用来自新配置的子进程替换它,该子进程会立即开始提供新请求的服务。

此代码旨在始终尊重 MPM 的进程控制指令,因此在整个重启过程中,可用于为客户端提供服务的进程和线程数量将保持在适当的值。此外,它会以以下方式尊重 StartServers:如果在一秒钟后至少创建了 StartServers 个新子进程,则创建足够的子进程来弥补不足。因此,代码试图同时保持适合当前服务器负载的子进程数量,并尊重您对 StartServers 参数的意愿。

mod_status 的用户会注意到,当发送 USR1 时,服务器统计信息不会被设置为零。该代码的编写是为了最大限度地减少服务器无法为新请求提供服务的时长(它们将被操作系统排队,因此无论如何都不会丢失),并尊重您的调整参数。为了做到这一点,它必须保留用于跟踪所有子进程的记分牌,这些子进程跨越多个代。

状态模块还将使用 G 来指示仍在为在发出平滑重启之前启动的请求提供服务的子进程。

目前,使用 USR1 的日志轮换脚本无法确定所有写入重启前日志的子进程是否已完成。我们建议您在发送 USR1 信号后等待一段时间,然后再对旧日志进行任何操作。例如,如果大多数用户的命中在低带宽链接上完成需要不到 10 分钟的时间,那么您可以在对旧日志进行任何操作之前等待 15 分钟。

当您发出重启命令时,首先会运行语法检查,以确保配置文件中没有错误。如果您的配置文件中存在错误,您将收到有关该语法错误的错误消息,并且服务器将拒绝重启。这避免了服务器停止后无法重启的情况,从而导致服务器无法正常工作。

这仍然不能保证服务器能够正确重启。为了检查配置文件的语义以及语法,您可以尝试以非 root 用户身份启动 httpd。如果没有错误,它将尝试打开其套接字和日志,并由于它不是 root(或者因为当前正在运行的 httpd 已经绑定了这些端口)而失败。如果它因任何其他原因而失败,那么它很可能是配置文件错误,并且应该在发出平滑重启之前修复该错误。

top

立即重启

信号:HUP
apachectl -k restart

向父进程发送 HUPrestart 信号会导致它像 TERM 中那样杀死其子进程,但父进程不会退出。它会重新读取其配置文件,并重新打开任何日志文件。然后它会生成一组新的子进程,并继续提供命中服务。

mod_status 的用户会注意到,当发送 HUP 时,服务器统计信息被设置为零。

与平滑重启一样,在尝试重启之前会运行语法检查。如果您的配置文件中存在错误,则不会尝试重启,并且您将收到有关语法错误的通知。
top

平滑停止

信号:WINCH
apachectl -k graceful-stop

WINCHgraceful-stop 信号会导致父进程建议子进程在完成当前请求后退出(或者如果它们没有提供任何服务,则立即退出)。然后,父进程会删除其 PidFile 并停止监听所有端口。父进程将继续运行,并监控正在处理请求的子进程。一旦所有子进程都完成并退出,或者 GracefulShutdownTimeout 指定的超时时间已到,父进程也会退出。如果超时时间已到,任何剩余的子进程都会收到 TERM 信号以强制它们退出。

当处于“平滑”状态时,TERM 信号会立即终止父进程及其所有子进程。但是,由于 PidFile 将被删除,因此您将无法使用 apachectlhttpd 发送此信号。

graceful-stop 信号允许您同时运行多个配置相同的 httpd 实例。当执行 httpd 的平滑升级时,这是一个强大的功能,但是它也可能导致某些配置出现死锁和竞争条件。

已经采取措施确保磁盘上的文件(如锁文件 (Mutex) 和 Unix 套接字文件 (ScriptSock))包含服务器 PID,并且应该能够在没有问题的情况下共存。但是,如果配置指令、第三方模块或持久 CGI 使用任何其他磁盘上的锁或状态文件,则应注意确保多个正在运行的 httpd 实例不会相互覆盖文件。

您还应该注意其他潜在的竞争条件,例如使用 rotatelogs 样式的管道日志记录。多个正在运行的 rotatelogs 实例尝试同时轮换相同的日志文件可能会破坏彼此的日志文件。

可用语言:  de  |  en  |  es  |  fr  |  ja  |  ko  |  tr 

top

评论

注意
这不是一个问答部分。此处发布的评论应针对改进文档或服务器的建议,如果我们的版主认为这些评论已实施或被认为无效/偏离主题,则可能会被删除。有关如何管理 Apache HTTP Server 的问题应发送到我们的 IRC 频道 #httpd(位于 Libera.chat)或发送到我们的 邮件列表