$ sent_http_content_type 变量用于记录响应头 Content-Type,需在 log_format 中显式添加并过滤空值;可用 awk 等命令统计各类静态资源请求占比,并按语义归类为 CSS、JS、图片、字体、JSON 等大类。

在 Nginx 日志中,$sent_http_content_type 变量记录了响应头中的 Content-Type 值,可用于识别返回资源的类型(如 text/css、image/png、application/javascript 等)。结合 access log 和日志分析工具,就能统计各类静态资源的请求命中比重。
确保日志格式包含 $sent_http_content_type
在 Nginx 配置的 log_format 中显式添加该变量,例如:
access_log /var/log/nginx/static_access.log stat;
注意:$sent_http_content_type 在响应未发出时为空(如 304、4xx/5xx 或连接中断),统计时需过滤掉空值或无效值。
用 awk + sort + uniq 快速统计占比
假设日志已按上述格式记录,可运行以下命令提取并计算各 Content-Type 的请求占比:
awk -F';' '{print $7}' /var/log/nginx/static_access.log | \grep -v '^$' | \
sed 's/;*$//; s/^ *//; s/ *$//' | \
sort | uniq -c | sort -nr | \
awk '{total += $1} END {while ((getline line 0) {split(line, a); print a[2], sprintf("%.2f%%", a[1]/total*100)}}' -
更实用的做法是分步处理:
- 先统计频次:
awk -F';' '$7 != "" {print $7}' access.log | sort | uniq -c | sort -nr > content_type_count.txt - 再算总数:
awk '{sum += $1} END {print sum}' content_type_count.txt - 手动或用脚本除算百分比(避免 shell 浮点限制)
识别常见静态资源类型并归类
原始 Content-Type 值较细碎(如 image/jpeg、image/webp),建议按语义归为大类便于分析:
-
CSS:匹配
text/css、text/x-scss(若后端透传) -
JS:匹配
application/javascript、text/javascript、application/ecmascript -
图片:匹配
^image/.*(含png、jpg、webp、svg+xml等) -
字体:匹配
font/.*、application/font-.*、application/x-font-.* -
JSON/API 静态响应:如
application/json(若用于配置文件、mock 数据等)
可用 awk 或 Python 脚本做归类后再统计,例如:
awk -F';' '$7 ~ /^image// {type="image"; next} $7 ~ /^text/css|application/css/ {type="css"; next} $7 ~ /javascript|ecmascript/ {type="js"; next} $7 ~ /^font// || $7 ~ /font-/ {type="font"; next} $7 != "" {print type}' access.log | sort | uniq -c注意事项与优化建议
该方法依赖响应头真实写出,需确认以下几点:
- Nginx 是否启用
add_header Content-Type ...覆盖了上游设置?如有,以最终发出值为准 - 是否启用了缓存(如 proxy_cache 或 fastcgi_cache)?304 响应不带
Content-Type,会被跳过,导致统计偏低——建议单独统计 304 请求并按资源路径反推类型 - 部分前端构建产物可能无明确 MIME 类型(如未配
types指令),Nginx 默认用text/plain,需检查并修正mime.types或自定义types块 - 若使用 CDN,原始 Nginx 日志可能不反映终端实际响应类型;此时应优先采用 CDN 提供的访问日志(通常也支持自定义字段)

















