本文仅针对 Unix 平台的 Apache 服务器的启动和停止.Windows 平台的用户请参见运行 Apache.
你将会注意到有很多httpd 运行在你的系统中, 但是你不应该发送结束信号给除了主进程以外的任何子进程, 它们的进程号在文件PidFile中. 这也是说你永远也不应该发送结束信号给除了主进程以外的任何子进程. 有三个信号你可以发送给主进程:TERM, HUP, 和USR1, 稍后将解释它们的使用方法.
你应该使用例如下面的命令给主进程发出一个信号:
kill -TERM `cat /usr/local/apache/logs/httpd.pid`
你可以阅读有关这个过程的信息:
tail -f /usr/local/apache/logs/error_log
修改下面的例子来匹配你的ServerRoot 类型和PidFile文件设置.
对于 Apache 1.3 提供一个脚本文件src/support/apachectl 它可以启动, 停止, 并重新启动 Apache. 它也需要一些系统定制工作, 请参阅脚本开始部分的注解.
TERM Signal: 立刻停止
发送TERM信号给主进程, 将会引起主进程立刻尝试结束它的所有子进程. 也可能需要几秒钟来彻底结束它的子进程. 然后主进程自己结束. 在处理的任何请求将被中断, 并且也不会再服务任何请求.
HUP Signal: 重新启动
发送HUP信号给主进程将导致结束它的子进程, 就想TERM信号一样,但是主进程将不会终止. 它将重新读取配置文件, 并且重新打开所有的日志文件. 然后重新产生所有子进程并继续为点击操作提供服务.
状态模块 的使用者将会注意到服务器的状态统计在HUP信号被发送后被置为零.
注意:如果你使用存在错误的配置文件发出重新启动信号,主进程将不会重新启动并且带着一个错误结束. 请参见下文:一种可以避免这种情况的方法.
USR1 信号: 优美重新启动
注意: 优先发出 1.2b9 代码是相当不稳定的和根本不应被使用的.
USR1 信号引起主进程处理并警告收到当前请求之后的子进程结束(或在它们不做任何服务时立刻结束). 主进程将重新读取它的配置文件并打开它的日志文件. 当每一个子进程结束后,主进程将使用配置信息产生一个新的子进程来立刻响应请求并为之服务.
这个信号是为不妨碍MaxClients, MinSpareServers, 和MaxSpareServers的设置而设计的. 此外, 它也不妨碍在以下方式中StartServers 的使用: 如果一秒钟后, 至少 StartServers 的新的子进程还没有来得及被创建, 将创建足够的子进程来填充这段空闲时间. 这也是说此信号尝试为服务器的当前负荷维护一个合适的子进程的值并不会干扰你希望的 StartServers 的参数.
状态模式 的使用者将注意到服务器的统计在USR1信号发出时,并没有被置为零. 此信号是为了在服务器不能为新请求服务时为将时间浪费减小到最少而编写的 (新请求将被操作系统排成队列, 所以它们在任何事件中都不会被丢失) 并且也不妨碍调整参数. 为了实现此功能还必须保留记分牌 来跟踪所有子进程的交叉生成.
在使用优美重新启动信号前,状态模式也将使用G标志来指出那些子进程仍在为请求服务.
目前没有办法对日志转换脚本使用USR1信号并且确定的知道为所有子进程写的预重新启动日志已经完成. 我们建议你在对旧的日志文件做任何操作之前和发出USR1信号之后使用一个合适的延迟.例如,如果点击操作中的大多数在低速连接的情况下只花少于十分钟的时间来完成用户的请求,然后你在对旧的日志文件做操作之前可能要等十五分钟.
注意:如果你使用存在错误的配置文件发出重新启动信号,主进程将不会重新启动并且带着一个错误结束. 在优美重新启动的情况下,它结束时也将运行中的子进程结束.(有些子进程是处理完最后的请求后的 "优美结束".) 如果你尝试重新启动服务器将引起一些问题 -- 它将不能绑定监听端口. 目前,可以作的只能是在重新启动前检查配置文件的语法.最容易的方法是作为一个不是 Root 的用户来运行 Httpd 服务. 如果没有错误,它将尝试打开套接字和日志文件,然后因为它不是 Root 用户而失败.(或是因为当前运行的 httpd 服务已经绑定了那些端口). 如果因为一些其他原因而失败,可能是配置文件存在错误,请在优美重新启动前修改那些错误.
附录: 信号和速度条件 (race conditions)
Apache 1.2b9 有几种速度条件 导致重新启动和死信号 (速度条件的简单描述是: 一个对时间敏感的问题, 在不正确的时间出现的不期望的错误). 为我们尽可能排除的正确的功能的体系结构. 但是应被注意到在正确的体系结构中仍也存在速度条件.
在磁盘上使用的体系结构记分板文件 存在潜在破坏的记分板. 这可能将导致 "绑定: 地址已经使用" (在HUP之后) 或 "始终丢失子进程!" (在USR1之后). 稍后模型是个致命错误将导致服务器丢失记分板槽. 所以可以带着一个偶然重新启动而使用优美重新启动. 围绕着工作的这些问题十分困难, 但幸运的是大多体系结构不需要一个记分板文件. 请参考为你的体系结构使用的记分板文件文档.
NEXT和MACHTEN (68k) 有可以引起重新启动或死信号, 但不会引起服务器做除了错误以外的任何事情.
所有体系结构的每一个子进程都有一个小竞赛条件来保持以后的持续的 HTTP 连接(KeepAlive). 在读取请求的头信息之前和读取请求的行信息之后它将离开. 目前将有一个修复软件包版本 1.2. 理论上讲 KeepAlive 客户因网络潜伏和服务超时的原因而并不必期望这些事件发生的现象并不是一个问题.在实践中它将意味着不影响任何工作,如在一个实验情形中,每秒中重启服务器二十次却并不影响客户浏览这个站点,也不会出现断的图片和空文档.