【发布时间】:2009-01-08 20:16:04
【问题描述】:
我有一个本地服务器,需要对虚拟主机 apache 配置文件进行更改,然后重新启动 apache,以便新配置生效。
PHP 可以做到这一点吗?我尝试了 passthru 和 exec 但他们没有工作。也许问题是我正在尝试重新启动 PHP 的父进程?
感谢您的帮助!!
【问题讨论】:
我有一个本地服务器,需要对虚拟主机 apache 配置文件进行更改,然后重新启动 apache,以便新配置生效。
PHP 可以做到这一点吗?我尝试了 passthru 和 exec 但他们没有工作。也许问题是我正在尝试重新启动 PHP 的父进程?
感谢您的帮助!!
【问题讨论】:
我使用了一个 cron 脚本(用 PHP 编写,而不是从网络服务器执行)来检查服务器是否已启动并重新启动服务器。
但是,我不会从服务器创建的进程中执行此操作,因为您知道您将要终止父进程,这对子进程有不好的影响。
最简单的方法是创建一个 PHP 可以创建的文件 /tmp/RESTART_APACHE,并且 cron 脚本会检查该文件。如果 cron 脚本看到文件 /tmp/RESTART_APACHE,那么它会正确重启 Apache。
使用 cron 脚本会引入延迟(如果您每分钟运行它,最多会延迟 60 秒),但除此之外应该可以按您的意愿工作。
根据您打算如何使用它,这可能会奏效。
(您可能希望使用与 /tmp/ 不同的目录来设置权限并阻止服务器上的任何人创建文件。)
编辑:请参阅 Aaron H 对这篇文章的评论。我同意他的说法:您确实要小心,重新启动网络服务器的能力不是公众普遍可用的服务。
限制对可以触发重启的系统的访问;确保触发重启的文件具有限制性权限,因此只有 Web 进程可以创建该文件,并且通常是智能的。
【讨论】:
我已经这样做了。然而,它仅用于开发环境,为我们的开发人员按需快速创建虚拟主机。到目前为止工作得非常愉快。
我的方法是在系统上创建一个新用户,赋予该用户 sudo 重新加载 apache 的权限,并从 Apache->PHP 我使用 SSH 到 localhost,并使用授权密钥而不向该用户提供密码,然后发出命令。
这样做的原因是我不想让 apache 用户(通常是 www-data)拥有重新加载自身的权力。我将新用户命名为 wwwctrl。
我使用的命令是:
ssh -i /path/to/key-file wwwctrl@localhost sudo /etc/init.d/apache2 reload
我必须以 wwwctrl 用户的身份手动执行此命令一次,才能将本地主机密钥添加到 ~wwwctrl/.ssh/known_hosts。
我使用 proc_open() 来观察命令的执行。
事实上,我正在为不同系统上的不同 Apache 安装生成一批虚拟主机,所以在每个系统上我都有这个 wwwctrl 用户重新加载 Apache,基本上是在“foreach hosts as host do ... wwwctrl@host @"。
【讨论】:
您不想传递“重新加载”而不是“重新启动”吗?
【讨论】:
为此,您需要编辑 sudo 文件,然后执行系统上使用的重启命令,当然使用 sudo。如果您提供详细信息,我可以告诉您,但是您甚至可以这样做吗?是托管的吗?不过,Cron 在这里可能是更好的选择。
【讨论】:
at 将能够做到这一点,不确定您是否可以安排到第二个,但我想这取决于实施
【讨论】:
我会创建一个守护进程来监控启用站点的目录,并在添加或修改文件时重新启动 Apache。这样您就不必像 cron 作业那样等待长达 60 秒。
【讨论】:
这种事情违反了标准的命令链,因为 apache 调用 php,而不是相反。我支持 cron 建议。只需设置一个具有足够权限的 cron 作业来检查主机文件的更改,如果发现任何更改,请重新启动 apache。
【讨论】: