3

使用 Apache 虚拟主机和 mod_proxy 我想访问端口 8080 上的码头实例中可用的 java 应用程序(myapp)。

通过ProxyPass / localhost:8080/我的 apache 虚拟主机配置,我可以使用 www.mydomain.com/myapp 访问在码头中运行的应用程序,但我希望从 www.mydomain.com 访问该应用程序。

尝试ProxyPass / localhost:8080/myapp找不到应用程序,因为请求变为 www.mydomain.com/myappmyapp/。

然后尝试:

<Location />
        ProxyPass localhost:8080/myapp/
        SetEnv force-proxy-request-1.0 1
        SetEnv proxy-nokeepalive 1
</Location>

我可以访问该应用程序,但仅限于第一个请求。后续请求变为 www.mydomain.com/myappmyapp/

在多次阅读 wiki.eclipse.org/Jetty/Tutorial/Apache 和 apache mod_proxy 文档后,我设法从 www.mydomain.com 正确使用该应用程序的唯一方法是使用以下配置:

<Location /myapp/>
        ProxyPass localhost:8080/myapp/
        SetEnv force-proxy-request-1.0 1
        SetEnv proxy-nokeepalive 1
</Location>

<Location />
        ProxyPass localhost:8080/myapp/
        SetEnv force-proxy-request-1.0 1
        SetEnv proxy-nokeepalive 1
</Location>

所以在这两种情况下,请求都会被转发到码头应用程序。

我对 apache 和 jetty 很陌生,我很确定有一种更好、更优雅的方法可以达到同样的效果。事实上 apache 抱怨说:

[warn] worker localhost:8080/myapp/ already used by another worker
4

3 回答 3

1

问题是,当您使用上下文路径 /myapp 在码头中部署应用程序时,它将相应地生成所有链接。Apache mod_proxy 在 HTTP 级别(标头)进行所有重写,并且不会对响应正文做任何事情,保持原样。

如果您不介意 /myapp 保留,您可以打开 mod_rewrite 并在 Location 块中包含以下两行:

RewriteEngine on
RewriteRule ^/myapp/(.*)$ /$1 [P]

如果您想彻底摆脱 /myapp,那么剩下的唯一选择(假设您不想在 mod_proxy_html 上浪费 CPU 资源)是配置虚拟主机,并在上下文路径为 / 的虚拟主机上部署应用程序。

于 2011-03-02T23:18:54.080 回答
0

如果您希望您的 web 应用程序可以在站点的根目录中访问,您需要将 web 应用程序部署到容器的根目录中。通常,这是通过调用war文件ROOT.war来完成的myapp.war(尽管这最终取决于您的 Jetty 部署程序的配置,这可能比默认配置更复杂)。

于 2010-08-25T23:28:47.133 回答
0

是的,它可以从码头根目录工作,但我希望运行多个应用程序。myapp 的配置在 jetty 的 contexts 文件夹下:

<Configure class="org.mortbay.jetty.webapp.WebAppContext">
  <Set name="contextPath">/mvc-showcase</Set>
  <Set name="war"><SystemProperty name="jetty.home"/>/webapps/mvc-showcase.war</Set>
</Configure>

我的码头版本是 6.1.22

于 2010-08-27T08:02:16.243 回答