要優化靜態資源加載,首先需要精準采集靜態資源的訪問數據。通過修改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 -nr
awk '{print $7}' static_access_log.2025-09-15.txt | sort | uniq -c | sort -nr | head -10
Cache-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.txt
Expires
或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>
該配置會讓瀏覽器緩存CSS、JS、圖片等靜態資源1個月,減少重復請求。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
結合crontab定時任務(每天凌晨2點執行),實現日志分析自動化。