要统计nginx全站静态与动态请求比例,需基于access.log中$request_uri后缀或$sent_http_content_type等字段,按预定义规则分类计数:静态如.js/.css/.png等,动态如application/json或proxy_pass响应,推荐配置增强日志格式并用awk快速统计。

要统计 Nginx 全站静态与动态请求比例,核心是通过分析 access.log 中的请求路径($request_uri)或响应内容类型($sent_http_content_type),结合常见静态资源后缀或动态接口特征进行分类。关键不在于日志格式本身有多复杂,而在于如何准确定义“静态”和“动态”,并用可靠方式批量提取、归类、计数。
明确静态与动态的判定标准
静态请求通常指直接返回文件内容、无需后端处理的请求,如 JS/CSS/图片/字体等;动态请求则由后端应用(PHP/Python/Java 等)实时生成响应。Nginx 本身不标记“静态/动态”,需根据以下任一维度合理推断:
-
按请求路径后缀判断:最常用且稳定。例如匹配
.js、.css、.png、.woff2、.html(注意:部分 HTML 可能是动态渲染,但多数场景下可归为静态) -
按后端代理行为判断:若使用
proxy_pass,可结合$upstream_addr或自定义变量(如在 location 块中 set $req_type "dynamic")打标 -
按响应 Content-Type 判断:如
text/css、image/jpeg多为静态;application/json、text/html(来自 proxy)多为动态 —— 但需注意 Nginx 自身返回的 404/50x 页面也会带text/html,可能干扰统计
配置日志格式(推荐加字段辅助判断)
在 nginx.conf 的 http 块中定义一个增强型日志格式,显式标记请求类型:
log_format stat '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$request_time $upstream_response_time '
'"$sent_http_content_type" '
'"$request_uri" '
'"$upstream_addr"';
然后在 server 或 location 中启用:access_log /var/log/nginx/access.log stat;
这样每行日志末尾会附带 Content-Type 和原始 URI,便于后续脚本精准分类。
用 shell + awk 快速统计比例(生产环境常用)
假设你已按上述配置记录日志,执行以下命令可快速得出近似比例(以最近 10 万行日志为例):
zcat /var/log/nginx/access.log.*.gz /var/log/nginx/access.log | \
tail -n 100000 | \
awk '{
uri = $12; ct = $11;
# 按后缀粗略分类(更准可扩展正则)
if (uri ~ /\.(js|css|png|jpg|jpeg|gif|webp|svg|woff|woff2|ttf|eot|ico|txt|xml|json|pdf|zip|mp4|avi)$/i) {
static++
} else if (ct ~ /^text\/html$/ || ct ~ /^application\/json$/ || ct ~ /^text\/plain$/) {
# 注意:这里仅作示意,实际建议优先以后缀为主,content-type 辅助校验
dynamic++
} else {
other++
}
}
END {
total = static + dynamic + other;
if (total > 0) {
printf "静态: %.1f%% (%d)\n动态: %.1f%% (%d)\n其他: %.1f%% (%d)\n",
static*100/total, static,
dynamic*100/total, dynamic,
other*100/total, other
}
}'
输出类似:
静态: 68.3% (68321)
动态: 29.1% (29105)
其他: 2.6% (2574)
进阶建议:用 logrotate + 定时任务每日汇总
为持续监控趋势,可将上述统计逻辑写成脚本(如 /usr/local/bin/nginx-log-ratio.sh),配合 logrotate 在每日日志轮转后自动运行,并把结果追加到 CSV 文件中:
- 添加 cron:每天 00:10 执行
10 0 * * * /usr/local/bin/nginx-log-ratio.sh >> /var/log/nginx/daily_ratio.csv - 脚本中用
date -d "yesterday" +%Y%m%d定位昨日压缩日志,避免重复统计 - 导出数据后可用 Excel 或 Grafana 可视化,观察静态资源占比是否异常下降(可能 CDN 配置错误或缓存失效)











