若是你的网站经过 Nginx 代理,那么本文将为你提供一个自动统计网站访问量的方案。python
方案在实现步骤上,一个分为三步:nginx
1. 运行 shell 脚本,移动 Nginx 日志到指定文件夹,并运行 Python 脚本;redis
2. 执行 Python 脚本,统计有效的 IP 访问量shell
3. 设置 crontab 定时任务。django
经过 Nginx 配置文件,查看监听端口的日志文件,并移动到指定的路径。app
而后运行 Python 脚本,执行处理 Nginx 日志文件的 Python 脚本。网站
shell 脚本spa
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 脚本代理
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()
2 0 * * * /bin/sh /root/nginx_log.sh
日志
天天的两点定时执行 shell 脚本
脚本写完了,在你的django 项目中,渲染前台页面时,只要从redis中获取 Python脚本中对应的key,就能够拿到网站访问量的统计了。
固然,在 Python 脚本中,处理有效访问量的手段并很差,由于在网站访问量较高时,同一个用户的访问IP并不会是彻底连续的,所以这时的访问量就偏高了。解决这个问题的办法--经过统计学来精确访问量。好比1个ip对应的请求为5次,那么全部的ip数量 / 去重后的ip数量(经过字典实现效率也更高),值与5的比例 * 去重后的ip数量 便是统计后的访问数量。