切分Nginx日誌,完成網站訪問量的自動統計

若是你的網站經過 Nginx 代理,那麼本文將爲你提供一個自動統計網站訪問量的方案。python

方案在實現步驟上,一個分爲三步:nginx

  1. 運行 shell 腳本,移動 Nginx 日誌到指定文件夾,並運行 Python 腳本;redis

  2. 執行 Python 腳本,統計有效的 IP 訪問量shell

  3. 設置 crontab 定時任務。django

1、shell 腳本

  經過 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 腳本

2、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()

3、crontab 設置

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

     天天的兩點定時執行 shell 腳本

腳本寫完了,在你的django 項目中,渲染前臺頁面時,只要從redis中獲取 Python腳本中對應的key,就能夠拿到網站訪問量的統計了。

固然,在 Python 腳本中,處理有效訪問量的手段並很差,由於在網站訪問量較高時,同一個用戶的訪問IP並不會是徹底連續的,所以這時的訪問量就偏高了。解決這個問題的辦法--經過統計學來精確訪問量。好比1個ip對應的請求爲5次,那麼全部的ip數量 / 去重後的ip數量(經過字典實現效率也更高),值與5的比例 * 去重後的ip數量 便是統計後的訪問數量。

相關文章
相關標籤/搜索