nginx 可准确记录浏览器与设备信息,前提是日志格式中正确配置双引号包裹的 "$http_user_agent",并在代理环境下确保透传、避免覆盖,推荐用 map 提取关键特征并用 shell 快速分析分布。

只要日志格式中正确包含 $http_user_agent,Nginx 就能记录浏览器与设备类型信息。关键不是“能不能记”,而是“记得准不准、用得安不安全、析得快不快”。
确保日志格式里真有 User-Agent 字段
默认的 combined 格式已包含该字段,但如果你用了自定义 log_format,必须显式写上:
- 写法必须是双引号包裹的
"$http_user_agent",不能漏引号、也不能写成$user_agent或$http_ua - 常见错误:复制别人配置时删掉了这一项,或大小写写错(必须是下划线,且全小写)
- 验证方法:查一条真实日志,看末尾引号内是否出现类似
Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X)...的字符串
代理环境下要保真,别让 UA 被覆盖
如果 Nginx 前面有 CDN、WAF 或负载均衡器,原始 UA 可能被中间层改写或丢弃:
- 确保上游代理透传
User-Agent头(多数 CDN 默认保留,但需确认) - 不要指望
$http_x_forwarded_for恢复 UA——它只传 IP,和 UA 无关 - 如需同时记录原始 UA 和中间代理标识,可组合使用:
"$http_user_agent" "$sent_http_user_agent"(后者需后端主动返回)
别直接记完整 UA,提取关键特征更实用
完整 UA 字符串太长,含版本号、设备序列号等敏感信息,全量落盘既占空间又有泄露风险:
- 用
map指令预处理,只留浏览器类型:
map $http_user_agent $ua_type {
~*chrome "Chrome";
~*firefox "Firefox";
~*safari "Safari";
~*msie|trident "IE";
default "Other";
}
再在log_format中写$ua_type - 移动端识别可统一用关键词:
Mobile、iPhone、Android,但要排除Windows、Mac OS X等桌面标识,避免 iPad Pro 误判为桌面 - 微信内置浏览器属于移动端,特征是同时含
MicroMessenger和Mobile,应保留而非过滤
快速分析浏览器和设备分布的命令技巧
不用上 ELK 或 GoAccess,几条 shell 命令就能跑出基础统计:
- 统计主流浏览器 PV 占比:
awk -F'"' '{print $6}' access.log | grep -i "chrome\|firefox\|safari\|edge\|opr" | sort | uniq -c | sort -rn - 算今日移动端占比:
total=$(grep "$(date +%d/%b/%Y)" access.log | wc -l); mobile=$(grep "$(date +%d/%b/%Y)" access.log | grep -i "mobile\|android\|iphone\|ipad" | wc -l); echo "移动端占比: $(awk "BEGIN{printf \"%.1f\", $mobile*100/$total}")%" - 识别爬虫:匹配
bot、crawler、spider、python-requests等关键词,再结合访问频次和路径规律交叉验证











