![`httpd -k start` 和 `service httpd start` 之间的区别?](https://linux22.com/image/631721/%60httpd%20-k%20start%60%20%E5%92%8C%20%60service%20httpd%20start%60%20%E4%B9%8B%E9%97%B4%E7%9A%84%E5%8C%BA%E5%88%AB%EF%BC%9F.png)
通常情况下,我会httpd
在我的开发“CentOS 6.5 (Final)”框上重新启动service httpd restart
,或者如果我感到疑惑的话,service httpd stop
接着使用。service httpd start
然而,经过数周的搜索、调整、更新和重新编译“损坏的”PHP 模块(SpiderMonkey)却无济于事,我一时兴起httpd -k start
使用命令启动 apache——模块突然出现了!
有什么区别?我可以纠正这种service httpd start|stop|restart
行为吗?
笔记:在最初尝试纠正该问题时,我php55w
从 webstatic repo 安装了该软件。我假设,如果我之前有这个想法,解决方案(使用重新启动httpd -k
)就可以解决问题,因为这就是 apache 在生产中通常重新启动的方式(其中模块作品)。
答案1
检查服务
service httpd start|stop|restart 调用服务包装器,这实际上意味着 httpd 本身是通过脚本方法触发的,这些脚本方法可能会执行更多操作只是调用 httpd。例如,他们可能会在特定位置写入 PID 文件以跟踪当前正在运行的 httpd 进程。
很难说是什么导致了您所看到的具体问题,但我认为检查服务包装器会给您提供所需的所有线索。服务包装器的典型位置可能是 /etc/init.d/httpd。
确认使用了 http
可能,您会想要尝试“哪个 httpd”并将其与您在服务包装器中找到的 http 路径进行比较。也许您看到的是多个竞争 httpd 安装的一个简单案例?
检查 php 配置
也可能相关,如果您在某些情况下看到 PHP 模块但在其他情况下看不到,那么使用 phpinfo() 查看在两种情况下发生的 php 配置可能会很有价值。在您的 webroot 中创建一个脚本,如下所示:
<?php echo phpinfo(); ?>
并查看每种情况下出现的情况。也许您的环境以某种方式导致使用不同的 php.ini?
答案2
/etc/init.d/httpd 不会调用 httpd 二进制文件。执行时,将调用service httpd start
该deamon
程序在后台使用指定的 pidfile 以及 /etc/sysconfig/httpd 中的选项启动 httpd。
start() {
echo -n $"Starting $prog: "
LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch ${lockfile}
return $RETVAL
}
同样,执行 service httpd stop
使用killproc
来自 /etc/rc.d/init.d/functions 的函数来停止 httpd。
stop() {
echo -n $"Stopping $prog: "
killproc -p ${pidfile} -d ${STOP_TIMEOUT} $httpd
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
}
初始化脚本可以像其他文本文件一样读取。如果你想知道它们在做什么,只需自己查看即可。
顺便说一下,受到推崇的由 Apache 用来apachectl
控制 httpd。一些 init 脚本是根据模板编写的,可能未必会考虑开发人员的最佳实践。
您可以编辑 /etc/init.d/httpd 以满足您的需要,但在执行此操作之前,请确保您完全了解自己在做什么。
答案3
你的 apache 服务器运行在 worker 模式下。很多 php 模块在 worker 模式下加载失败。改成 prefork 模式,同样service httpd start
可以。
转到 /etc/sysconfig/httpd 文件并阻止如下行:
#HTTPD=/usr/sbin/httpd.worker