需在Nginx日志中正确定义log_format并包含$http_user_agent,确保不截断、合理转义,再通过UA字符串匹配Mobile/Android/iPad/iPhone等关键词分析端占比。

在 Nginx 日志中记录 $http_user_agent 很简单,但要准确分析移动端与 PC 端占比,关键在于日志格式定义 + 后续可解析性,而非单纯记录。
1. 在 log_format 中添加 $http_user_agent
编辑 Nginx 配置(如 /etc/nginx/nginx.conf 或站点配置),在 http 块中定义或修改日志格式:
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';确保 access_log 指令使用该格式,例如:
access_log /var/log/nginx/access.log main;
2. 保证 User-Agent 字段不被截断或转义
$http_user_agent 默认会保留原始字符串,但需注意两点:
- Nginx 默认对日志中的双引号、换行等做转义(如
"→\"),不影响后续解析,但若用 shell 工具(如 awk)直接切分,建议用log_format的escape=json(Nginx 1.11.8+)提升结构化程度: - 部分移动端 UA 特别长(如微信内置浏览器嵌套 UA),确认
large_client_header_buffers足够(默认 4×8k 通常够用),避免 UA 被截断。
3. 分析时识别移动端的关键是 UA 字符串匹配
仅记录 UA 不代表能自动分类。推荐在日志分析阶段(如用 Python、Logstash 或 ClickHouse)按规则判断,常见规则包括:
- 含
Mobile(注意不是所有移动端都带,但 iOS/Android 主流浏览器基本都有) - 含
Android、iPad、iPhone、 - 含
WeChat、QQBrowser、UCBrowser等主流移动内核标识 - 排除明确 PC 标识:如
Windows NT、Mac OS X、X11; Linux(但需注意 iPadOS UA 可能含Mac OS X,需优先匹配iPad)
示例(Linux 命令快速估算):
# 统计含 Mobile 且不含 Desktop 的行数(粗略移动端) grep -E 'Mobile|Android|iPhone|iPod|iPad' /var/log/nginx/access.log | grep -v 'Desktop' | wc -l <h1>总请求数</h1><p>wc -l /var/log/nginx/access.log</p>
4. 更可靠的方案:用 map 指令预分类后写入日志
在 http 块中定义设备类型映射,让 Nginx 直接输出 device_type 字段,降低分析难度:
map $http_user_agent $device_type {
default 'pc';
~*[Mm]obile|[Aa]ndroid|[Ii]phone|[Ii]pad|[Ww]eixin|[Qq][Qq] 'mobile';
~*Windows\sNT|Mac\sOS\sX|X11;\sLinux 'pc';
}
<p>log_format analysis '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" $device_type';</p>这样每条日志末尾多一个 mobile 或 pc,后续用 awk '{print $13}' 即可精准统计占比。











