从不同的主机访问Tomcat管理应用程序

123

我已经在远程服务器上安装了Tomcat 9,并成功启动,可以访问http://host_name:port_num并看到Tomcat欢迎页面。但是当我尝试打开管理应用程序以查看部署的应用程序时,我收到403访问被拒绝的错误提示,我已经按照以下方式在Tomcat用户xml中添加了角色:

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

我看到的错误信息是:

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

我应该如何更改context.xml文件以获得对管理器应用程序的访问权限?

6个回答

186
对于Tomcat v8.5.4及以上版本,文件<tomcat>/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),您就可以看到管理页面了。

1
在8.5.0版本中有效,但需要重新启动。谢谢! - JRichardsz
3
我需要等大约10-15秒钟,但在8.5.11版本中不需要重新启动。谢谢! - Karl Henselin
2
在没有重新启动的情况下,在8.5.9版本上工作正常。然而,在Windows 7机器上应用该程序大约需要15秒的时间。谢谢! - cbmeeks
2
403 访问被拒绝 - 3xCh1_23
2
对于Tomcat初学者而言,一个重要的事实是Tomcat会使用多个context.xml文件。在Tomcat默认错误页面中,关于编辑Manager的context.xml文件的指令可以更清晰地表述为编辑Manager应用程序目录中的context.xml文件 - CODE-REaD
显示剩余9条评论

159

每个已部署的webapp都有一个位于context.xml文件中的配置文件。

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

(conf/Catalina/localhost by default)

并且与Web应用程序具有相同的名称(在本例中为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地址匹配的正则表达式。因此,请使用YOUR.IP.ADDRESS.HERE(或其他有用的表达式)替换您自己的IP地址。
其他Valve类可以满足其他规则(例如,RemoteHostValve用于匹配主机名)。早期版本的Tomcat使用一个名为org.apache.catalina.valves.RemoteIpValve的阀门类进行IP地址匹配。
一旦完成以上更改,访问管理器URL时应该会出现身份验证对话框。如果输入在tomcat-users.xml中提供的详细信息,您应该可以访问Manager。

403 访问被拒绝 - 3xCh1_23
3
在Tomcat 8中,您无需执行任何操作,这些配置更改会立即生效。 - Ayushya
3
试了几次后终于成功了。我一直在尝试在context.xml文件中进行更改,而实际上应该在路径"conf/Catalina/localhost"下的manager.xml文件中进行更改。如果该文件不存在,只需创建一个即可。 - Umar Maniar
@OlafKock 公正的观点 - 我已经更新了答案以反映您的担忧。 - Matt Innes
运行得非常好,适用于Tomcat 9,并且挽救了我的晚上!谢谢! - mmo
显示剩余3条评论

41

要从不同的机器上访问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"/>

这里的管理员用户正在分配角色="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" />

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

2.b : 允许所有IP:

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

在这里使用 allow=".*" 表示允许所有IP。

谢谢:)


1
请添加一个具体的点踩原因。如果这个答案看起来不正确,请解释一下。在你的解释之后,我可以提高我的知识水平。谢谢。 - Md. Sajedul Karim
2
与其只允许单个 IP 访问,您可以使用与默认文件相同的语法添加对来自网络中所有 IP 的访问:这将允许来自本地网络 192.168.250.0/24 中的所有主机访问。 - Thomas LIMIN
3
这个答案是唯一一个明确指定YOUR.IP.ADDRESS.HERE的答案,因此真正回答了从其他主机访问管理应用程序的问题,而不仅仅是从互联网上的任何地方访问。我认为这应该成为被采纳的答案。改进建议:将2.a移到顶部,可选地添加@ThomasLIMIN的建议。 - Olaf Kock
1
显然我不希望我的主机可以从世界上任何地方访问,只有我的计算机可以,所以我会点赞这个回答。 - Leandro Gamarra

6
以下两个配置对我起作用。
  1. 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"/>
  1. /webapps/manager/META-INF/context.xml和/webapps/host-manager/META-INF/context.xml的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"/>


这个答案与这个问题不符。 - 袁文涛

1

以下是我在AWS Linux 2上使用的sed命令,通过AWS EC2用户数据脚本使其工作:

注意:这允许从所有IP“.*”访问,如果您不想要这样,请将最后一个sed命令中的“.*”更改为您想要的任何IP。

将以下内容更改为您想要的内容:

YOUR USER NAME
YOUR PASSWORD

此外,通过将/abcd替换为您的Tomcat安装位置来更新Tomcat安装路径:

/abcd/tomcat/conf/tomcat-users.xml
/abcd/tomcat/webapps/manager/META-INF/context.xml
/abcd/tomcat/webapps/host-manager/META-INF/context.xml

命令:

# Add a user to Tomcat manager
sed -i 's/<\/tomcat-users>//g' /abcd/tomcat/conf/tomcat-users.xml
echo '<user name="YOUR USER NAME" password="YOUR PASSWORD" roles="manager-gui,admin-gui" />' | tee -a  /abcd/tomcat/conf/tomcat-users.xml
echo '</tomcat-users>' | tee -a  /abcd/tomcat/conf/tomcat-users.xml

# Set the Tomcat Manager apps to allow connections from everywhere
# Note: the -r forces sed to respect full regex
sed -i -r 's/127\\\.\\d\+\\\.\\d\+\\\.\\d\+\|::1\|0:0:0:0:0:0:0:1/\.\*/g' /abcd/tomcat/webapps/manager/META-INF/context.xml
sed -i -r 's/127\\\.\\d\+\\\.\\d\+\\\.\\d\+\|::1\|0:0:0:0:0:0:0:1/\.\*/g' /abcd/tomcat/webapps/host-manager/META-INF/context.xml

0

我不得不通过艰难的方式学习默认的\etc\tomcat\server.xml文件(至少对于OpenSUSE v15.2上的v9.0.36版本),已经包含了manager和host-manager应用程序的<Context ...><Valve ...>定义!这些显然会覆盖您在其他地方定义的context.xmlmanager.xml文件。默认情况下,它们限制对本地主机的访问,这正是我所看到的。因此,需要在server.xml中调整设置,或者将其删除/注释,然后可以像以前一样添加其他响应中提到的文件。


你可能需要提及你使用的Linux发行版:Debian的软件包并没有/etc/tomcat/server.xml中定义Tomcat Manager,而是在/etc/tomcat/Catalina/localhost/manager.xml中,就像其他答案中所述。 - Piotr P. Karwasz
我已将其添加到我的回复中。感谢您指出这一点! - mmo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接