停止并重新启动 Apache HTTP Server

本文档介绍了在类似 Unix 的系统上停止和重新启动 Apache HTTP Server。 Windows NT,2000 和 XP 用户应参阅将 httpd 作为服务运行,而 Windows 9x 和 ME 用户应参见将 httpd 作为控制台应用程序运行,以获取有关如何在这些平台上控制 httpd 的信息。

Introduction

为了停止或重新启动 Apache HTTP Server,必须向正在运行的httpd进程发送 signal。有两种发送 signal 的方法。首先,您可以使用 unix kill命令直接将 signal 发送到进程。您会注意到系统上正在运行许多httpd可执行文件,但是除了父对象(其 pid 在PidFile中)之外,您不应向其中任何一个发送 signal。也就是说,除了父进程外,您根本不需要向其他进程发送 signal。您可以发送四个 signal 来发送父对象:TERMUSR1HUPWINCH,稍后将对其进行描述。

要将 signal 发送给 parent,您应该发出以下命令:

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

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

发出httpdsignal 后,您可以通过发出以下命令来了解其进度:

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

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

Stop Now

向 parent 发送TERMstopsignal 会使它立即尝试杀死所有孩子。杀死所有孩子可能要花几秒钟。然后 parent 本身退出。正在进行的所有请求都将终止,并且不再处理其他请求。

Graceful Restart

USR1gracefulsignal 使父进程建议子进程在其当前请求之后退出(或者如果他们没有提供任何服务,则立即退出)。父级重新读取其配置文件并重新打开其日志文件。随着每个孩子的死亡,父级将其替换为新的“ *”配置中的一个子级,该子级立即开始处理新请求。

此代码旨在始终遵守 MPM 的流程控制指令,因此在整个重新启动过程中,可为 Client 使用的进程和线程数将保持在适当的值。此外,它以下列方式尊重StartServers:如果在一秒钟之后至少StartServers没有创建新的子代,则创建足够的子代以吸收松弛。因此,代码尝试既保持适合服务器当前负载的子代数量,又使用StartServers参数尊重您的意愿。

mod_status的用户将注意到,发送USR1时,服务器统计信息未“ *”设置为零。编写代码既可以最大程度地减少服务器无法处理新请求的时间(它们将由 os 排队,因此无论如何它们都不会丢失),并且可以尊重您的调整参数。为了做到这一点,它必须保留 scoreboard *来跟踪几代人的所有孩子。

状态模块还将使用G来指示在 continue 正常重启之前仍在启动请求的子级。

当前,无法使用USR1进行日志轮转脚本来确定所有编写预重启日志的子级都已完成。我们建议您在发送USR1signal 之后使用适当的延迟,然后再对旧日志执行任何操作。例如,如果您的大多数匹配在不到 10 分钟的时间内就可以通过低带宽链接完成,那么您可以 await 15 分钟,然后再对旧日志执行任何操作。

Note

发出重新启动时,将首先运行语法检查,以确保配置文件中没有错误。如果配置文件中包含错误,则会收到有关该语法错误的错误消息,并且服务器将拒绝重新启动。这样可以避免服务器停止然后无法重新启动的情况,从而使服务器无法运行。

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

Restart Now

HUPrestartsignal 发送给父级会导致它杀死TERM中的子级,但父级不会退出。它重新读取其配置文件,并重新打开所有日志文件。然后,它会产生一组新的孩子,并 continue 投放热门歌曲。

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

Note

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

Graceful Stop

WINCHgraceful-stopsignal 使父进程建议子进程在其当前请求之后退出(或者如果他们没有提供任何服务,则立即退出)。然后,父级将删除其PidFile并停止侦听所有端口。父级将 continue 运行,并监视正在处理请求的子级。一旦所有子项都已完成并退出或达到GracefulShutdownTimeout指定的超时,父项也将退出。如果达到超时,则将向所有剩余的孩子发送TERMsignal 以迫使他们退出。

处于正常状态时,TERMsignal 将立即终止父进程和所有子进程。但是,由于PidFile将被删除,因此您将无法使用apachectlhttpd发送此 signal。

Note

graceful-stopsignal 允许您同时运行httpd的多个相同配置的实例。在执行 httpd 的正常升级时,这是一项强大的功能,但是在某些配置下,它也会导致死锁和争用情况。

注意确保磁盘上的文件(例如锁定文件(Mutex)和 Unix 套接字文件(ScriptSock))包含服务器 PID,并且应共存而不会出现问题。但是,如果配置指令,第三方模块或持久性 CGI 使用任何其他磁盘上的锁或状态文件,则应注意确保httpd的多个运行实例不会破坏彼此的文件。

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

首页