@qiao39gs
2026-04-15T07:01:01.000000Z
字数 1686
阅读 2
从你提供的图片和描述来看,这是一个非常经典的 Tomcat 配置现象。你遇到了所谓的“双重部署”(Double Deployment)问题(在这个场景下它被当作一种“特性”来使用了)。
下面我为你剖析为什么原服务器可以同时访问,以及在切换到宝兰德(BES)后该如何实现同样的效果。
原服务器能同时通过 /appsup 和 /(空前缀)访问,是因为 Tomcat 的 server.xml 配置导致该应用被启动并部署了两次:
/appsup): <Host appBase="webapps" autoDeploy="true"> 告诉 Tomcat 自动扫描 webapps 目录。你的 webapps 目录下正好有一个名为 appsup 的文件夹。Tomcat 自动将其部署,默认的上下文路径(Context Path)就是文件夹名,即 /appsup。/): <Context path="" docBase="appsup" reloadable="false" /> 这行配置明确指示 Tomcat,将 appBase(即 webapps)下的 appsup 目录,绑定到空上下文路径 ""(即根路径 /)上。总结: 并不是一个应用同时监听了两个前缀,而是 Tomcat 在同一个端口下,把同一份代码作为两个独立的应用启动了两次,一个挂在 /,一个挂在 /appsup。由于你本地启动时(比如通过 IDEA 或 Eclipse)通常只能指定一个 Context Path,所以你本地只能二选一。
宝兰德(BES)等企业级中间件通常更严格地遵循 Java EE 规范,一般在控制台部署时,一个 WAR 包或应用目录只能映射到一个 Context Root(基础路径)。
要达到原来服务器的效果,你有以下几种方案:
既然 Tomcat 是通过部署两次来实现的,你可以在宝兰德的 Web 管理控制台中“依样画葫芦”:
1. 第一次部署: 将你的应用包(WAR 或目录)部署上去,将“上下文根”/“基础路径”配置为 /appsup。
2. 第二次部署: 再次上传或选择同一个应用包进行部署,这一次将应用名称改一下(避免冲突,例如叫 appsup-root),并将“上下文根”/“基础路径”配置为 / (或者是空,根据宝兰德版本控制台的提示)。
优点:完全复刻 Tomcat 的运行状态,不需要改代码,也不需要增加外部组件。
缺点:应用会启动两次,占用双倍的内存,定时任务等单例机制可能会执行两次(如果应用里有的话)。
在生产环境中,更优雅的做法是应用只部署一次,利用前面的反向代理(如 Nginx)来处理路径抹平或增加前缀。
/。在前端 Nginx 配置中增加代理:
# 匹配外围接口(不需要前缀的)location / {proxy_pass http://bes_ip:bes_port/;}# 匹配需要登录的路径(带有 /appsup 前缀的),将其重写并转发给根路径location /appsup/ {proxy_pass http://bes_ip:bes_port/;}
(注:如果你的应用代码里硬编码了必须带 /appsup 才能跳转或加载静态资源,则在宝兰德部署时基础路径需设置为 /appsup,然后在 Nginx 端做反向的映射。)
在宝兰德上统一将基础路径配置为 /。
如果那些“外围接口”是在应用内部自己写好了不需要 /appsup 前缀的映射(比如 Spring MVC 的 @RequestMapping 直接挂在顶层),那么只要统一部署到 /,接口天然就能通。至于原本带 /appsup 前缀的请求,可以在代码里加一个 Filter 进行请求路径的转发(Forward)。
如果你希望最快、改动最小地在新服务器上跑起来,且服务器内存足够,直接使用 方案 A(部署两次) 即可。如果考虑长期的架构规范,建议采用 方案 B(Nginx 转发)。