nginx需通过分离静态资源日志、定义精简带标识格式、清洗归一化路径、轻量实时聚合四步实现精准访问统计:1. 用location剥离js/css等请求至独立日志;2. 自定义log_format保留核心字段;3. 清洗uri噪声并标准化路径;4. 用python/node.js每5秒聚合pv/uv/错误率等指标,前端sse秒级展示。

要让 Nginx 不仅能提供静态资源服务,还能准确统计谁在什么时候访问了哪些文件、是否成功、从哪来——关键不是“事后查日志”,而是从配置阶段就做好分离、打标和轻量归一化。
1. 单独记录静态资源请求日志
默认 access_log 会混入所有请求(包括动态接口),无法聚焦分析。必须用 location 规则把 js/css/img 等请求剥离出来,写入独立日志文件:
- 在 server 或 http 块中添加匹配规则,覆盖常见后缀:
location ~* \.(js|css|png|jpg|gif|woff2|ttf|svg|ico|eot|pdf)$ {<br> access_log /var/log/nginx/static_access.log static;<br> expires 1y;<br> add_header Cache-Control "public, immutable";<br> log_not_found off;<br>} - 务必排除干扰项:robots.txt、favicon.ico、健康检查路径应单独配置
access_log off,避免污染统计数据 - 确保该 location 在 proxy_pass 或通用 / 规则之前,防止被覆盖
2. 定义精简且带标识的日志格式
静态资源访问量大,日志字段越少越利于实时解析。自定义 log_format 只保留核心维度:
- 推荐字段组合:
$remote_addr $time_local "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $request_time $request_uri - 特别加入
$request_uri(原始路径)和$request_filename(实际文件路径),便于后续判断是否真实命中磁盘文件 - 避免记录 $http_x_forwarded_for 等非必需字段;若需区分 CDN 回源,可加 $upstream_addr
3. 日志清洗与路径归一化
原始 URI 常含版本号、时间戳、CDN 参数等噪声,直接统计会导致同一资源被拆成多个条目:
- 用 tail -f 实时读取 static_access.log,配合 sed 或 Python 脚本做标准化:
– 去掉 ? 后全部参数(或只保留 ?v=xxx 用于灰度识别)
– 将 /static/v2.1.0/app.js → /static/app.js
– 统一转小写,避免 /Img.jpg 和 /img.jpg 被重复计数 - 输出结构化行:clean_path + status + referer_domain + timestamp,为后续聚合打基础
4. 轻量实时聚合与前端展示
不需要重架构,中小规模可用内存聚合 + SSE 实现秒级更新:
- 用 Python(Flask + Redis Sorted Set)或 Node.js(Express + Map)每 5 秒滚动计算:
– 每个 clean_path 的 PV、UV(按 IP 或 UA Hash)、错误率(4xx/5xx 占比)
– 引用来源 Top5(从 referer_domain 提取主域名) - 前端通过 SSE 接口每秒拉取最新 TOP20 列表 + 近 10 分钟趋势折线图
– 可叠加小时段热力图(如晚高峰 JS 加载密集)
– 设置突增告警:某资源错误率同比前 5 分钟升超 300% 时触发通知











