我有我的应用程序的 war 文件。我需要在根级别部署它。当前 URL 为http://localhost:8080/war_name/application_name。
http://localhost:8080/war_name/application_name
你有几个选择:
从 tomcat 中删除 out-of-the-box ROOT/目录,并在部署之前将 war 文件重命名为ROOT.war。
ROOT/
ROOT.war
部署你的战争(从你的例子)war_name.war并在conf/server.xml中配置上下文根以使用你的 war 文件:
war_name.war
conf/server.xml
<Context path="" docBase="war_name" debug="0" reloadable="true"></Context>
第一个更容易,但更多的 kludgy。第二个可能是更优雅的方式。
on tomcat v.7(香草安装)
在你的 conf/server.xml 中,在</Host>结束标记之前,在文件末尾添加以下位:
</Host>
<Context path="" docBase="app_name"> <!-- Default set of monitored resources --> <WatchedResource>WEB-INF/web.xml</WatchedResource> </Context>
注意docBase属性。这是重要的一点。您可以确保在更改根 Web 应用程序之前已部署 app_name,或者只是将解压缩的 webapp(app_name)复制到 tomcat 的 webapps 文件夹中。启动,访问 root,看到你的 app_name!
在带有这些更改的 tomcat 7 中,我可以在/ROOT 访问/和 ROOT 的 myAPP
<Context path="" docBase="myAPP"> <!-- Default set of monitored resources --> <WatchedResource>WEB-INF/web.xml</WatchedResource> </Context> <Context path="ROOT" docBase="ROOT"> <!-- Default set of monitored resources --> <WatchedResource>WEB-INF/web.xml</WatchedResource> </Context>
将以上内容添加到 server.xml 中的<Host>部分
<Host>
我知道我的答案与其他一些答案有些重叠,但这是一个有一些优点的完整解决方案。这适用于 Tomcat 8:
主要应用程序从根目录提供
通过 Web 界面部署 war 文件得以维护。
主应用程序将在端口 80 上运行,而只有管理员可以访问管理文件夹(我意识到* nix 系统需要超级用户绑定到 80,但在 Windows 上这不是问题)。
这意味着您只需重新启动一次 tomcat,并且可以在没有问题的情况下部署更新的 war 文件。
步骤 1:在 server.xml 文件中,找到连接器条目并将其替换为:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
第 2 步:在<Host ...>标记内定义上下文:
<Host ...>
<Context path="/" docBase="CAS"> <WatchedResource>WEB-INF/web.xml</WatchedResource> </Context> <Context path="/ROOT" docBase="ROOT"> <WatchedResource>WEB-INF/web.xml</WatchedResource> </Context> <Context path="/manager" docBase="manager" privileged="true"> <WatchedResource>WEB-INF/web.xml</WatchedResource> </Context> <Context path="/host-manager" docBase="host-manager" privileged="true"> <WatchedResource>WEB-INF/web.xml</WatchedResource> </Context>
请注意,我解决了 webapp 文件夹中的所有应用。第一个有效地从根位置切换根和主应用程序。 ROOT 现在在http://example.com/ROOT上,主应用程序在http://example.com/上。受密码保护的 Web 应用程序需要privileged="true"属性。
http://example.com/ROOT
http://example.com/
privileged="true"
当您部署与根匹配的 CAS.war 文件时(<Context path="/" docBase="CAS">,您必须在管理面板中重新加载该文件,因为它不会随部署一起刷新)。
<Context path="/" docBase="CAS">
不要在上下文中包含<Context path="/CAS" docBase="CAS">,因为它会禁用部署 war 文件的 manager 选项。这意味着您可以通过两种方式访问该应用:http://example.com/和http://example.com/APP/
<Context path="/CAS" docBase="CAS">
http://example.com/APP/
步骤 3:为了防止对 root 和 manager 文件夹进行不必要的访问,请将valve添加到这些上下文标记,如下所示:
valve
<Context path="/manager" docBase="manager" privileged="true"> <WatchedResource>WEB-INF/web.xml</WatchedResource> <Valve className="org.apache.catalina.valves.RemoteAddrValve" addConnectorPort="true" allow="143\.21\.2\.\d+;8080|127\.0\.0\.1;8080|::1;8080|0:0:0:0:0:0:0:1;8080"/> </Context>
这实际上限制了管理员 web 应用程序文件夹对我们自己的域(假 IP 地址)和 localhost 的访问权限,当他们使用默认端口 8080 时,并保持通过 Web 界面动态部署 war 文件的能力。
如果要将此用于使用不同 IP 地址的多个应用程序,可以将 IP 地址添加到连接器(address="143.21.2.1")。
address="143.21.2.1"
如果要从根运行多个 Web 应用程序,则可以复制 Service 标记(对于第二个使用不同的名称)并将<Context path="/" docBase="CAS">的 docbase 更改为例如<Context path="/" docBase="ICR">。
<Context path="/" docBase="ICR">
删除$CATALINA_HOME/webapps/ROOT。更新$CATALINA_HOME/conf/server.xml,确保 Host 元素如下所示:
$CATALINA_HOME/webapps/ROOT
$CATALINA_HOME/conf/server.xml
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="false" deployOnStartup="false"> <Context path="" docBase="myApp"></Context>
它适用于 Tomcat 8. autoDeploy 和 deployOnStartup 需要设置为 false 以防止 tomcat 两次部署myApp。
myApp
最快的方式。
确保没有部署 ROOT 应用程序,如果有部署则取消部署
将您的战争重命名为 ROOT.war,部署,全部,无需更改配置
添加 to @Rob Hruska 的 sol,server.xml inside 部分中的此设置有效:
<Context path="" docBase="gateway" reloadable="true" override="true"> </Context>
注意:在某些情况下可能需要 override =“true”。
在我的服务器中我使用这个和 root autodeploy 工作得很好:
<Host name="mysite" autoDeploy="true" appBase="webapps" unpackWARs="true" deployOnStartup="true"> <Alias>www.mysite.com</Alias> <Valve className="org.apache.catalina.valves.RemoteIpValve" protocolHeader="X-Forwarded-Proto"/> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="mysite_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b"/> <Context path="/mysite" docBase="mysite" reloadable="true"/> </Host>
8 回答
你有几个选择:
从 tomcat 中删除 out-of-the-box
ROOT/
目录,并在部署之前将 war 文件重命名为ROOT.war
。部署你的战争(从你的例子)
war_name.war
并在conf/server.xml
中配置上下文根以使用你的 war 文件:第一个更容易,但更多的 kludgy。第二个可能是更优雅的方式。
on tomcat v.7(香草安装)
在你的 conf/server.xml 中,在
</Host>
结束标记之前,在文件末尾添加以下位:注意docBase属性。这是重要的一点。您可以确保在更改根 Web 应用程序之前已部署 app_name,或者只是将解压缩的 webapp(app_name)复制到 tomcat 的 webapps 文件夹中。启动,访问 root,看到你的 app_name!
在带有这些更改的 tomcat 7 中,我可以在/ROOT 访问/和 ROOT 的 myAPP
将以上内容添加到 server.xml 中的
<Host>
部分我知道我的答案与其他一些答案有些重叠,但这是一个有一些优点的完整解决方案。这适用于 Tomcat 8:
主要应用程序从根目录提供
通过 Web 界面部署 war 文件得以维护。
主应用程序将在端口 80 上运行,而只有管理员可以访问管理文件夹(我意识到* nix 系统需要超级用户绑定到 80,但在 Windows 上这不是问题)。
这意味着您只需重新启动一次 tomcat,并且可以在没有问题的情况下部署更新的 war 文件。
步骤 1:在 server.xml 文件中,找到连接器条目并将其替换为:
第 2 步:在
<Host ...>
标记内定义上下文:请注意,我解决了 webapp 文件夹中的所有应用。第一个有效地从根位置切换根和主应用程序。 ROOT 现在在
http://example.com/ROOT
上,主应用程序在http://example.com/
上。受密码保护的 Web 应用程序需要privileged="true"
属性。当您部署与根匹配的 CAS.war 文件时(
<Context path="/" docBase="CAS">
,您必须在管理面板中重新加载该文件,因为它不会随部署一起刷新)。不要在上下文中包含
<Context path="/CAS" docBase="CAS">
,因为它会禁用部署 war 文件的 manager 选项。这意味着您可以通过两种方式访问该应用:http://example.com/
和http://example.com/APP/
步骤 3:为了防止对 root 和 manager 文件夹进行不必要的访问,请将
valve
添加到这些上下文标记,如下所示:这实际上限制了管理员 web 应用程序文件夹对我们自己的域(假 IP 地址)和 localhost 的访问权限,当他们使用默认端口 8080 时,并保持通过 Web 界面动态部署 war 文件的能力。
如果要将此用于使用不同 IP 地址的多个应用程序,可以将 IP 地址添加到连接器(
address="143.21.2.1"
)。如果要从根运行多个 Web 应用程序,则可以复制 Service 标记(对于第二个使用不同的名称)并将
<Context path="/" docBase="CAS">
的 docbase 更改为例如<Context path="/" docBase="ICR">
。删除
$CATALINA_HOME/webapps/ROOT
。更新$CATALINA_HOME/conf/server.xml
,确保 Host 元素如下所示:它适用于 Tomcat 8. autoDeploy 和 deployOnStartup 需要设置为 false 以防止 tomcat 两次部署
myApp
。最快的方式。
确保没有部署 ROOT 应用程序,如果有部署则取消部署
将您的战争重命名为 ROOT.war,部署,全部,无需更改配置
添加 to @Rob Hruska 的 sol,server.xml inside 部分中的此设置有效:
注意:在某些情况下可能需要 override =“true”。
在我的服务器中我使用这个和 root autodeploy 工作得很好: