通过自定义日志格式与map指令标记请求类型,nginx可清晰分离静态资源与动态接口流量:匹配后缀标static、api路径标dynamic,其余默认dynamic,并在日志末尾输出类型及耗时字段,便于统计分析。

要让 Nginx 访问日志清晰反映静态资源与动态接口的流量分离情况,关键不是靠默认日志,而是通过 自定义日志格式 + 条件记录,把请求类型(静态 or 动态)作为字段显式打到日志里,便于后续分析、监控或告警。
用 map 指令标记请求类型
在 http 块中定义一个变量,根据 location 匹配规则自动标注当前请求是静态还是动态:
map $request_uri $req_type {
~*\.(css|js|png|jpg|gif|ico|woff2?|ttf|eot|svg|html?)$ "static";
~*^/(api|v1|admin|login|logout) "dynamic";
default "dynamic";
}说明:
- 匹配常见静态后缀(含大小写)→ 标为
static - 匹配典型 API 路径前缀(如
/api/、/v1/)→ 标为dynamic - 其余未明确匹配的,默认归为
dynamic(保障兜底,避免漏标)
定义带类型字段的自定义日志格式
在 http 块中新增日志格式,把 $req_type 加进去:
log_format separated '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$req_type $request_time $upstream_response_time';这样每条日志末尾就会多出两个关键字段:static/dynamic 和响应耗时,方便按类型聚合统计。
在 server 或 location 中启用该日志
确保你的 server 块中使用了这个格式,并指定日志路径:
access_log /var/log/nginx/separated-access.log separated;
注意:不要在多个嵌套 location 中重复配置 access_log,否则可能覆盖或重复写入;统一在 server 级配置即可,map 变量全局生效。
验证与日常使用建议
执行 nginx -t && nginx -s reload 后,访问几个静态文件和接口,检查日志是否输出类似:
192.168.1.100 - - [05/Sep/2026:12:35:22 +0000] "GET /css/app.css HTTP/1.1" 200 12456 "-" "Mozilla/5.0" static 0.002 - 192.168.1.100 - - [05/Sep/2026:12:35:23 +0000] "POST /api/user/login HTTP/1.1" 200 382 "https://example.com/" "Mozilla/5.0" dynamic 0.147 0.145
后续可直接用命令分析流量分布:
-
awk '{print $13}' /var/log/nginx/separated-access.log | sort | uniq -c→ 查看 static/dynamic 请求数量比 -
awk '$13=="static" {sum+=$14} END {print sum/NR}' /var/log/nginx/separated-access.log→ 静态平均响应时间











