在 Tomcat 下的 Servlet 中重新启动 Apache2.4 6

Restarting Apache2.4 Inside a Servlet Under Tomcat 6

当遇到错误 403 时,我有一个重定向到 Java Web 应用程序的代理。

此应用程序检查用户的凭据:如果用户获得授权,客户端 IP 地址将添加到授权 IP 地址列表中,并包含在 Apache2.4 的 httpd.conf.

因此,将使用以下方式重新启动代理:

synchronized (Runtime.getRuntime()) {
    Runtime.getRuntime().exec("...apachectl -k restart").waitFor();
}

这是在 Windows 下使用代理在本地测试的,效果很好;但是当我开始研究 Linux (Ubuntu 14) 时,行为发生了变化,出现了 "The connection was reset" 或 "No data received"(分别是 Firefox,Chrome)之类的错误。

Proxy (Apache 2.4) 和 Web Server (Tomcat) 的进程之间是否存在关系?

事实证明,重新启动 会使代理在重新启动操作后立即重现完全相同的 "pending" 请求。

要考虑 httpd.conf 中的新值,我所要做的就是替换 restart 指令优雅.

synchronized (Runtime.getRuntime()) {
    Runtime.getRuntime().exec("...apachectl -k graceful").waitFor();
}

这样,进程不会重新启动,但httpd.conf内的更改会生效,因此不会影响整个机制。