在Jetty下部署JRuby应用程序时的奇怪性

时间:2010-08-26 17:12:22

标签: java deployment jetty jruby redmine

这个问题令人抓狂,我希望有人能指出我正确的方向。

我正在尝试将Redmine实例部署到Jetty servlet。我使用Warbler创建了战争,创建了上下文,它似乎部署了。不幸的是,我看到了以下行为:

如果我以其配置的主机名/访问我的应用程序,我会看到webapp目录的目录列表。

如果我通过向已发送配置主机名的/ braillewizard(上下文名称)发送GET请求来访问应用程序,则会运行该应用程序。

如果我向/ braillewizard发送请求,主机名列表中未包含Host:标头,则该应用程序未运行且我得到404.

所以看起来我的虚拟主机部分配置正确,但有些东西不太正确。特别恼人的是我在另外两个系统上运行类似的设置,包括一个运行Redmine的系统,一切正常。

我能想到的这个系统的唯一区别是我正在为系统的FQDN设置一个vhost,而在其他系统上,主机位于附带域上。不确定这是否是一个因素,但我试图摆脱上下文配置并使用/ root中的应用程序仍然需要GET / root。

我也直接telnet到Jetty服务器,所以这对我的前端Web服务器来说不是问题。

这是我的上下文配置:

<Configure class="org.mortbay.jetty.webapp.WebAppContext">
  <Set name="war"><SystemProperty name="jetty.home"/>/webapps/braillewizard.war</Set>
  <Set name="contextPath">/</Set>
  <Set name="virtualHosts">
    <Array type="java.lang.String">
      <Item>braillewizard.org</Item>
      <Item>www.braillewizard.org</Item>
    </Array>
  </Set>
</Configure>

我的web.xml,由Warbler生成:

<!DOCTYPE web-app PUBLIC
  "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
  "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>

  <context-param>
    <param-name>rails.env</param-name>
    <param-value>production</param-value>
  </context-param>

  <context-param>
    <param-name>public.root</param-name>
    <param-value>/</param-value>
  </context-param>


  <filter>
    <filter-name>RackFilter</filter-name>
    <filter-class>org.jruby.rack.RackFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>RackFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <listener>
    <listener-class>org.jruby.rack.rails.RailsServletContextListener</listener-class>
  </listener>


</web-app>

如果我还有其他任何内容,请告诉我。我一直在谷歌搜索解决方案几个小时,没有找到任何东西。

编辑:好的,这里有一些细节。 / context工作的想法并不完全正确。相反,应用程序无法加载,我出于某种原因无法看到异常。稍后进行各种调整,问题似乎略有不同。

似乎/没有运行Rails应用程序中附加/的任何路由。相反,它触发了webapp文件夹的目录列表。如果我直接访问我的应用程序中的URL,除了/当然,一切似乎都很好。

使用-DDEBUG作为JVM arg调用Jetty似乎表明RackHandler正在被攻击,然后正在进入默认处理程序。这似乎与未运行的处理程序一致,但我不确定为什么我在此部署的一个版本中看到行为而不是另一个版本。

2 个答案:

答案 0 :(得分:0)

有人告诉我,这种行为是由于JRuby Rack适配器1.0.2中引入的错误造成的,并且修复程序涉及降级到1.0.1。虽然我还没有测试过这个解决方案,但这与一个服务器上的版本在另一个服务器上的版本失败时的原因是一致的。

我会尝试并稍后用结果更新这个问题,但是现在这个问题已经破坏了我的意志,暂时搞砸了这些东西。 :)目前它有效,因为我有一个URL重写,这对我来说已经足够了。

答案 1 :(得分:0)

我还遇到了使用Warbler和Jetty部署Rails应用程序的问题。对我有用的修复是将默认servlet上的dirAllowed参数设置为false,即

<init-param>
  <param-name>dirAllowed</param-name>
  <param-value>false</param-value>
</init-param>

我认为默认行为是从'找不到欢迎文件'到'显示目录列表' - 更改此参数会导致请求被调度到您的Rails应用程序。