Nginx需在log_format中显式添加双引号包裹的"$http_user_agent"(大小写敏感),结合map提取浏览器类型并统计分布,代理环境下须确保透传原始UA。

只要日志格式里正确写入 "$http_user_agent",Nginx 就能记录 User-Agent 字符串,进而识别浏览器类型。重点不在“记不记”,而在“记得准不准、用得安不安全、析得快不快”。
确认日志格式中已包含 User-Agent 字段
默认的 combined 日志格式已含该字段,但如果你用了自定义 log_format,必须显式添加:
- 写法必须是双引号包裹的
"$http_user_agent",不能漏引号,也不能写成$user_agent或$http_ua - 大小写敏感:必须是全小写加下划线,即
$http_user_agent - 验证是否生效:执行
tail -1 /var/log/nginx/access.log,看末尾引号内是否出现类似Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/128.0.0.0的字符串
代理环境下确保 UA 不被覆盖
如果 Nginx 前有 CDN、WAF 或负载均衡器,原始 User-Agent 很可能被中间层改写或丢弃:
- 检查上游代理是否透传
User-Agent头(多数 CDN 默认开启,但需人工确认) -
$http_x_forwarded_for只传客户端 IP,和 UA 无关,不能用来还原 UA - 如需同时记录原始 UA 和后端返回的 UA,可组合使用:
"$http_user_agent" "$sent_http_user_agent"(后者依赖后端主动设置响应头)
别直接记完整 UA,用 map 提取浏览器类型更实用
完整 UA 字符串冗长且含敏感信息(如设备型号、系统版本),全量落盘既占空间又存泄露风险:
- 用
map指令预处理,只提取主流浏览器类型:
~*chrome "Chrome";
~*firefox "Firefox";
~*safari "Safari";
~*msie|trident "IE";
~*edg "Edge";
~*opr "Opera";
default "Other";
}
- 再在
log_format中写入$ua_type,日志里就只留简洁标签,便于后续统计与归档 - 微信内置浏览器需单独识别:UA 同时含
MicroMessenger和Mobile,建议加入 map 规则避免误判为普通 Safari 或 Chrome
快速分析浏览器分布的命令技巧
不用上 ELK 或 GoAccess,几条 shell 命令就能跑出基础统计:
- 统计今日主流浏览器 PV 占比:
awk -F'"' '{print $6}' access.log | grep "$(date +%d/%b/%Y)" | grep -i "chrome\|firefox\|safari\|edge\|opr" | sort | uniq -c | sort -rn - 计算移动端占比(含 iPhone、Android、Mobile,排除 Windows、Mac OS X):
mobile=$(awk -F'"' '{print $6}' access.log | grep -i "mobile.*android\|iphone\|android" | wc -l); total=$(wc -l < access.log); echo "scale=2; $mobile/$total*100" | bc - 筛出疑似爬虫请求:
awk -F'"' '{print $6}' access.log | grep -i "bot\|spider\|crawler\|curl\|python-requests" | sort | uniq -c | sort -rn


















