Tomcat多应用部署与静态资源路径问题全解指南
🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用,熟悉DICOM医学影像及DICOM协议,业余时间自学JavaScript,Vue,qt,python等,具备多种混合语言开发能力。撰写博客分享知识,致力于帮助编程爱好者共同进步。欢迎关注、交流及合作,提供技术支持与解决方案。
技术合作请加本人wx(注明来自csdn):xt20160813
Tomcat多应用部署与静态资源路径问题全解指南
一、静态资源路径错误问题深度解析
1.1 根本原因分析
静态资源访问404错误的核心在于上下文路径(Context Path)与资源引用方式不匹配。当应用部署在/webapps/demo-web
目录时,Tomcat默认生成上下文路径/demo-web
,而前端若使用绝对路径/static/xxx.js
则会跳过上下文路径直接访问根目录资源。
典型错误场景:
# 部署路径
/var/lib/tomcat/webapps/demo-web/static/main.js# 错误访问路径(缺少上下文)
http://ip:8080/static/main.js → 404# 正确访问路径
http://ip:8080/demo-web/static/main.js
1.2 ROOT目录的特殊机制
webapps/ROOT
作为Tomcat的默认根上下文,部署在此的应用可直接通过根路径访问。其核心优势在于自动消除上下文路径层级,使得资源引用逻辑简化:
# 部署路径
/var/lib/tomcat/webapps/ROOT/static/main.js# 访问路径
http://ip:8080/static/main.js → 200
二、静态资源问题解决方案
2.1 方案一:ROOT目录部署(推荐)
操作步骤:
- 清空并重构ROOT目录:
rm -rf /var/lib/tomcat/webapps/ROOT/* cp -r /path/to/demo-web/{WEB-INF,META-INF,static} /var/lib/tomcat/webapps/ROOT/
- 权限验证:
chown -R tomcat:tomcat /var/lib/tomcat/webapps/ROOT # 所有权设置 chmod 750 /var/lib/tomcat/webapps/ROOT/static # 目录权限控制
- 访问验证:
curl http://192.168.118.201:8080/?studyUID=xxx
2.2 方案二:上下文路径修正
前端改造方案:
调整前端资源引用方式
在前端代码(如HTML/JSP)中,将静态资源路径改为相对路径:
<!-- 原路径(错误) -->
<script src="/static/xxx.js"></script><!-- 修正后(正确) -->
<script src="static/xxx.js"></script>
如下所示:
<!-- 相对路径修正 -->
<script src="static/main.js"></script><!-- JSP动态路径 -->
<script src="${pageContext.request.contextPath}/static/main.js"></script>
Tomcat配置优化:
<!-- conf/Catalina/localhost/demo-web.xml -->
<Context path="/demo" docBase="/var/lib/tomcat/webapps/demo-web"reloadable="false" />
2.3 方案三:Nginx反向代理
配置示例:
server {listen 80;server_name dicomai.example.com;location /static/ {alias /var/lib/tomcat/webapps/demo-web/static/;}location / {proxy_pass http://localhost:8080/demo-web/;}
}
三、多应用部署策略与实现
3.1 单Tomcat实例多应用部署
方法1:多上下文路径部署
/webapps/
├── app1 # 访问路径: http://ip:8080/app1
└── app2 # 访问路径: http://ip:8080/app2
方法2:自定义Context配置
<!-- conf/Catalina/localhost/app1.xml -->
<Context path="/erp" docBase="/opt/tomcat/webapps/erp"reloadable="true" />
3.2 多端口部署方案
<!-- conf/server.xml -->
<Service name="Catalina-ERP"><Connector port="8081" protocol="HTTP/1.1" /><Engine name="Catalina-ERP" defaultHost="localhost"><Host name="localhost" appBase="webapps-erp" /></Engine>
</Service>
3.3 多Tomcat实例部署
部署流程:
- 实例克隆:
cp -r /opt/tomcat /opt/tomcat-erp
- 端口配置:
<!-- /opt/tomcat-erp/conf/server.xml --> <Connector port="8081" protocol="HTTP/1.1" />
- 独立启动:
/opt/tomcat-erp/bin/startup.sh
四、部署方案对比与选型建议
方案 | 适用场景 | 优势 | 劣势 |
---|---|---|---|
单实例多上下文 | 开发/测试环境 | 快速部署,零配置 | 路径冗长,资源竞争 |
多端口单实例 | 预生产环境 | 路径简洁,端口隔离 | 配置复杂度高 |
多Tomcat实例 | 生产环境 | 完全资源隔离,高可用 | 资源占用多,维护成本高 |
选型建议:
- 开发环境:采用多上下文部署,快速验证功能
- 预发布环境:使用多端口隔离关键应用
- 生产环境:推荐多实例部署,结合Nginx负载均衡
五、运维最佳实践
5.1 安全加固
- 权限控制:
chmod 750 $CATALINA_BASE/conf # 配置文件保护 rm -rf webapps/{docs,examples} # 删除非必要组件
- 日志监控:
tail -f logs/catalina.out | grep -E 'ERROR|WARN' # 实时异常监控
5.2 性能调优
# setenv.sh 配置
export JAVA_OPTS="-Xms4G -Xmx8G -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
六、附录:关键操作速查表
问题现象 | 排查命令 | 解决方案 |
---|---|---|
静态资源404 | grep 'static' logs/localhost_access_log | 检查上下文路径匹配 |
端口冲突 | netstat -tulnp \| grep 8080 | 修改server.xml端口配置 |
内存溢出 | jmap -heap <PID> | 调整JVM参数 |
权限拒绝 | ls -lZ /var/lib/tomcat/webapps | 修正SELinux策略 |
通过本文的系统化方案,开发者可有效解决Tomcat部署中的路径映射问题,并根据实际环境选择最优的多应用部署策略。建议生产环境优先采用多实例部署保障稳定性,开发环境使用多上下文提升效率。
相关文章:
Tomcat多应用部署与静态资源路径问题全解指南
🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C、C#等开发语言,熟悉Java常用开…...
128.在 Vue 3 中使用 OpenLayers 实现绘制矩形截图并保存地图区域
📌 本文将介绍如何在 Vue 3 中使用 OpenLayers 实现: 1)用户可在地图上绘制矩形; 2)自动截取该区域地图为图片; 3)一键保存为本地 PNG 图片。 ✨效果如下图所示 🧠一、前言 在地图类…...
使用 163 邮箱实现 Spring Boot 邮箱验证码登录
使用 163 邮箱实现 Spring Boot 邮箱验证码登录 本文将详细介绍如何使用网易 163 邮箱作为 SMTP 邮件服务器,实现 Spring Boot 项目中的邮件验证码发送功能,并解决常见配置报错问题。 一、为什么需要邮箱授权码? 出于安全考虑,大…...
python处理异常,JSON
异常处理 #异常处理 # 在连接MySQL数据库的过程中,如果不能有效地处理异常,则异常信息过于复杂,对用户不友好,暴露过多的敏感信息 # 所以,在真实的生产环境中, 程序必须有效地处理和控制异常,按…...
原生微信小程序 textarea组件placeholder无法换行的问题解决办法
【问题描述】 微信小程序原生代码,使用文本域,placeholder使用\n 没有效果,网上找了一堆方案说使用 也没有效果 最后在一个前端大佬博客,找到解决办法,CSS设置word-wrap: break-word; white-space: pre-line; 【解决办…...
毕设设计 | 管理系统图例
文章目录 环素1. 登录、注册2. 菜单管理 环素 1. 登录、注册 2. 菜单管理 公告通知 订单管理 会员管理 奖品管理 新增、编辑模块...
激光雷达视觉定位是3D视觉定位吗?
激光雷达视觉定位通常被归类为3D视觉定位,但具体来说,它是融合了激光雷达(LiDAR)数据和视觉(图像)数据的多模态3D定位方法。我们可以从几个角度来理解这点: 为什么说它属于3D视觉定位ÿ…...
每周靶点:NY-ESO-1、GPC3、IL27分享
本期精选了《自身免疫性癌抗原NY-ESO-1》《肝细胞癌标记物GPC3》《白细胞介素IL27》三篇文章。以下为各研究内容的概述: 自身免疫性癌抗原NY-ESO-1 NY-ESO-1是一种自身免疫性癌抗原,也称为CTA1B(CTAG1B),由主要组织相…...
Maven 插件参数注入与Mojo开发详解
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
Java详解RabbitMQ工作模式之发布订阅模式
目录 一、发布订阅模式简介二、发布订阅模式的工作原理2.1 核心组件2.2 工作流程 三、代码示例3.1 生产者代码3.2 消费者代码 四、实际应用场景五、注意事项六、总结 在分布式系统中,消息队列作为异步通信的桥梁,扮演着至关重要的角色。而 RabbitMQ&…...
UR5e机器人Matlab仿真
在 MATLAB 中使用 UR5e 机器人模型进行仿真和控制,通常需要结合机器人系统工具箱(Robotics System Toolbox) UR5e loadrobot("universalUR5e","DataFormat","column"); UR5e.Gravity [0 0 -9.81]; % 保存机器…...
[ctfshow web入门] web75
信息收集 scandir被禁用了 解题 cforeach(new DirectoryIterator("glob:///*") as $a){echo($a->__toString(). ); } ob_flush();cif ( $a opendir("glob:///*") ) {while ( ($file readdir($a)) ! false ) {echo $file."<br>";}c…...
论文中表格跨页该怎么整(如何给跨页表格添加标题和表头)
标题:光标移动到第一行表格,然后快捷键;ctrl shirft enter,就会发现第二页多了一行,再把标题复制张贴过来即可 表头: 光标移动到第一行表格,鼠标右键 选择插入 再选择在上方插入行,然后手动添加…...
day26 Python 自定义函数
目录 一、函数的基本定义 示例 1:不带参数的函数 示例 2:查看文档字符串 二、带参数的函数 示例 3:带一个参数的函数 示例 4:带多个参数的函数 三、带返回值的函数 示例 5:计算两个数的和并返回结果 示例 6&am…...
洛谷P4907题解
题目传送门 题意: 扑克牌的部分牌被移除,需从剩牌中选 4 个区间,每个区间的牌都是同一花色且点数连续。如果不可选,输出最少需添加几张牌才能满足要求。 思路: 暴力和剪枝。 暴力:按照题意模拟ÿ…...
【MyBatis插件】PageHelper 分页
前言 在开发 Web 应用时,我们经常需要处理海量数据的展示问题。例如,在一个电商平台上,商品列表可能有成千上万条数据。如果我们一次性将所有数据返回给前端,不仅会导致页面加载缓慢,还会对数据库造成巨大压力。为了解…...
AI数字人融合VR全景:从技术突破到可信场景落地
摘要 本文深度解析AI数字人与VR全景技术融合的技术架构,结合故宫博物院、西门子、强生等真实行业案例,揭示技术落地的关键路径与量化价值。通过具体技术参数、实施细节及权威机构数据,构建可信的技术应用图景,为开发者提供可复用…...
机器学习——朴素贝叶斯练习题
一、 使用鸢尾花数据训练多项式朴素贝叶斯模型,并评估模型 代码展示: from sklearn.datasets import load_iris from sklearn.metrics import accuracy_score from sklearn.model_selection import train_test_split from sklearn.naive_bayes impor…...
【爬虫】DrissionPage-3
安装:4.1最新版本 pip install drissionpage --upgrade 官方文档:🛰️ 连接浏览器 | DrissionPage官网 1 Chromium对象 Chromium对象用于连接和管理浏览器。标签页的开关和获取、整体运行参数配置、浏览器信息获取等都由它进行。 1.1 默认…...
网络爬虫学习之httpx的使用
开篇 本文整理自《Python3 网络爬虫实战》,主要是httpx的使用。 笔记整理 使用urllib库requests库的使用,已经可以爬取绝大多数网站的数据,但对于某些网站依然无能为力。 这是因为这些网站强制使用HTTP/2.0协议访问,这时urllib和r…...
TASK02【Datawhale 组队学习】使用 LLM API 开发应用
文章目录 system prompt 和 user prompt高效prompt:用清晰、详尽的语言表达 Prompt原则一:清晰,具体的指令分隔符寻求结构化的输出要求模型检查是否满足条件提供少量示例 "Few-shot" prompting 原则二,给模型时间去思考…...
黑马k8s(七)
1.Pod介绍 查看版本: 查看类型,这里加s跟不加s没啥区别,可加可不加 2.Pod基本配置 3.镜像拉去策略 本地没有这个镜像,策略是Never,启动失败 查看拉去策略: 更改拉去策略: 4.启动命令 运行的是nginx、busv…...
【FMC216】基于 VITA57.1 的 2 路 TLK2711 发送、2 路 TLK2711 接收 FMC 子卡模块
产品概述 FMC216 是一款基于 VITA57.1 标准规范的 2 路 TLK2711 接收、2 路 TLK2711 发送 FMC 子卡模块。该板卡支持 2 路 TLK2711 数据的收发,支持线速率 1.6Gbps,经过 TLK2711 高速串行收发器,可以将 1.6Gbps 的高速串行数据解串为 16 位并…...
如何在Edge浏览器里-安装梦精灵AI提示词管理工具
方案一(应用中心安装-推荐): 梦精灵 跨平台AI提示词管理工具 - Microsoft Edge AddonsMake Microsoft Edge your own with extensions that help you personalize the browser and be more productive.https://microsoftedge.microsoft.com…...
Ubuntu shell指定conda的python环境启动脚本
Ubuntu shell指定conda的python环境启动脚本。 通过指令,获取目前系统的conda虚拟python环境 conda info -e 如下图所示,为我自己电脑的python环境 # conda environments: # base * /home/ubuntu/miniconda3 kitti …...
深入理解无监督学习与K-means聚类算法:原理与实践
一、无监督学习概述 无监督学习(Unsupervised Learning)是机器学习的重要分支之一,与有监督学习不同,它不需要预先标记的训练数据。在无监督学习中,计算机仅根据样本的特征或样本间的相关性,从数据中自动发现隐藏的模式或结构。 …...
单片机-STM32部分:16、Git工具使用
Docshttps://x509p6c8to.feishu.cn/wiki/Pftrw3Z6niRlewkurnyctyw1nQx 使用Git管理本地仓库的好处是,可以知道自己每次修改了哪些内容,随时进行版本切换。 待完善。...
扬州卓韵酒店用品:优质洗浴用品,提升酒店满意度与品牌形象
在酒店提供的服务里,沐浴用品占据了非常重要的地位,其质量与种类直接关系到客人洗澡时的感受。好的沐浴用品能让客人洗澡时感到舒心和快乐,反之,质量不好的用品可能会影响客人整个住宿期间的愉悦心情。挑选恰当的洗浴用品不仅能够…...
Coze 实战教程 | 10 分钟打造你的AI 助手
> 文章中的 xxx 自行替换,文章被屏蔽了。 📱 想让你的xxx具备 AI 对话能力?本篇将手把手教你,如何用 Coze 平台快速构建一个能与用户自然交流、自动回复提问的 xxx助手,零代码、超高效! 📌…...
使用 frp 实现内网穿透:从基础到进阶
在日常开发中,我们经常会遇到需要将本地服务暴露给外部用户的情况,比如测试同学需要临时测试一个本地开发的 Web 服务,或者希望在出差时远程访问家里的 NAS。这些需求的核心问题都是如何实现内网穿透。 一、为什么选择 frp? 经过…...
redis中key的过期和淘汰
一、过期(redis主动删除) 设置了ttl过期时间的key,在ttl时间到的时候redis会删除过期的key。但是redis是惰性过期。惰性过期:redis并不会立即删除过期的key,而是会在获取key的时候判断key是否过期,如果发现…...
鸿蒙OSUniApp制作多选框与单选框组件#三方框架 #Uniapp
使用UniApp制作多选框与单选框组件 前言 在移动端应用开发中,表单元素是用户交互的重要组成部分。尤其是多选框(Checkbox)和单选框(Radio),它们几乎存在于每一个需要用户做出选择的场景中。虽然UniApp提供…...
和为target问题汇总
文章目录 习题题型1377.组合总和 IV 题型2494.目标和 和为target的问题,可以有很多种问题的形式的考察,当然,及时的总结与回顾有利于我们熟练掌握这些知识! 题型1 爬楼梯问题,是对于转移步伐有规定,在不同…...
Ubuntu使用Docker搭建SonarQube企业版(含破解方法)
目录 Ubuntu使用Docker搭建SonarQube企业版(含破解方法)SonarQube介绍安装Docker安装PostgreSQL容器Docker安装SonarQube容器SonarQube汉化插件安装 破解生成license配置agent 使用 Ubuntu使用Docker搭建SonarQube企业版(含破解方法ÿ…...
牛客网 NC22167: 多组数据a+b
牛客网 NC22167: 多组数据ab 题目分析 这道题目来自牛客网(题号:NC22167),要求我们计算两个整数a和b的和。乍看简单,但有以下特殊点需要注意: 输入包含多组测试数据每组输入两个整数当两个整数都为0时表示…...
EdgeShard:通过协作边缘计算实现高效的 LLM 推理
(2024-05-23) EdgeShard: Efficient LLM Inference via Collaborative Edge Computing (EdgeShard:通过协作边缘计算实现高效的 LLM 推理) 作者: Mingjin Zhang; Jiannong Cao; Xiaoming Shen; Zeyang Cui;期刊: (发表日期: 2024-05-23)期刊分区:本地链接: Zhang 等 - 2024 …...
π0: A Vision-Language-Action Flow Model for General Robot Control
TL;DR 2024 年 Physical Intelligence 发布的 VLA 模型 π0,基于 transformer 流匹配(flow matching)架构,当前开源领域最强的 VLA 模型之一。 Paper name π0: A Vision-Language-Action Flow Model for General Robot Contr…...
RabbitMQ高级篇-MQ的可靠性
目录 MQ的可靠性 1.如何设置数据持久化 1.1.交换机持久化 1.2.队列持久化 1.3.消息持久化 2.消息持久化 队列持久化: 消息持久化: 3.非消息持久化 非持久化队列: 非持久化消息: 4.消息的存储机制 4.1持久化消息&…...
4、前后端联调文生文、文生图事件
4、前后端联调文生文、文生图事件 原文地址 1、底部【发送按钮】事件触发调用后端AI程序逻辑 <!-- 前端模板如下: --> <!DOCTYPE html> <html><head><meta charset"utf-8"><title>小薛博客LLM大模型实战</title><me…...
深度学习中的提示词优化:梯度下降全解析
深度学习中的提示词优化:梯度下降全解析 在您的代码中,提示词的更新方向是通过梯度下降算法确定的,这是深度学习中最基本的优化方法。 一、梯度下降与更新方向 1. 核心公式 对于可训练参数 θ \theta θ(这里是提示词嵌入向量),梯度下降的更新公式为:...
Midjourney 最佳创作思路与实战技巧深度解析【附提示词与学习资料包下载】
引言 在人工智能图像生成领域,Midjourney 凭借其强大的艺术表现力和灵活的创作模式,已成为设计师、艺术家和创意工作者的核心工具。作为 CSDN 博主 “小正太浩二”,我将结合多年实战经验,系统分享 Midjourney 的创作方法论&#x…...
【数字图像处理】半开卷复习提纲
1:要求 2张A4纸以内,正反面均可写 (不过博主由于墨水浸到背面了,采用了把2张单面通过双面胶粘起来的方法,结果考前半个小时都在用这个难用的双面胶。。。) 2:提纲内容 3:提示 考的…...
交通运输与能源融合发展——光储充在交通上的应用完整解决方案
在全球积极应对气候变化、推动可持续发展的大背景下,交通运输与能源领域的融合发展成为关键趋势。近日,交通运输部等十部门联合发布的《关于推动交通运输与能源融合发展的指导意见》,为这两个重要行业的协同前行指明了清晰的方向,…...
API 接口开放平台 Crabc 3.2 发布
2025 年 5 月 15 日,API 接口开放平台 Crabc 3.2 发布。 Crabc 是一款 API 接口开发平台、企业级接口管理和 SQL2API 平台。它支持动态数据源、动态 SQL 和标签,能接入多种 SQL 或 NoSQL 数据源,包括 MySQL、Oracle、达梦、TiDB、Hive、ES 和…...
基于智能推荐的就业平台的设计与实现(招聘系统)(SpringBoot Thymeleaf)+文档
💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…...
【web应用】配置Java JDK与maven3的环境变量
文章目录 一、控制面板 - 系统 - 高级系统设置-环境变量二、用户变量和系统变量的配置方法一样:三、查看是否配置成功 maven有两种安装方式: 1、IDEA捆绑安装,一般是maven3【这里配置的环境变量是捆绑安装这种方式】 2、手动下载安装插件 一、…...
编程日志5.7
二叉树的功能代码 #include<iostream> using namespace std; //二叉树结点定义 template<typename T> struct TreeNode { T val;//定义了一个类型为T的成员变量val,用于存储树节点的值 TreeNode* left;//定义了一个指向TreeNode类型的指针成员变量left,…...
室内定位:热门研究方向与未解难题深度解析
I. 引言:对普适性室内定位的持续探索 A. 室内定位在现代应用中的重要性 室内定位系统(IPS)正迅速成为众多应用领域的基石技术,其重要性源于现代社会人们约70%至90%的时间在室内度过的事实 1。这些应用横跨多个行业,包括应急响应 1、智能建筑与智慧城市 6、医疗健康(如病…...
图片通过滑块小图切换大图放大镜效果显示
图片通过滑块小图切换大图放大镜效果显示 实现目标: 显示一组图片列表,鼠标进入小图记录当下小图下标,通过小图下标在数组中对应图片显示到大图位置; 鼠标进入大图位置时,带动滑块移动,并将放大两倍的大图…...
[250515] 腾讯推出 AI 编程助手 CodeBuddy,对标 Cursor
目录 腾讯推出 AI 编程助手 CodeBuddy 腾讯推出 AI 编程助手 CodeBuddy 腾讯发布 CodeBuddy,一款 AI 编程助手,旨在提升开发者效率。 主要亮点: CodeBuddy: 全新英文品牌,面向全球开发者。Craft 模式: A…...