插件窝 干货文章 NGINX怎么统计网站的PV、UV、独立IP

NGINX怎么统计网站的PV、UV、独立IP

统计 access NGINX 使用 866    来源:    2025-04-23

NGINX 网站访问统计方案

要统计网站的 PV(页面浏览量)、UV(独立访客)和独立IP,可以通过以下几种方法实现:

1. 使用 NGINX 日志分析工具

配置 NGINX 日志格式

首先确保 NGINX 配置了详细的访问日志:

http {
    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;
}

常用分析工具

  1. AWK 简单统计

    # 统计PV
    awk '{print $7}' access.log | wc -l
    
    # 统计独立IP
    awk '{print $1}' access.log | sort | uniq | wc -l
    
  2. GoAccess

    # 安装
    sudo apt-get install goaccess
    
    # 使用
    goaccess /var/log/nginx/access.log --log-format=COMBINED
    
  3. AWStats

    # 安装
    sudo apt-get install awstats
    
    # 配置后生成报告
    /usr/lib/cgi-bin/awstats.pl -config=yoursite -update
    

2. 使用 JavaScript 统计

在网页中嵌入统计代码,如:

  1. Google Analytics

    <!-- Global site tag (gtag.js) - Google Analytics -->
    <script async src="https://www.googletagmanager.com/gtag/js?id=UA-XXXXX-Y"></script>
    <script>
     window.dataLayer = window.dataLayer || [];
     function gtag(){dataLayer.push(arguments);}
     gtag('js', new Date());
     gtag('config', 'UA-XXXXX-Y');
    </script>
    
  2. 自建统计系统 使用 JavaScript 发送请求到后端 API 记录访问数据。

3. 实时统计方案

使用 NGINX 模块

  1. ngx_http_stub_status_module

    location /nginx_status {
       stub_status on;
       access_log off;
       allow 127.0.0.1;
       deny all;
    }
    

    访问 /nginx_status 可获取基本统计信息。

  2. ngx_http_status_module (商业版)

使用 ELK Stack (Elasticsearch + Logstash + Kibana)

  1. 配置 Logstash 收集 NGINX 日志
  2. 使用 Elasticsearch 存储
  3. 通过 Kibana 可视化分析

4. 数据库存储与分析

-- 示例表结构
CREATE TABLE access_logs (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    ip_address VARCHAR(45),
    user_agent TEXT,
    page_url VARCHAR(255),
    referrer VARCHAR(255),
    access_time DATETIME,
    user_id VARCHAR(255) NULL,
    session_id VARCHAR(255)
);

-- 统计查询
-- PV
SELECT COUNT(*) FROM access_logs WHERE DATE(access_time) = CURDATE();

-- UV (基于session)
SELECT COUNT(DISTINCT session_id) FROM access_logs WHERE DATE(access_time) = CURDATE();

-- 独立IP
SELECT COUNT(DISTINCT ip_address) FROM access_logs WHERE DATE(access_time) = CURDATE();

推荐方案

  1. 简单需求:GoAccess + crontab 定期生成报告
  2. 中等需求:ELK Stack 实现实时可视化
  3. 精确统计:JavaScript 埋点 + 后端数据库存储

对于大多数网站,结合 NGINX 日志分析和 JavaScript 统计能提供最全面的数据。