jetty通过apache mod_proxy

时间:2010-08-25 23:11:20

标签: apache proxy jetty location proxypass

使用Apache虚拟主机和mod_proxy我想访问端口8080上的jetty实例中可用的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 docs后,我设法从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

3 个答案:

答案 0 :(得分:1)

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

如果你不介意/ myapp粘在一起,你可以打开mod_rewrite并在你的位置块中包含以下两行:

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

是的,它适用于jetty root,但我想运行多个应用程序。 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