apache之httpd启动、终止、重启小结

How apache starts

如果配置文件中的Listen directive设置了默认端口为80(或者是其它的值,但要小于1024),接下来apache httpd就需要root权限来启动apache,这是因为在将应用进程绑定在(1-1024)这个保留端口范围内的时候,需要root权限。当 server一旦启动并且执行了些许初步动作,比如打开log日志文件,接下来server会装载执行指定数目的child processes,这些process是用来复杂监听端口,处理来自client的请求并且返回响应。而主httpd process仍然以root权限继续运行,但是这些child processes会以较低的权限运行,而这些行为都可以通过选择Multi-processing Module来进行控制。
启动httpd main process的推荐方式是使用apachectl 控制脚本。这个脚本用来帮助你自动设置environment set,这些是httpd main process运行时所需要的;然后apachectl才会继续执行httpd的ke执行的binary code。apachectl可以接受命令行参数,所以任何httpd的命令行参数对apachectl一样生效(从这一点,可以把apachectl看成httpd的壳, apachectl无非是转发相应的命令行参数给httpd)。你也同样可以修改apachectl脚本,在apachectl脚本中,HTTPD 变量用来指定httpd executable 的有效路径。
httpd开始运行后的第一件事是读取httpd.conf文件。httpd.conf是编译时候确定的,也可以通过-f命令行option来进行指定。如:
/usr/local/apache2/bin/apachectl -f /usr/local/apache2/conf/httpd.conf
如果startup一切正常,则server将会脱离terminal(其stdin,stdout,stderr不再和terminal的0,1,2相关联);这就说明apache httpd启动成功。然后你可以使用browser来验证DocumentRoot下的文件证实httpd server是否启动成功。
apache启动时侯出错:
如果apache在启动的时候出现fatal error, 则它会将出错提示信息发送个console或者ErrorLog directive 指定的日志文件。最一般出现的问题是:Unable to bind to Port ...,它可能是已经启动了一个httpd process, 或者不是root权限。

更进步的trouble-shooting,参加 Apache FAQ.

在boot-time 启动apache server:

在os重新启动后自动重启apache server, 可以在 /etc/rc.N 或者/etc/rc.local中添加对apachectl脚本的调用

apachectl 脚本被设计成类似于标准的sysv init script,它可以接受start,restart和stop命令行参数,并且把它们转换成适当的signals以传递给httpd。所以可以将apachectl连接到/etc/init.d目录下。 如

link -s /usr/local/apache2/bin/apachectl /etc/init.d/apachectl

apache的启动和重启命令:

为了restart或者stop Apache server, 你必须给运行的httpd processes发送信号。有两种方法可以发送信号给httpd processes。首先,你可以使用kill command来直接发送信号给httpd process。你会发现有许多httpd进程处于运行状态,但是除了parent httpd process,你不能将signals发送给其它的httpd进程,他的pid是由PidFile来定义的(PidFile标识的文件内保存了parent process的pid,默认是/usr/local/apache2/logs/httpd.pid).有四个signals可以发送给parent httpd process:TERM, USR1, HUP和WINCH。

命令如下: kill -TERM `cat /usr/local/apache2/logs/httpd.pid`

第二种方法是使用-k 命令行选项: stop,restart, graceful 和 graceful-stop.
使用命令: ./apachectl -k stop|restart|graceful|graceful-stop

当你发送signals给httpd来结束httpd运行, 通过查看/usr/local/apache2/logs/error_logs 来检查执行的结果

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

stop:

Signal: TERM
apachectl -k stop

立即发送TERM或者stop signals给httpd parent processes ,来结束httpd parent process和它的子process。这个过程会持续几秒种。

优雅的restart(graceful restart)

USR1 或者graceful signals发送给parent process,来建议parent的子进程结束运行或者在它们处理完当前正在处理的请求后结束运行(如果child没有做任何事情这马上停止运行)。然后parent会重新读取apache的配置文件、重新打开它的log文件。当每个child结束执行,parent将会用根据配置而新产生的 process来替换每个child,这些新的child来继续服务http requests。

apache的httpd被设计成尊重MPM的process control directive的配置,所以通过重新启动,可用的服务于client请求的process和threads的数量会被保证在一个适当的数值。此外,对应服务器的StartServers directive 配置,httpd会有如下动作:在一秒钟以后,如果新生成的children process的数量少有StartServers指定的值,则httpd parent会创建足够的children来一同完成服务client的任务。因此,httpd试图在维护足够数量的children来满足server 的负载的同时,同时尊重StartServers参数的设置的值。

使用apache mod_status的用户会注意到服务器统计的数值没有被设置为0当USR1被发送的时候。httpd的代码的编写为了保证Server由于重启而导致无法对client的requests进行处理时间的最小化(这些由于重启而无法处理的请求会被os发到os维护的队列当中去,所以没有event会被丢失),同时满足你调优Servers的目的(更改配置,重新启动apache httpd server)。为了达到这个目的,在children重新生成的过程中,应该保持用于跟踪children的scoreboard。

这个mod_status module,使用G来标记这些children任然在服务在graceful restart请求被发出前还没有处理完成的client的请求。

命令:apachectl -k graceful

restart now

Signal: HUP
apachectl -k restart

发送HUP或restart 信号给parent httpd process,所有子进程会被杀死,而parent process不会exit。apache httpd会重新读取配置文件,然后重新打开log file。 然后parent httpd会spawns(fork and exec)一组新的children process集合用来服务client请求。

WINCH and graceful-stop

Signal : WINCH

apachectl -k graceful-stop


WINCH或者graceful-stop信号会使得parent process试图建议children在处理完当前请求(或者立即结束如果它们已经不再处理任何请求)结束运行状态。parent process然后将会删除它的PidFile文件,终止监听对所有它曾经关注过的端口。 然后,parent process会继续运行,监听所有仍然有请求任务的子进程。当所有的children进程都执行结束并且exit,或者已经过了由 GracefulShutdownTimeout指定的timeout时间,parent将会结束运行并且exit。如果timeout时间到了,则每个子进程都会收到TERM signal,然后会强制它们exit。 如果process和它的children处于graceful状态,则TERM signal会使得它们马上结束运行。然而,由于PidFile被删除,所以导致你不能通过apachectl和httpd来放松信号(kill 可以)。

posted @ 2011-07-18 18:44  yub0yue  阅读(11457)  评论(0编辑  收藏  举报