从不同的主机访问 Tomcat Manager App

Posted

技术标签:

【中文标题】从不同的主机访问 Tomcat Manager App【英文标题】:Access Tomcat Manager App from different host 【发布时间】:2016-08-10 18:34:33 【问题描述】:

我在远程服务器上安装了tomcat 9,启动后,它运行良好,我可以访问http://host_name:port_num并查看tomcat hello页面。但是当我尝试打开管理器应用程序来查看我部署的应用程序时,我得到 403 访问被拒绝,我已经在 tomcat 用户 xml 中添加了角色,如下所示:

<role rolename="manager"/>
<role rolename="manager-gui"/>
<role rolename="admin"/>
<user username="user" password="password" roles="admin,manager,manager-gui"/>

我看到的错误信息是:

默认情况下,主机管理器只能从与 Tomcat 运行在同一台机器上的浏览器访问。如果您希望修改此限制,则需要编辑主机管理器的 context.xml 文件。

我应该如何更改 context.xml 文件并访问管理器应用程序?

【问题讨论】:

【参考方案1】:

要从不同的机器访问 tomcat 管理器,您必须按照以下步骤操作:

1.用用户和一些角色更新 conf/tomcat-users.xml 文件

<role rolename="manager-gui"/>
 <role rolename="manager-script"/>
 <role rolename="manager-jmx"/>
 <role rolename="manager-status"/>
 <user username="admin" password="admin" roles="manager-gui,manager-script,manager-jmx,manager-status"/>

这里管理员用户正在分配 roles="manager-gui,manager-script,manager-jmx,manager-status"

这里的tomcat用户和密码是:admin

2。更新 webapps/manager/META-INF/context.xml 文件(允许 IP 地址):

默认配置

<Context antiResourceLocking="false" privileged="true" >
  
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
  
  <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>

在 Valve 中,它只允许本地机器 IP 以 127.\d+.\d+.\d+ 开头。

2.a : 允许特定 IP:

<Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|YOUR.IP.ADDRESS.HERE" />

在这里,您只需将 |YOUR.IP.ADDRESS.HERE 替换为您的 IP 地址

2.b:允许所有IP

<Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow=".*" />

这里使用 allow=".*" 您允许所有 IP。

谢谢:)

【讨论】:

请添加拒绝投票的具体原因。如果这个答案似乎错误,请解释。在你的解释之后,我可以提高我的知识。谢谢 您可以添加对来自网络的所有 ip 的访问,而不是允许访问单个 ip,使用与默认文件相同的语法: 这允许从本地网络 192.168.250.0/24 中的所有主机访问 这个答案是唯一一个指定 YOUR.IP.ADDRESS.HERE 的答案 - 因此真正回答了从不同主机访问管理器应用程序的问题,而不仅仅是从互联网上的任何地方。恕我直言,这应该是公认的答案。改进建议:将 2.a 移至顶部,可选添加@ThomasLIMIN 的建议。 我显然不希望我的主机被世界上任何地方访问,只有我的电脑,所以,我会赞成这个答案。【参考方案2】:

因为我必须努力学习,默认的 \etc\tomcat\server.xml 文件(至少适用于 OpenSUSE v15.2 上的 v9.0.36)已经包含了管理器和主机管理器应用程序的 &lt;Context ...&gt;&lt;Valve ...&gt; 定义!这些显然推翻了您可能在其他地方定义的任何context.xmlmanager.xml 文件。默认情况下,他们限制对 localhost 的访问,这正是我所看到的。 ||-( 因此,需要调整server.xml 中的设置,或者在那里删除/评论它们,然后可以像以前一样添加其他响应中提到的文件。

【讨论】:

您可能想提及您使用的是哪个 Linux 发行版:Debian 的软件包,例如没有没有在/etc/tomcat/server.xml 中定义Tomcat Manager,而是在/etc/tomcat/Catalina/localhost/manager.xml 中定义,就像在其他答案中一样。 我将其添加到我的回复中。感谢您指出这一点!【参考方案3】:

以下两种配置对我有用。

    tomcat-users.xml 详细信息


      <role rolename="manager-gui"/>
      <role rolename="manager-script"/>
      <role rolename="manager-jmx"/>
      <role rolename="manager-status"/>
      <role rolename="admin-gui"/>
      <role rolename="admin-script"/>
      <role rolename="tomcat"/>
    
      <user  username="tomcat"  password="tomcat" roles="tomcat"/>
    
      <user  username="admin"  password="admin" roles="admin-gui"/>
    
      <user  username="adminscript"  password="adminscrip" roles="admin-script"/>
    
      <user  username="tomcat"  password="s3cret" roles="manager-gui"/>
      <user  username="status"  password="status" roles="manager-status"/>
    
      <user  username="both"    password="both"   roles="manager-gui,manager-status"/>
    
      <user  username="script"  password="script" roles="manager-script"/>
      <user  username="jmx"     password="jmx"    roles="manager-jmx"/>
    /webapps/manager/META-INF/context.xml 的

    context.xml 和 /webapps/host-manager/META-INF/context.xml


<Context antiResourceLocking="false" privileged="true" >
    
      <Valve className="org.apache.catalina.valves.RemoteAddrValve"
             allow=".*" />
      <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>

【讨论】:

这个答案与这个问题不匹配【参考方案4】:

每个部署的 webapp 都有一个 context.xml 文件

$CATALINA_BASE/conf/[enginename]/[hostname]

(conf/Catalina/localhost by default)

并且与 webapp 具有相同的名称(在这种情况下为manager.xml)。如果没有文件,则使用默认值。

因此,您需要创建一个文件conf/Catalina/localhost/manager.xml 并指定要允许远程访问的规则。例如manager.xml的以下内容将允许所有机器访问:

<Context privileged="true" antiResourceLocking="false" 
         docBase="$catalina.home/webapps/manager">
    <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="^YOUR.IP.ADDRESS.HERE$" />
</Context>

注意Valve 元素的allow 属性是一个正则表达式,它匹配连接主机的IP 地址。因此,用您的 IP 地址替换 YOUR.IP.ADDRESS.HERE(或其他一些有用的表达式)。

其他Valve 类满足其他规则(例如RemoteHostValve 用于匹配主机名)。早期版本的 Tomcat 使用 Valve 类 org.apache.catalina.valves.RemoteIpValve 进行 IP 地址匹配。

完成上述更改后,在访问管理器 URL 时,您应该会看到一个身份验证对话框。如果您输入您在tomcat-users.xml 中提供的详细信息,您应该可以访问管理器。

【讨论】:

如何在不关闭和启动tomcat的情况下加载这些配置更改? 403 访问被拒绝 在tomcat 8中,您不需要做任何事情,这些配置更改立即生效。 经过几次尝试终于为我工作了。我试图在 context.xml 文件中进行更改,而更改是在路径“conf/Catalina/localhost”manager.xml 文件中进行的。如果它不存在,只需创建一个。 对于 tomcat 8.5.37,我还必须包括:【参考方案5】:

对于Tomcat v8.5.4及以上版本,文件&lt;tomcat&gt;/webapps/manager/META-INF/context.xml进行了调整:

<Context antiResourceLocking="false" privileged="true" >
    <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
</Context>

更改此文件以评论Valve

<Context antiResourceLocking="false" privileged="true" >
    <!--
    <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
    -->
</Context>

之后,刷新浏览器(无需重启Tomcat),即可看到管理页面。

【讨论】:

在 8.5.0 中工作,但需要重新启动。谢谢! 我不得不等待大约 10-15 秒,但在 8.5.11 中不需要重新启动。谢谢! 在 8.5.9 中工作,无需重新启动。但是,在 Windows 7 机器上应用大约需要 15 秒。谢谢! 403 访问被拒绝 对于 Tomcat 初学者,关于这个问题的一个重要事实是 Tomcat 使用多个 context.xml 文件。 Tomcat 的默认错误页面中的说明以 编辑管理器的上下文.xml 文件 可以更清楚地表述为编辑 Manager 应用程序目录中的 context.xml 文件。

以上是关于从不同的主机访问 Tomcat Manager App的主要内容,如果未能解决你的问题,请参考以下文章

利用 Tomcat 自带的 Manager 查看应用日志

Tomcat 虚拟主机配置

特定虚拟主机的 Tomcat 8 管理器用户

Tomcat默认工具manager管理页面访问配置

tomcat访问管理界面manager

Tomcat默认工具manager管理页面访问配置