要让nginx访问日志真正用于分析外部流量引流渠道,核心是准确采集并结构化$http_referer:需自定义log_format显式包含$http_referer和$source_type,用map指令按域名归类来源,再结合协议、user-agent交叉验证真伪流量。

要让 Nginx 访问日志真正用于分析外部流量引流渠道,核心不是简单加上 $http_referer,而是确保它被准确采集、合理归类,并能区分真实来源与干扰项。
必须显式启用 Referer 字段记录
默认的 log_format combined 或精简配置通常不含 $http_referer,日志中会大量显示 "-",无法用于分析。需在 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; - 执行
nginx -s reload生效,避免重启中断服务
识别并分类常见 Referer 类型
$http_referer 是客户端发送的原始头,值不稳定,需结合业务逻辑分类才具分析价值:
- 完整 URL(如
https://baidu.com/s?wd=nginx)→ 可提取域名做来源归因 - "-"(空字段)→ 直接访问、书签、HTTPS→HTTP 跳转、部分 App WebView,建议统一标记为
direct - 搜索引擎跳转(如
https://www.google.com/url?)→ 参数常被截断,优先匹配主域名而非全路径 - 空字符串 "" → 极少见,多为异常请求或伪造行为,可单独过滤
用 map 指令结构化来源标签
相比 if,map 更高效安全,适合将原始 Referer 映射为可统计的渠道标识:
- 定义映射规则:
map $http_referer $source_type { default "other"; "~*baidu\.com" "baidu"; "~*google\.com" "google"; "~*zhihu\.com" "zhihu"; "~*^$" "direct"; } - 在
log_format中加入$source_type,日志中直接出现baidu、direct等标签 - 后续可用
awk快速统计各渠道请求数:awk '$10=="baidu"{c++} END{print c}' access.log
结合协议与 User-Agent 交叉验证
单看 Referer 容易误判,比如某“百度”来源全是移动端 User-Agent 且集中于凌晨,可能是爬虫而非自然流量:
- 提取 HTTPS 下的百度来源:
awk -F'"' '$12=="https" && $4 ~ /baidu/ {print $6}' access.log | sort | uniq -c - 统计某来源下 Chrome 和 Safari 占比,辅助判断是否为真实用户行为
- 对空 Referer 请求,检查其
$http_user_agent是否含curl、python-requests等特征,识别自动化调用











