阅读量:3
Tomcat日志中静态资源加载问题解析
一 常见现象与日志特征
- 访问静态资源返回HTTP 404,同时在catalina.out或应用日志中出现 Spring MVC 的提示:例如org.springframework.web.servlet.PageNotFound.noHandlerFound或DispatcherServlet.noHandlerFound,典型信息是“No mapping found for HTTP request with URI [/app/index.html]”。这通常意味着静态资源被DispatcherServlet拦截但找不到对应处理器。
- 启动阶段出现严重: Error starting static Resources java.lang.IllegalArgumentException,多与server.xml / web.xml中资源配置不当有关,例如**
指向错误或 的docBase/path**不一致,导致应用资源集无效。 - 运行期出现缓存相关警告:org.apache.catalina.webresources.Cache.getResource Unable to add the resource … consider increasing the maximum size of the cache,说明web资源缓存空间不足,需要调大缓存上限。
- 访问路径与部署结构不匹配:应用部署在**/webapps/demo-web**(上下文为**/demo-web**),前端却用**/static/xxx.js绝对路径访问根上下文,导致404**;正确应为**/demo-web/static/xxx.js**,或将应用部署为ROOT以使用根路径。
二 快速排查步骤
- 定位日志与请求链路:优先查看catalina.out与应用日志,确认是404/500还是启动期异常;必要时在浏览器开发者工具中核对Request URL与Response Status/Headers。
- 校验部署与路径:确认静态资源已随应用打包进WAR,并解压到webapps/应用名/的正确目录;检查server.xml中**
与 **是否一致,避免“主资源集无效”。 - 检查是否被框架拦截:若使用Spring MVC且DispatcherServlet映射为**“/”,静态资源会被拦截。可在web.xml启用default Servlet映射(如
*.html,*.css,*.js),或在 Spring 配置中使用mvc:resources或mvc:default-servlet-handler/**放行静态资源。 - 校验访问路径与上下文:确保页面引用包含正确的Context Path(如使用JSP EL:
${pageContext.request.contextPath}/static/main.js),或将应用部署到webapps/ROOT以使用根路径。 - 排除环境因素:确认防火墙/代理未拦截静态资源、文件权限正确、以及浏览器缓存未造成“假404/旧文件”。
三 配置与代码修复示例
- Spring MVC 放行静态资源(三选一或组合)
- 使用默认 Servlet(web.xml)
default *.html default *.css default *.js - 使用 mvc:resources(Spring 配置)
- 使用默认 Servlet 处理器
- 使用默认 Servlet(web.xml)
- 启用静态资源缓存(减少重复请求)
ExpiresFilter org.apache.catalina.filters.ExpiresFilter ExpiresByType text/css access plus 1 month ExpiresByType application/javascript access plus 1 month ExpiresByType image/jpeg access plus 1 month ExpiresFilter *.css *.js *.jpg *.png - 启用 GZIP 压缩(减小传输体积)
- 调整 Web 资源缓存上限(解决缓存空间不足警告)
- 在conf/context.xml的**
**中增加: - cacheMaxSize单位为KB,默认约10240 KB(10 MB);可按需增大(例如100000 KB ≈ 97.7 MB)。
- 在conf/context.xml的**
四 用日志定位性能瓶颈与优化闭环
- 增强访问日志字段:在server.xml的AccessLogValve中加入与缓存和耗时相关的字段,便于分析。
- 关键字段:%D(处理时间,微秒)、%{If-Modified-Since}i、%{Cache-Control}o,可直观看到响应时间、协商缓存与缓存策略效果。
- 识别与优化
- 高延迟资源:筛选**>500 ms**的请求,优先做压缩、合并、CDN 或调整静态资源服务器。
awk '$10 > 500000 {print $7, $10/1000000 "s"}' static_access_log.2025-09-15.txt | sort -k2 -nr - 高频资源:统计TOP10资源,考虑合并/缩小,降低请求次数。
awk '{print $7}' static_access_log.2025-09-15.txt | sort | uniq -c | sort -nr | head -10 - 缓存命中率:统计304或带Cache-Control: max-age的200响应占比,低则优化缓存策略。
awk 'BEGIN {total=0; cached=0} {total++; if($9 == 304 || ($9 == 200 && $8 == 0)) cached++} END {printf "缓存命中率: %.2f%%\n", (cached/total)*100}' static_access_log.2025-09-15.txt
- 高延迟资源:筛选**>500 ms**的请求,优先做压缩、合并、CDN 或调整静态资源服务器。
- 建议建立每日自动化分析与指标看板(总请求数、缓存命中率、TOP10资源、P95/P99 延迟),形成持续优化闭环。
以上就是关于“Tomcat日志中静态资源加载问题解析”的相关介绍,筋斗云是国内较早的云主机应用的服务商,拥有10余年行业经验,提供丰富的云服务器、租用服务器等相关产品服务。云服务器资源弹性伸缩,主机vCPU、内存性能强悍、超高I/O速度、故障秒级恢复;电子化备案,提交快速,专业团队7×24小时服务支持!
简单好用、高性价比云服务器租用链接:https://www.jindouyun.cn/product/cvm