如何在Tomcat中设置上下文路径,以便可以在不附加部署的文件夹名称的情况下进入站点?

时间:2011-12-04 12:26:16

标签: java tomcat deployment tomcat6

我在Tomcat指南here上读到了这个以及一些SO问题。而且我认为我几乎都在做同样的事情。但在某种程度上无法成功。

首先,我必须说我的应用程序部署在我无法控制的共享Tomcat服务器上。我只是删除 .war 文件并将其部署。

我尝试将我的应用程序打包为 ROOT.war ,但无效。管理员告诉我把它打包成我想要的名字,他们会照顾它。 我将其打包为 my-application.war 并已部署但我必须输入 http://my-host/my-application 进入网站。

联系管理员后,他们告诉我他们已经在我的主机中将一个上下文元素放在Tomcat配置文件中,如:

<Context path="" docBase="path of my-application deployed folder"/>

应该将 my-application 设置为来自my-host的所有请求的默认应用程序。但它没有,每当我进入 http://my-host 时,我得到:

HTTP Status 404 - / The requested resource (/) is not available

但是当我输入 http://my-host/my-application 时,一切正常。任何关于可能出错的建议都是绝对赞赏的。

更新
我尝试按照how to make the application default上的tomcat文档中描述的步骤进行操作。描述了3种方式,我尝试了所有三种方式,并且可以在localhost上将我的应用程序成功部署为ROOT。

我还尝试重现我在远程服务器上遇到的问题,以便找到原因并将其报告给管理员。我发现了几个问题。

  1. 在管理员发送给我的 server.xml 片段中, autoDeploy deployOnStartUp 设置为true,如果明确定义Context,则它们应为false server.xml中的元素。这将导致双重部署,从而创建一个ROOT文件夹和一个名为.war文件的文件夹。删除.war将删除它的相应文件夹并取消部署应用程序,但ROOT仍然存在,必须手动删除并需要重新启动Tomcat。在重新启动之前,ROOT.war的任何部署都将失败。
  2. 我认为防止ROOT.war部署有一些原因。可能是 conf / {engine-name} / {host-name} 中存在 ROOT.xml >或者主机的appBase中存在ROOT文件夹,或者如上所述,以前部署的ROOT应用程序未取消部署,需要重新启动Tomcat。
  3. 无论哪种方式,我都无法确切地指出究竟是什么阻止ROOT.war部署,因为这需要访问Tomcat日志文件和conf文件以检查我上面描述的情况。

    同样从我看来我的管理员似乎无法维护Tomcat服务器并找到问题。所以我决定在与共享服务器挣扎之后使用专用的Tomcat服务器。

3 个答案:

答案 0 :(得分:5)

在您的问题中,您声明管理员将上下文设置为:

<Context path="" docBase="path of my-application deployed folder"/>

根据上述评论,我建议您尝试使用应用程序的 relative 路径而不是绝对路径。

我在我的tomcat服务器上尝试了这个:

<Context path="/" docBase="my-application/" />

这就是诀窍。

包含Context元素的Host元素实际上设置了一些可能也会影响上下文的参数。如果它是默认设置,那么相对上下文应该只指向webapps文件夹。如果它已被更改,结果可能会有所不同。

答案 1 :(得分:4)

通常可以通过以下步骤实现:

  • 在conf / Catalina / localhost
  • 中定义ROOT.xml上下文文件
  • 将您的webapp WAR命名为“ROOT.war”或包含文件夹“ROOT”

但是,我怀疑你能否在共享的Tomcat实例上做到这一点。只有一个应用程序可以作为默认应用程序运行托管公司可能不会允许它,否则它们允许哪个应用程序成为共享同一个Tomcat实例的许多人的默认设置?

请参阅此链接:http://staraphd.blogspot.com/2009/10/change-default-root-folder-in-tomcat.html

答案 2 :(得分:3)

Tomcat Wiki将应用程序置于默认上下文中有section。 但是,为了做到这一点,它意味着对Tomcat服务器的一些控制,这在您描述的共享上下文中可能是不可能的。

如果您能够在服务器上安装其他系统,则另一种解决方案是使用NGINX等代理服务器。这比简单命名war文件ROOT.war更复杂,但有时它是唯一的选择。

如果你有NGINX在服务器上收听,并且你有自己的网址,你可以使用HttpProxyModule设置,例如:

server {
        listen          80;
        server_name     my.domain.com;
        location / {
            proxy_pass              http://my-host/my-application;
            proxy_set_header        X-Real-IP $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header        Host $http_host;
        }
    }

另外,为了使这项工作,你必须拥有“my.domain.com”url 它需要与每个人用于共享Tomcat的那个分开服务器

解决方案的nginx部分是免费的,但是如果你需要注册一个新的网址,然后使用像no-ip.com这样的东西将它重定向到tomcat服务器,那就需要花钱。