最准确、零侵入的浏览器内核流量监控方式是解析nginx日志中的$http_user_agent字段:webkit(safari/且不含chrome/或edg/)、blink(chrome/、edg/、opr/)、gecko(firefox/)、trident(ie,已淘汰)。

直接从 Nginx 访问日志中提取 User-Agent 字符串,按主流内核特征匹配并统计请求次数,是最准确、零侵入的浏览器内核流量占比监控方式。
核心原理:用 User-Agent 字符串识别内核而非品牌
浏览器品牌(如 Chrome、Edge)会变,但底层内核相对稳定。Nginx 日志中的 $http_user_agent 字段包含原始 UA 字符串,需依据内核标识符判断:
-
WebKit:Safari 默认内核,匹配
safari/且不含chrome/或edg/ -
Blink:Chrome、Edge(新版)、Opera 共享 Blink 内核,匹配
chrome/且排除edg/和opr/的为纯 Chrome;edg/单独归为 Edge(Blink);opr/归为 Opera(Blink) -
Gecko:Firefox 独占,匹配
firefox/ -
Trident:IE 专属(已淘汰),匹配
或 <code>(注意空格和分号) - WebKit (iOS):iPhone/iPad Safari 特征明显,可单列或合并进 WebKit
一行命令快速统计(适用于实时分析)
假设日志格式中 User-Agent 是第 16 列(请先用 head -1 /var/log/nginx/access.log | awk '{print NF}' 确认实际列数),运行:
awk -F'"' 'NF>=2 {ua = tolower($2)} \
ua ~ /edg\// {k["Blink-Edge"]++} \
ua ~ /opr\// {k["Blink-Opera"]++} \
ua ~ /chrome\// && !(ua ~ /edg\// || ua ~ /opr\//) {k["Blink-Chrome"]++} \
ua ~ /firefox\// {k["Gecko"]++} \
ua ~ /safari\// && !(ua ~ /chrome\// || ua ~ /edg\//) {k["WebKit"]++} \
ua ~ /msie |trident/ {k["Trident"]++} \
!(ua ~ /edg\// || ua ~ /opr\// || ua ~ /chrome\// || ua ~ /firefox\// || ua ~ /safari\// || ua ~ /msie|trident/) {k["Other"]++} \
END {for (i in k) print k[i], i}' /var/log/nginx/access.log | sort -nr
输出示例:
12480 Blink-Chrome5210 Blink-Edge
3960 Gecko
2870 WebKit
140 Trident
89 Other
生产环境建议:结构化 + 可持续
- 在 log_format 中显式添加解析后的内核字段(需配合 map 指令预处理 UA),使日志自带
$browser_kernel,便于后续 ELK/Loki 直接聚合 - 对压缩日志(.gz)支持:用
zcat /var/log/nginx/access.log*.gz | ...替代文件路径 - 按小时切片统计:用
awk '$4 ~ /\[.*:..:..:/ {print $0}' access.log提取时间戳,再结合内核字段做分组 - 避免只看总量:对比工作日 vs 周末、PC 端 vs 移动端 UA 分布,能发现真实用户行为迁移趋势
注意边界情况
部分请求 UA 为空(直接访问、爬虫、健康检查),应单独归为 Empty-UA;微信内置浏览器(micromessenger/)属于 WebKit 内核,但业务上常需单列,可在匹配逻辑中优先判断。











