可通过 nginx 的 $sent_http_content_type 变量在 access log 中记录响应 mime 类型,并结合 awk、prometheus 或 elk 等工具统计流量占比、请求数及带宽消耗;需在 log_format 中定义该变量,其值为小写标准化类型(如 text/html),未设置时为空或“-”;awk 分析时需确认字段位置,建议清洗参数(如去除 charset)后按大类聚合(如 text、image);进阶可对接 nginxlog-exporter 暴露 prometheus 指标或用 logstash 入库做可视化与告警。

可以通过 Nginx 的 $sent_http_content_type 变量,在 access log 中记录每个响应的实际 MIME 类型,再结合日志分析工具(如 awk、goaccess、ELK 或 Prometheus+nginxlog-exporter)统计各类 MIME 类型的流量占比、请求数和带宽消耗。
配置 Nginx 日志格式,捕获 Content-Type
该变量在响应头已发送后才可读取,需确保它出现在 log_format 中,并且放在 log_format 定义里(不能只在 access_log 指令中临时引用):
log_format mime_stats '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent" ' '$sent_http_content_type'; # 关键:记录实际发出的 Content-Type <p>access_log /var/log/nginx/access.log mime_stats; </p>
注意:$sent_http_content_type 是小写形式(Nginx 自动标准化),值如 text/html、application/json、image/jpeg;若响应未设 Content-Type(极少见),该字段为空或显示为 -。
用 awk 快速统计各类型流量与请求数
假设日志已按上述格式生成,可运行以下命令快速汇总(按字节数降序):
awk '{ct[$12] += $10; req[$12]++} END {for (i in ct) print ct[i], req[i], i}' /var/log/nginx/access.log | sort -nr- 其中
$12对应$sent_http_content_type字段(按空格分隔,位置取决于你的 log_format);$10是$body_bytes_sent(实际传输的响应体字节数) - 建议先用
head -1 /var/log/nginx/access.log | awk '{print NF}'确认字段总数,再用awk '{print $0}' | cut -d' ' -f1-15查看前几行字段对齐情况,避免错位
识别常见 MIME 类型并归类分析
原始值较细碎(如 text/css; charset=utf-8、application/javascript; charset=utf-8),建议清洗后再聚合:
- 用 sed 或 awk 提取主类型:例如
sub(/;.*$/, "", $12)去掉参数部分,得到text/css→text/css - 按大类合并:将
text/html、text/plain、text/css、text/javascript统计为 “text”;image/png、image/jpeg、image/webp归为 “image” - 对 API 场景重点监控
application/json和application/xml的请求频次与平均响应体积,辅助判断接口负载
进阶:对接时序分析或告警
若需长期监控,推荐两种轻量路径:
- 使用 nginxlog-exporter,自定义解析规则提取
content_type和body_bytes_sent,暴露为 Prometheus 指标,例如:nginx_http_response_size_bytes_sum{content_type="application/json"} - 用 Logstash 或 Fluent Bit 做实时解析,把
$sent_http_content_type作为字段入库,配合 Kibana 制作“MIME 类型带宽热力图”或“Top 5 流量类型周环比”看板 - 设置简单告警:当某类(如
video/mp4)单日流量突增 300%,或application/octet-stream请求量异常升高(可能文件下载被滥用),触发通知











