当在同一个tomcat中部署相同项目时的注意

本文解决了在同一Tomcat中部署多个相同项目时出现的listener启动失败的问题。通过为每个项目设置独立的WEB_APP_ROOT_KEY_PARAM参数,避免了因Log4jConfigListener导致的异常。
今天遇到这样的需求,在同一个服务器上部署相同的项目,用来给不同的用户使用。为了节省服务器的开销,很当然的想到在同一个tomcat中,将项目复制一下,然后修改项目名称和web.xml中的servlet的名称就OK了。但是一直报错
SERVER:Error listenerStart


两个app单独启动就ok,同时部署就severe了,listener启动失败


原因是加了spring的log4j监听器
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

Log4jConfigListener的contextInitialized方法最终会调用WebUtils.setWebAppRootSystemProperty来设置webapp.root,如果root已经存在就会抛出异常


解决办法从上面代码也就能猜到,就是在web.xml中为每个app设置各自的WEB_APP_ROOT_KEY_PARAM,如下
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>simulator.root</param-value>
</context-param>



表示对文章原作者的感谢和尊重,附上原帖的地址:http://blog.youkuaiyun.com/lzzyok/article/details/7571727
在多个 Tomcat 实例中部署相同的 WAR 包,可以通过分别配置每个 Tomcat 实例的 `webapps` 目录来实现。以下是详细的部署步骤和注意事项: ### 配置独立的 Tomcat 实例 1. **安装多个 Tomcat 实例** 首先,需要在服务器上安装多个 Tomcat 实例。可以通过复制 Tomcat 主目录并重命名来创建多个实例,例如: ```bash cp -r /opt/tomcat /opt/tomcat1 cp -r /opt/tomcat /opt/tomcat2 ``` 每个实例的目录结构保持一致,但需要分别配置不同的端口和工作目录。 2. **修改端口配置** 每个 Tomcat 实例需要使用不同的端口以避免冲突。编辑 `conf/server.xml` 文件,修改 `Server`、`Connector` 和 `Engine` 的端口设置。例如: ```xml <Server port="8005" shutdown="SHUTDOWN"> <Service name="Catalina"> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Engine name="Catalina" defaultHost="localhost"> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> </Host> </Engine> </Service> </Server> ``` 对于第二个实例,可以将 `Server` 的 `port` 改为 `8006`,`Connector` 的 `port` 改为 `8081`,以此类推 [^3]。 3. **部署 WAR 包** 将相同的 WAR 包复制到每个 Tomcat 实例的 `webapps` 目录中。例如: ```bash cp /path/to/yourapp.war /opt/tomcat1/webapps/ cp /path/to/yourapp.war /opt/tomcat2/webapps/ ``` 启动每个 Tomcat 实例后,WAR 包会自动解压并部署到各自的 `webapps` 目录中 [^4]。 ### 配置共享的 WAR 包 1. **使用符号链接** 如果希望多个 Tomcat 实例共享同一个 WAR 包,可以使用符号链接。首先,将 WAR 包放置在一个共享目录中,然后在每个 Tomcat 实例的 `webapps` 目录中创建符号链接: ```bash ln -s /shared/path/to/yourapp.war /opt/tomcat1/webapps/yourapp.war ln -s /shared/path/to/yourapp.war /opt/tomcat2/webapps/yourapp.war ``` 这样,所有 Tomcat 实例都会指向同一个 WAR 包,并在启动自动解压和部署 [^3]。 2. **使用外部存储** 另一种方法是将 WAR 包存储在一个外部存储位置(如 NFS 共享),并通过网络挂载到每个 Tomcat 实例的 `webapps` 目录中。这种方法适用于需要集中管理的场景。 ### 配置管理界面权限 如果需要通过 Tomcat 的管理界面进行操作,确保在 `conf/tomcat-users.xml` 中正确配置用户权限: ```xml <tomcat-users> <role rolename="manager-gui"/> <user username="admin" password="password" roles="manager-gui"/> </tomcat-users> ``` 同,在 `webapps/manager/META-INF/context.xml` 中允许访问管理界面的 IP 地址: ```xml <Context privileged="true"> <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|192\.168\.0\.\d+" /> </Context> ``` 这样可以避免出现 403 错误 [^4]。 ### 相关问题 1. 如何在单个 Tomcat 实例中部署多个 WAR 包? 2. 如何配置 Tomcat 以支持 HTTPS? 3. 如何在 Tomcat 中配置数据库连接池? 4. 如何优化 Tomcat 的性能以支持高并发请求? 5. 如何通过 Tomcat 的日志文件进行故障排查?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值