若是你的網站經過 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數量 便是統計後的訪問數量。