`httpd -k start` 和 `service httpd start` 之间的区别?

`httpd -k start` 和 `service httpd start` 之间的区别?

通常情况下,我会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 startdeamon程序在后台使用指定的 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

相关内容