设为首页 收藏本站
查看: 1673|回复: 0

[经验分享] apache之httpd启动、终止、重启小结

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-8-1 10:34:40 | 显示全部楼层 |阅读模式
  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 可以)。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-92936-1-1.html 上篇帖子: Ubunt搭建PHP+mysql+apache 下篇帖子: Tomcat安装,并与Apache整合,安装SVN-WebClient
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表