nginx需借助日志分析工具统计uv和pv:pv为日志总行数,uv按ip或ip+ua组合去重;常用shell命令如wc -l统计pv,awk+sort -u统计uv;生产环境推荐goaccess、elk或prometheus方案。

Linux 下用 Nginx 的 access_log 统计 UV(独立访客)和 PV(页面访问量),核心是借助日志分析工具提取关键字段,再做去重或计数。Nginx 本身不直接提供实时 UV/PV 指标,需配合命令行工具(如 awk、sort、uniq)或日志分析系统实现。
确认 access_log 格式含必要字段
UV 通常按客户端 IP 或带 User-Agent 的 IP+UA 组合去重;PV 就是日志总行数。确保你的 log_format 至少包含:
-
$remote_addr:真实客户端 IP(注意反向代理时可能需用
$http_x_forwarded_for) - $time_local 或 $request_time:用于时间范围筛选(可选)
- $request 或 $uri:区分是否统计全站 PV 还是某路径 PV
示例常用格式(在 nginx.conf 中):
log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';用 shell 命令快速统计(适合单文件/小流量)
假设日志路径为 /var/log/nginx/access.log:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
-
PV 统计:直接统计总请求数
wc -l /var/log/nginx/access.log | awk '{print $1}' -
UV 统计(按 IP):提取 IP 并去重
awk '{print $1}' /var/log/nginx/access.log | sort -u | wc -l -
更准的 UV(IP + User-Agent 前 100 字符):
awk '{print $1, substr($13, 1, 100)}' /var/log/nginx/access.log | sort -u | wc -l
(注意:$13 是 $http_user_agent 的位置,实际需根据 log_format 字段顺序调整)
按时间范围或路径过滤统计
加条件提升实用性:
- 统计今天(假设日志含日期)的 PV:
awk -v d="$(date +%d/%b/%Y)" '$4 ~ d {count++} END {print count+0}' /var/log/nginx/access.log - 统计 /api/ 开头的 UV:
awk '$7 ~ /^"GET \/api\// {print $1}' /var/log/nginx/access.log | sort -u | wc -l - 排除爬虫(简单 UA 关键词过滤):
awk '!/Baiduspider|Googlebot|bingbot/ {print $1}' /var/log/nginx/access.log | sort -u | wc -l
生产环境建议用专业工具替代手写脚本
日志量大、需定时/可视化、要精准识别真实用户(如处理代理、CDN、移动端 UA 差异)时,推荐:
- GoAccess:实时终端可视化,支持 IP+UA 联合去重算 UV,一键生成 HTML 报告
- ELK(Elasticsearch + Logstash + Kibana):适合长期监控,可建仪表盘、设告警、支持复杂会话还原
- ngx_reqstat + Prometheus + Grafana:基于 Nginx 模块暴露指标,适合实时监控,但 UV 需额外逻辑(如用 lua 记录指纹)
纯日志分析场景下,GoAccess 上手最快,一条命令即可:
goaccess /var/log/nginx/access.log -c -a --log-format=COMBINED










