• 切分Nginx日志,完成网站访问量的自动统计


    如果你的网站通过 Nginx 代理,那么本文将为你提供一个自动统计网站访问量的方案。

    方案在实现步骤上,一个分为三步:

      1. 运行 shell 脚本,移动 Nginx 日志到指定文件夹,并运行 Python 脚本;

      2. 执行 Python 脚本,统计有效的 IP 访问量

      3. 设置 crontab 定时任务。

    一、shell 脚本

      通过 Nginx 配置文件,查看监听端口的日志文件,并移动到指定的路径。

      然后运行 Python 脚本,执行处理 Nginx 日志文件的 Python 脚本。

    • shell 脚本

        NGINX=/usr/local/nginx/  # 设置变量
        $NGINX/sbin/nginx -s stop  # 停止 Nginx
        mv $NGINX/logs/access.log ~/nginx_logs/  # 移动日志文件
        $NGINX/sbin/nginx  # 启动 Nginx,会自动生成日志文件
        workon django  # 进入 虚拟环境
        /root/project/path.py  # 执行 Python 脚本

    二、Python 脚本  

    • python 脚本

        import os
        import sys
        import django
        BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
        sys.path.append(BASE_DIR)
        
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "path.settings")  # 如果不用 django 提供的 cache,可以直接导入 Redis 包
        django.setup()
        
        
        class Pv:
            def __init__(self):
                self.file = open('/root/nginx_logs/access.log', 'r')  # 日志路径
        
            def foo(self):
                import re
                res = re.finditer('(\d+\.\d+\.\d+\.\d+).*?\n', self.file.read())  # 正则切分
                for i in res:
                    yield i.group(1)
        
            def result(self):
                lis = []
                for i in self.foo():
                    if len(lis):     # lis 为空,会发生越界错误
                        if i == lis[-1]:
                            continue
                    lis.append(i)
                from django.core.cache import cache
                pv = cache.get('nginx_pv') or 1    # 如果不存在则为1,否则为None时,不同类型相加会报错
                cache.set('nginx_pv', lis.__len__() + pv)
                return lis.__len__()
        
            def __del__(self):
                self.file.close()   # 关闭文件
        
            def __str__(self):
                return str(self.result())
        
        Pv().result()

    三、crontab 设置

        2 0 * * * /bin/sh /root/nginx_log.sh

         每天的两点定时执行 shell 脚本

    脚本写完了,在你的django 项目中,渲染前台页面时,只要从redis中获取 Python脚本中对应的key,就可以拿到网站访问量的统计了。

    当然,在 Python 脚本中,处理有效访问量的手段并不好,因为在网站访问量较高时,同一个用户的访问IP并不会是完全连续的,因此这时的访问量就偏高了。解决这个问题的办法--通过统计学来精确访问量。比如1个ip对应的请求为5次,那么所有的ip数量 / 去重后的ip数量(通过字典实现效率也更高),值与5的比例 * 去重后的ip数量 即是统计后的访问数量。

  • 相关阅读:
    Swagger接入
    Elasticsearch5.0.1索引压测结果
    Elasticsearch5.0 BreakChange摘要
    Elasticsearch1.7到2.3升级实践总结
    Java动态代理全面分析
    Spring之AntPathMatcher
    Lock的实现之ReentrantLock详解
    Elasticsearch之client源码简要分析
    elasticserach 索引删除 源码分析
    httpClient4.5.2工具类总结
  • 原文地址:https://www.cnblogs.com/wang-kai-1994/p/10803223.html
Copyright © 2020-2023  润新知