温馨提示×

Debian Nginx日志中的引用来源如何分析

小樊
44
2025-12-20 10:17:24
栏目: 智能运维

Debian Nginx 日志中引用来源分析指南

一 核心概念与日志格式

  • 引用来源由请求头中的 Referer 体现,Nginx 将其写入访问日志的 $http_referer 字段。常见格式(如 mainCOMBINED)均包含该字段,用于标识用户是从哪个页面跳转而来,便于分析流量来源、外链引流与防盗链。示例格式:
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    
    当存在反向代理/负载均衡时,客户端真实 IP 可能记录在 $http_x_forwarded_for,而 $remote_addr 为代理 IP,分析来源时应优先使用 XFF(前提是代理正确设置了该头)。

二 命令行快速分析

  • 确认日志格式是否包含 “$http_referer”,并查看样例行:
    head -n1 /var/log/nginx/access.log
    
  • 统计各来源域名的访问次数(含空 Referer,即直接访问):
    awk -F'"' '{print $4}' /var/log/nginx/access.log \
      | sed 's/^ *$/-/g' \
      | awk -F'/' '{print $1}' \
      | sort | uniq -c | sort -nr | head
    
  • 只看外链来源(排除站内与空 Referer):
    awk -F'"' '$4 !~ /^-$/ && $4 !~ /https?:\/\/(www\.)?yourdomain\.com/ {print $4}' \
      /var/log/nginx/access.log \
      | sed 's/^ *$/-/g' \
      | awk -F'/' '{print $1}' \
      | sort | uniq -c | sort -nr | head
    
  • 按来源域名聚合,查看其热门落地页与状态码分布:
    # 来源域名 -> 落地页 TopN
    awk -F'"' '{ref=$4; gsub(/^ *$/,"-",ref); u=$7;
               if(ref!="-" && ref !~ /https?:\/\/(www\.)?yourdomain\.com/)
                 print ref, u}' /var/log/nginx/access.log \
      | sort | uniq -c | sort -nr \
      | head | column -t
    
    # 来源域名 -> 状态码分布
    awk -F'"' '{ref=$4; gsub(/^ *$/,"-",ref); s=$9;
               if(ref!="-" && ref !~ /https?:\/\/(www\.)?yourdomain\.com/)
                 print ref, s}' /var/log/nginx/access.log \
      | sort | uniq -c | sort -nr
    
  • 定位异常来源(高频 404/5xx):
    # 来源域名 -> 404 TopN
    awk -F'"' '$9==404 {print $4}' /var/log/nginx/access.log \
      | sed 's/^ *$/-/g' \
      | awk -F'/' '{print $1}' \
      | sort | uniq -c | sort -nr | head
    
    # 来源域名 -> 5xx TopN
    awk -F'"' '$9>=500 {print $4}' /var/log/nginx/access.log \
      | sed 's/^ *$/-/g' \
      | awk -F'/' '{print $1}' \
      | sort | uniq -c | sort -nr | head
    
  • 实时滚动查看某来源的请求:
    tail -f /var/log/nginx/access.log \
      | awk -F'"' '$4 ~ /https?:\/\/example\.com/ {print $0}'
    
    以上命令基于 $http_referer 的位置提取与聚合,适用于常见的 combined/main 格式;若你的日志字段顺序不同,请先调整 -F’"’ 后的字段索引。

三 可视化与长期分析

  • 使用 GoAccess 生成来源分析报表(支持按 Referer 聚合与可视化):
    sudo apt-get update && sudo apt-get install -y goaccess
    goaccess /var/log/nginx/access.log --log-format=COMBINED -o /var/www/html/referer.html
    
    在报告中可查看 Referring Sites、热门来源页面、来源与 URI/状态码的交叉分析等,适合非技术人员浏览与周报输出。
  • 若需长期留存与检索,可将日志接入 ELK/EFK 或 Loki 体系,按 referer 建立可视化面板与告警规则,实现来源趋势、异常来源与黑链监控。

四 进阶配置与实践建议

  • 为来源分析专设日志格式(便于单独采集与归档):
    log_format  referer  '$remote_addr [$time_local] "$request" "$http_referer" "$http_user_agent"';
    access_log  /var/log/nginx/referer.log  referer;
    
    这样可单独滚动与保留来源日志,避免与分析日志相互干扰。
  • 在反向代理/负载均衡环境下,确保上游正确设置 X-Forwarded-For,并在日志中记录 $http_x_forwarded_for,以便准确归因来源 IP 与来源域名:
    # 上游示例
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    
    # Nginx 日志
    log_format  main  '$http_x_forwarded_for $remote_addr ... "$http_referer" ...';
    
  • 结合来源做访问控制与防盗链(示例思路):对异常来源(高频 404/5xx、已知恶意域)返回 403 或限制速率;对静态资源设置 valid_referers 防盗链策略,减少无效外链消耗。

0