要优化静态资源加载,首先需要精准采集静态资源的访问数据。通过修改Tomcat的server.xml或在web.xml中配置自定义访问日志,添加与静态资源相关的字段(如响应时间、缓存状态、资源尺寸),为后续分析提供基础。
server.xml的<Valve>标签中添加以下格式(适用于Access Log Valve):%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i" %D %{If-Modified-Since}i %{Cache-Control}o%D表示请求处理时间(微秒),%{If-Modified-Since}i记录客户端缓存请求头,%{Cache-Control}o记录服务端缓存响应头,这些字段能直接反映静态资源的缓存效率和响应速度。采集到日志后,需通过数据分析定位具体问题,常见的瓶颈类型及识别方法如下:
awk命令筛选响应时间超过阈值的资源(如>500ms),例如:awk '$10 > 500000 {print $7, $10/1000000 "s"}' static_access_log.2025-09-15.txt | sort -k2 -nrawk '{print $7}' static_access_log.2025-09-15.txt | sort | uniq -c | sort -nr | head -10Cache-Control: max-age响应头的比例),例如: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.txtExpires或Cache-Control头)。根据日志分析结果,采取以下优化措施:
web.xml中配置缓存控制策略,例如:<filter>
    <filter-name>ExpiresFilter</filter-name>
    <filter-class>org.apache.catalina.filters.ExpiresFilter</filter-class>
    <init-param>
        <param-name>ExpiresByType text/css</param-name>
        <param-value>access plus 1 month</param-value>
    </init-param>
    <init-param>
        <param-name>ExpiresByType application/javascript</param-name>
        <param-value>access plus 1 month</param-value>
    </init-param>
    <init-param>
        <param-name>ExpiresByType image/jpeg</param-name>
        <param-value>access plus 1 month</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>ExpiresFilter</filter-name>
    <url-pattern>*.css</url-pattern>
    <url-pattern>*.js</url-pattern>
    <url-pattern>*.jpg</url-pattern>
    <url-pattern>*.png</url-pattern>
</filter-mapping>
server.xml中启用GZIP压缩,例如:<Connector port="8080" protocol="HTTP/1.1"
           compression="on"
           compressableMimeType="text/html,text/xml,text/plain,text/css,application/javascript,application/json"
           compressionMinSize="1024" />
优化不是一次性工作,需持续监控与迭代:
analyze-static-logs.sh),每日自动分析静态资源日志,生成包含总请求数、缓存命中率、TOP10资源、平均响应时间等指标的报告,并发送给运维人员。例如:#!/bin/bash
LOG_DIR="/opt/tomcat/logs"
TODAY=$(date +%Y-%m-%d)
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
REPORT_FILE="$LOG_DIR/static_report_$YESTERDAY.txt"
echo "=== 静态资源访问统计报告 $YESTERDAY ===" > $REPORT_FILE
echo "总请求数: $(wc -l $LOG_DIR/static_access_log.$YESTERDAY.txt | awk '{print $1}')" >> $REPORT_FILE
echo -e "\n=== 访问量最高的资源 ===" >> $REPORT_FILE
awk '{print $7}' $LOG_DIR/static_access_log.$YESTERDAY.txt | sort | uniq -c | sort -nr | head -10 >> $REPORT_FILE
echo -e "\n=== 缓存命中率 ===" >> $REPORT_FILE
awk 'BEGIN {total=0; cached=0} {total++; if($9 == 304 || ($9 == 200 && $8 == 0)) cached++} END {printf "缓存命中率: %.2f%%\n", (cached/total)*100}' $LOG_DIR/static_access_log.$YESTERDAY.txt >> $REPORT_FILE