Debian Nginx 日志中引用来源分析指南
一 核心概念与日志格式
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(前提是代理正确设置了该头)。二 命令行快速分析
head -n1 /var/log/nginx/access.log
awk -F'"' '{print $4}' /var/log/nginx/access.log \
| sed 's/^ *$/-/g' \
| awk -F'/' '{print $1}' \
| sort | uniq -c | sort -nr | head
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 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’"’ 后的字段索引。三 可视化与长期分析
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/状态码的交叉分析等,适合非技术人员浏览与周报输出。四 进阶配置与实践建议
log_format referer '$remote_addr [$time_local] "$request" "$http_referer" "$http_user_agent"';
access_log /var/log/nginx/referer.log referer;
这样可单独滚动与保留来源日志,避免与分析日志相互干扰。# 上游示例
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" ...';