Apache HTTP Server 版本 2.4

本文档介绍如何在类 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 gracefulUSR1 或 graceful 信号会导致父进程建议子进程在完成当前请求后退出(或者如果它们没有提供任何服务,则立即退出)。父进程会重新读取其配置文件并重新打开其日志文件。当每个子进程死亡时,父进程会用来自新代配置的子进程替换它,该子进程会立即开始提供新请求的服务。
此代码旨在始终尊重 MPM 的进程控制指令,因此在整个重启过程中,可用于为客户端提供服务的进程和线程数量将保持在适当的值。此外,它会以以下方式尊重 StartServers:如果在一秒钟后至少创建了 StartServers 个新子进程,则创建足够的子进程来弥补不足。因此,代码试图同时保持适合当前服务器负载的子进程数量,并尊重您对 StartServers 参数的意愿。
mod_status 的用户会注意到,当发送 USR1 时,服务器统计信息不会被设置为零。该代码的编写是为了最大限度地减少服务器无法为新请求提供服务的时长(它们将被操作系统排队,因此无论如何都不会丢失),并尊重您的调整参数。为了做到这一点,它必须保留用于跟踪所有子进程的记分牌,这些子进程跨越多个代。
状态模块还将使用 G 来指示仍在为在发出平滑重启之前启动的请求提供服务的子进程。
目前,使用 USR1 的日志轮换脚本无法确定所有写入重启前日志的子进程是否已完成。我们建议您在发送 USR1 信号后等待一段时间,然后再对旧日志进行任何操作。例如,如果大多数用户的命中在低带宽链接上完成需要不到 10 分钟的时间,那么您可以在对旧日志进行任何操作之前等待 15 分钟。
apachectl -k restart向父进程发送 HUP 或 restart 信号会导致它像 TERM 中那样杀死其子进程,但父进程不会退出。它会重新读取其配置文件,并重新打开任何日志文件。然后它会生成一组新的子进程,并继续提供命中服务。
mod_status 的用户会注意到,当发送 HUP 时,服务器统计信息被设置为零。
apachectl -k graceful-stopWINCH 或 graceful-stop 信号会导致父进程建议子进程在完成当前请求后退出(或者如果它们没有提供任何服务,则立即退出)。然后,父进程会删除其 PidFile 并停止监听所有端口。父进程将继续运行,并监控正在处理请求的子进程。一旦所有子进程都完成并退出,或者 GracefulShutdownTimeout 指定的超时时间已到,父进程也会退出。如果超时时间已到,任何剩余的子进程都会收到 TERM 信号以强制它们退出。
当处于“平滑”状态时,TERM 信号会立即终止父进程及其所有子进程。但是,由于 PidFile 将被删除,因此您将无法使用 apachectl 或 httpd 发送此信号。
graceful-stop 信号允许您同时运行多个配置相同的 httpd 实例。当执行 httpd 的平滑升级时,这是一个强大的功能,但是它也可能导致某些配置出现死锁和竞争条件。
已经采取措施确保磁盘上的文件(如锁文件 (Mutex) 和 Unix 套接字文件 (ScriptSock))包含服务器 PID,并且应该能够在没有问题的情况下共存。但是,如果配置指令、第三方模块或持久 CGI 使用任何其他磁盘上的锁或状态文件,则应注意确保多个正在运行的 httpd 实例不会相互覆盖文件。
您还应该注意其他潜在的竞争条件,例如使用 rotatelogs 样式的管道日志记录。多个正在运行的 rotatelogs 实例尝试同时轮换相同的日志文件可能会破坏彼此的日志文件。