要使用 Nginx 或 Apache 日志查看网站访问者信息,首先需要了解日志格式、配置方式以及常用分析工具。以下是完整指南:
一、确认日志格式(关键步骤)
1. Nginx 默认日志格式
Nginx 的 access_log 默认使用 combined 格式(类似 Apache),包含以下字段:
# nginx.conf 中示例
log_format custom '$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 custom;
常见变量说明:
$remote_addr:客户端 IP(可能为X_X后真实 IP,需配合X-Forwarded-For)$remote_user:认证用户(如未启用 auth,通常为-)$time_local:访问时间(本地时区)$request:请求方法 + URI(如GET /index.html HTTP/1.1)$status:HTTP 状态码(200, 404, 500 等)$http_user_agent:浏览器/客户端标识(可识别设备类型)$http_referer:来源页面(判断引流渠道)$http_x_forwarded_for:若经过 CDN/反向X_X,记录真实用户 IP 链
✅ 建议:生产环境务必自定义日志格式,显式记录
X-Forwarded-For和User-Agent,否则无法获取真实访客信息。
2. Apache 默认日志格式
Apache 通常使用 CombinedLogFormat:
LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined
CustomLog /var/log/apache2/access.log combined
字段含义与 Nginx 类似:
%h:远程主机 IP%l:远程登录名(通常为-)%u:远程用户(auth 后用户名)%t:时间戳%r:请求行%>s:响应状态码%b:发送字节数(不包括响应头)%{Referer}i:Referer%{User-Agent}i:User-Agent
🔧 若使用
mod_proxy或云服务商(如阿里云、AWS),同样需确保RemoteIPModule正确设置以提取真实 IP:LoadModule remoteip_module modules/mod_remoteip.so RemoteIPHeader X-Forwarded-For RemoteIPInternalProxy 10.0.0.0/8
二、实时查看日志(命令行工具)
1. 查看最新访问(动态监控)
# Nginx
tail -f /var/log/nginx/access.log | grep "200" # 只看成功请求
# Apache
tail -f /var/log/apache2/access.log
2. 统计高频 IP(防刷/分析热门访客)
# 按 IP 排序并计数(前10名)
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -n 10
# 含状态码过滤(仅统计 200 请求)
grep " 200 " /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -n 10
3. 分析 User-Agent(识别爬虫/移动端)
# 提取并统计浏览器类型
awk -F'"' '{print $6}' /var/log/nginx/access.log |
sed 's/(.*)/1/' |
tr '[:upper:]' '[:lower:]' |
sort | uniq -c | sort -rn | head -n 20
💡 提示:可用正则进一步分类(如检测
bot,mobile,iPhone等关键词)。
三、进阶分析:使用专业工具
| 工具 | 用途 | 优势 |
|---|---|---|
| GoAccess | 实时终端可视化分析 | 支持 Nginx/Apache,生成 HTML 报告,显示地理分布、OS、浏览器等 |
| AWStats | 定期生成详细统计报表 | 图形化图表,历史趋势对比,SEO/反作弊友好 |
| Matomo (原 Piwik) | 自建 Google Analytics 替代品 | 隐私合规(GDPR),支持事件追踪、转化漏斗 |
| ELK Stack | 大规模日志聚合分析 | 实时搜索、告警、仪表盘(适合企业级) |
GoAccess 快速示例:
# 安装
sudo apt install goaccess
# 直接分析日志文件(交互式终端视图)
goaccess /var/log/nginx/access.log --log-format=COMBINED
# 生成 HTML 报告
goaccess /var/log/nginx/access.log --log-format=COMBINED --output=report.html
📌 注意:需确保日志格式与
--log-format匹配(Nginx 用COMBINED,自定义格式需用CUSTOM并指定格式字符串)。
四、注意事项 & 最佳实践
-
隐私合规
- 避免记录敏感数据(如 URL 中的密码参数、Cookie 内容)。
- 根据 GDPR/CCPA 要求,对 IP 做匿名化处理(如截断最后一段:
192.168.1.→192.168.1.*)。
-
性能优化
- 大流量站点建议使用
syslog-ng或rsyslog异步写入日志,避免阻塞服务。 - 定期轮转日志(
logrotate),防止磁盘占满。
- 大流量站点建议使用
-
安全加固
- 限制日志目录权限:
chmod 640 /var/log/nginx/*.log,所有者为root:adm。 - 禁用自动暴露日志路径(如
/server-status、/debug)。
- 限制日志目录权限:
-
真实 IP 获取
- 若前端有负载均衡器(SLB)、CDN(Cloudflare、阿里云 CDN),务必在日志中解析
X-Forwarded-For第一跳 IP。 - Nginx 示例:
set_real_ip_from 10.0.0.0/8; real_ip_header X-Forwarded-For; real_ip_recursive on;
- 若前端有负载均衡器(SLB)、CDN(Cloudflare、阿里云 CDN),务必在日志中解析
五、简单脚本示例:提取今日活跃访客数
#!/bin/bash
LOG="/var/log/nginx/access.log"
TODAY=$(date +%d/%b/%Y:%H)
echo "=== 今日活跃访客统计 ==="
echo "总请求数:$(wc -l < $LOG)"
echo "唯一 IP 数:$(awk '{print $1}' $LOG | sort -u | wc -l)"
echo "Top 5 IP:"
awk '{print $1}' $LOG | sort | uniq -c | sort -rn | head -5
echo "移动端占比:"
grep -iE "(mobile|android|iphone|ipad)" $LOG | wc -l | awk '{printf "%.1f%%n", $1*100/NR}'
⚠️ 将
$LOG替换为你的实际日志路径;NR 需先计算总行数。
如需进一步分析(如地域定位、会话时长估算、异常行为检测),可结合 GeoIP 数据库(MaxMind)+ 自定义脚本实现。需要具体方案可提供场景(如电商、博客、API 服务),我可给出针对性建议。
PHPWP博客