Apache2如何从CGI内部重新加载配置

3
我正在开发一个简单的Perl应用程序,该程序复制另一个Perl应用程序并构建所有所需的Apache配置文件。
我无法弄清如何在运行时重新加载apache配置。我知道我可以做一个系统调用并在那里重新加载apache,但这意味着我必须获得root访问权限,这有点可怕。
是否有一种方法可以要求apache从CGI容器内重新加载其配置文件?
-------------------------附加信息------------------------------
我已经做了更多的研究,问题是Apache必须以提升的特权运行才能绑定到端口80。因此,一种解决方案是将Apache设置为在另一个端口上运行,并通过iptables将该端口转发到80。(这可能是最后的手段,但非常混乱的解决方案)。
这就是让我困惑的地方,Apache应该能够维护其当前的端口绑定并重新检查其配置文件,我只是添加了另一个脚本别名。
是否有任何方法可以添加新的脚本别名而无需重新加载?
2个回答

3

您还可以选择重新加载配置:

/etc/init.d/httpd reload

或者

 apachectl -k graceful

但不幸的是,这些需要 root 权限。这与普通的重新启动不同,因为当前打开的连接不会被中止。一个副作用是旧的日志文件将不会立即关闭。这意味着如果在日志轮换脚本中使用它,可能需要相当长的延迟时间来确保旧的日志文件在处理它们之前已经关闭。

此外,如果使用 daemontools 运行 Apache,可以通过以下方式实现:

svc -h /service/apache

重新加载只会向父Apache进程发送SIGHUP信号。它不一定要通过辅助脚本完成,但最好还是这样做。 - jordanm
1
你可以在sudoers中添加配置,允许非特权用户无需密码sudo http reload。 - RobEarl
1
类似于“rob ALL=NOPASSWD:/etc/init.d/httpd reload” - RobEarl
谢谢Rob,这是个好主意,但这是一个生产系统,我认为我不能实际上让一个用户无需密码就可以sudo。 - Dan Walmsley

0

很抱歉提出问题然后不给别人回答的机会,但我找到了一个解决方案,希望能帮助其他人。

我所要做的就是保持配置不变,因为在没有根权限或某些复杂的端口转发(这将使应用程序不太便携)的情况下,无法以所需的方式重新加载。

因此,Apache似乎只动态加载文件系统。

我所做的是使用mod_rewrite重定向脚本请求,并将它们简单地放在/var/www/appname/copyname/cgi-bin/中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接