jetty via apache mod_proxy

3
使用Apache虚拟主机和mod_proxy,我想访问在Jetty实例的8080端口上可用的Java应用程序(myapp)。
通过在我的Apache虚拟主机配置中使用“ProxyPass / localhost:8080/”,我可以使用www.mydomain.com/myapp访问在Jetty中运行的应用程序,但我希望从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>

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

我对apache和jetty非常陌生,但我相信有更好、更优雅的方法来实现同样的结果。 事实上,apache会抱怨说:

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

我不得不删除所有的 http://,包括 localhost 等等,否则它们会被检测为超链接并且不允许在帖子中发布。 - Pablo
3个回答

1
问题在于,当您将应用程序部署在Jetty上并使用上下文路径/myapp时,它将相应地生成所有链接。Apache mod_proxy在HTTP级别(标头)执行所有重写操作,并且不会对响应正文做任何处理,保持其原样。
如果您不介意/myapp仍然存在,可以打开mod_rewrite并在您的位置块中包含以下两行:
RewriteEngine on
RewriteRule ^/myapp/(.*)$ /$1 [P]

如果您想永久删除/myapp,那么唯一的选择(假设您不想在mod_proxy_html上浪费CPU功率)就是配置虚拟主机,并在上面部署上下文路径为/的应用程序。

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

1
是的,它可以从Jetty根目录运行,但我想要运行多个应用程序。 - Pablo
Jetty中的路径必须与Apache Httpd中的路径匹配。 - Bruno

0

是的,它可以从jetty根目录工作,但我想要运行多个应用程序。我的应用程序的配置位于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>

我的Jetty版本是6.1.22


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