nginx 每天各IP访问次数记录统计

这篇具有很好参考价值的文章主要介绍了nginx 每天各IP访问次数记录统计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

此文章主要介绍了,在nginx代理的情况下,统计当天IP的出现次数,并且生成表格的相关步骤

1.nginx 配置的修改

在/etc/nginx/nginx.conf

http {
	access_log xxxxxxx/access.log;
    error_log xxxxxxx/error.log;
}

2.定时执行的shell脚本

该脚本主要在每天的0点自动执行IPStatistics.py来记录昨天的IP访问次数,然后对昨天的日志进行备份,并且备份最长时间为maximum_retention_date天;

cut_nginx_log.sh脚本内容如下(分割线上方的变量我们可以根据需要自行配置):

# function:cut nginx log files
# The original log file path of nginx.conf configuration
log_files_from="xxxxxxx/nginxLog/"
# Path of newly saved log file
log_files_to="xxxxxxx/nginxLog/historyLog/"
# Path to IPStatistics.py script
python_file="xxxxxxxxx/nginxLog/script/IPStatistics.py"
# File name of the log
log_name="access"
# Maximum access.log date saving time, for example, 7 days
maximum_retention_date=`date -d "7 day ago" "+%Y-%m-%d"`


backup_end_time=`date -d yesterday +%Y-%m-%d`
file=${log_files_from}${log_name}.log

if [ -f "$file" ];then
# run python file to generate ip statistics csv, backup files
    python3 ${python_file}&&cp ${log_files_from}${log_name}.log ${log_files_to}${log_name}_${backup_end_time}.log
    :>${log_files_from}${log_name}.log
# delete n days ago nginx log files 
    rm -rf ${log_files_to}${log_name}_${maximum_retention_date}.log
# restart nginx
    systemctl restart nginx
fi

定时执行脚本需要进行如下操作:

# 1.赋予cut_nginx_log.sh执行权限
chmod +x xxxxxx/cut_nginx_log.sh

# 2.使用 crontab 添加定时任务
# (1) 打开定时任务
crontab -e
# (2) 添加定时任务,这里每天凌晨0点执行一次。
00 00 * * * /bin/sh xxxxxx/cut_nginx_log.sh
# (3) 查看定时任务
crontab -l 

3.统计当天内的IP访问次数的python 脚本

通过处理access.log的记录,生成IP统计csv文件

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import os.path
import re
import datetime

# nginx access.log文件的位置
log_Path = r"xxxxxxx/access.log"
# 分析access.log后得到的当天Ip访问次数结果,记录的文件路径
statistical_ip_result_file = r"xxxxxxx/statistical_ip_result.csv"
# 多长时间内的IP访问算作一次,单位是小时(例如从某IP当天第一次访问开始,在一个小时内,如果该IP再次访问,依然算作一次访问)
time_interval = 1
# csv文件中最长的IP访问次数保留时间
maximum_retention_time = 180

# 用于解析 access.log的正则表达式(解析为ip,time)
obj = re.compile(r'(?P<ip>.*?)- - \[(?P<time>.*?)\] ')
# 用于存放日志的分析结果(ip,(time1,time2,time3...))
ip_dict = {}
# 用于存放当天日志的ip访问次数
ip_count = {}



class Access(object):

    def __init__(self, log_path):
        self.IP_database = {}
        self.log_path = log_path

    def analyze_log(self):
        """记录IP地址和时间"""
        with open(self.log_path) as f:
            Log_data = f.readlines()
            try:
                for log_data in Log_data:
                    print(log_data)
                    result = obj.match(log_data)
                    ip = result.group("ip")
                    time = result.group("time")
                    time = time.replace(" +0000", "")
                    t = datetime.datetime.strptime(time, "%d/%b/%Y:%H:%M:%S")
                    if ip_dict.get(ip) is None:
                        ip_dict[ip] = []
                    ip_dict[ip].append(t)
            except Exception as e:
                print(e)

    def statistical_ip(self):
        """分析IP出现的次数(time_interval个小时内连续的访问算做一次),从日志文件开始进行记录"""
        for item in ip_dict.items():
            ip = item[0]
            time_list = item[1]
            start_time = time_list[0]
            ip_count[ip] = ip_count.get(ip, 0) + 1
            print(ip)
            print(ip_count[ip])
            for time in time_list:
                if (time - start_time).seconds > 60 * 60 * time_interval:
                    ip_count[ip] = ip_count.get(ip) + 1
                    start_time = time

    def delete_expired_data(self):
        """超过maximum_retention_time天的记录会进行删除"""
        if os.path.exists(statistical_ip_result_file) is False:
            print("退出delete")
            return
        new_data = []
        with open(statistical_ip_result_file, 'r+', encoding='utf-8') as f:
            current_time = datetime.datetime.now()
            new_data.append(f.readline())
            for line in f.readlines():
                record_time = datetime.datetime.strptime(line.split(',')[3].strip(), "%Y-%m-%d")
                if (current_time - record_time).days <= maximum_retention_time:
                    new_data.append(line)
        with open(statistical_ip_result_file, 'w', encoding='utf-8') as f:
            f.writelines(new_data)
            f.close()

    def write_file(self):
        """将昨天的IP出现次数写到txt文件中,然后再将txt转化为csv(表格)"""
        print("enter write_file")
        if len(ip_count) == 0:
            print("ip count=0 return")
            return
        file_exists = os.path.exists(statistical_ip_result_file)
        number = 1
        if file_exists is True:
            print("csv file is exists")
            with open(statistical_ip_result_file, 'r', encoding='utf-8') as f:
                number = int(f.readlines()[-1].split(',')[0]) + 1
        with open(statistical_ip_result_file, 'a+', encoding='utf-8') as f:
            if file_exists is False:
                print("file is not exiests,and write row")
                f.write("number,ip,count,data\n")
            yesterday = (datetime.date.today() + datetime.timedelta(days=-1)).strftime("%Y-%m-%d")
            for item in ip_count.items():
                ip = item[0]
                count = item[1]
                f.write(str(number) + "," + ip + "," + str(count) + "," + str(yesterday) + "\n")
                number = number + 1

    def ip(self):
        self.analyze_log()
        self.statistical_ip()
        self.delete_expired_data()
        self.write_file()


if __name__ == '__main__':
    IP = Access(log_Path)
    IP.ip()

最后生成的csv表格:
nginx统计ip访问次数,nginx,tcp/ip,python,linux,ubuntu文章来源地址https://www.toymoban.com/news/detail-522645.html

到了这里,关于nginx 每天各IP访问次数记录统计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Nginx禁止某个IP或者IP段访问的方法

    当Nginx代理了很多网站时,我们想让一部分人能访问,一部分人访问不了;那么我们可以来到每个网站的Nginx代理配置文件,针对某个网站单独设置:禁止或允许IP或IP段访问网站。 例:配置文件 如果想禁止某个准确的IP,deny 后直接加IP(deny xxx.xxx.xxx.xxx;) 即可。 上面的配置

    2024年02月11日
    浏览(50)
  • Nginx禁止ip访问 只能通过域名访问

    由于公司业务需求,Nginx服务器需要实现禁止ip直接访问 只能通过域名访问。具体实现如下: 1.找到你的配置文件ngin.conf    添加以下配置就行    //添加在http括号内  ,并且在第一个server前面一行就行。说明如图文所示:  添加完 保存 ;重新加载下nginx  登录测试就ok。有

    2024年02月13日
    浏览(48)
  • Nginx 禁止IP访问 只允许域名访问,以及Nginx防盗链设置

           我们在使用的时候会遇到很多的恶意IP攻击,这个时候就要用到Nginx 禁止IP访问了。今天要在Nginx上设置禁止通过IP访问服务器,只能通过域名访问,这样做是为了避免别人把未备案的域名解析到自己的服务器IP而导致服务器被断网。        下面我们就先看看Ngi

    2024年02月11日
    浏览(49)
  • Nginx配置只允许部分ip访问

           前几天解答一个需求,公司的服务器映射的外网ip被恶意的绑定了域名了,导致人家可以通过域名直接访问我们的测试服务,运营商觉得我们绑定未备案域名,联系我们让我们整改,简单的处理就是只允许通过外网ip访问,过滤掉域名访问方式。       简单处理如下:

    2024年02月11日
    浏览(52)
  • 通过Nginx配置访问IP白名单

          有时部署的应用需要只允许某些特定的IP能够访问,其他IP不允许访问,这时,就要设置访问白名单; 设置访问白名单有多种方式: 1.通过网络防火墙配置,例如阿里云/华为云管理平台 2.通过服务器防火墙配置,iptables 3.通过nginx配置访问分发限制 4.通过nginx的allow、den

    2024年02月16日
    浏览(48)
  • 【Go】go-es统计接口被刷数和ip访问来源

    以下是使用go的web框架gin作为后端,展示的统计页面 上面的数据来自elk日志统计。因为elk通过kibana进行展示,但是kibana有一定学习成本且不太能满足定制化的需求,所以考虑用编程的方式对数据进行处理 首先是接口统计,kibana的页面只会在 字段uri 的 top500 进行百分比统计,

    2024年02月08日
    浏览(38)
  • 如何给Nginx配置访问IP白名单

    一、Nginx配置访问IP白名单 有时部署的应用需要只允许某些特定的IP能够访问,其他IP不允许访问,这时,就要设置访问白名单; 设置访问白名单有多种方式: 1.通过网络防火墙配置,例如阿里云/华为云管理平台 2.通过服务器防火墙配置, iptables 3.通过nginx配置访问分发限制

    2024年02月07日
    浏览(43)
  • Nginx配置禁止特定IP和端口访问

    Nginx是一款常用的高性能Web服务器和反向代理服务器。它通过灵活的配置文件能够实现各种功能,包括限制特定IP地址和端口的访问。本文将详细介绍如何使用Nginx配置禁止特定IP和端口的访问。 首先,确保你已经正确安装和配置了Nginx。以下是一个简单的Nginx配置文件示例:

    2024年02月02日
    浏览(40)
  • 一, nginx增加端口,打开网页访问:ip

    1.针对yum list 中找不到的软件 采取rpm 安装 或者二进制安装 2.安装软件: 3.可以采取导入软件rpm包再去下载 4.安装    可以上传下载文件 5.安装解压软件 (解压 zsy20201119-13 )        6.切换到nginx配置目录下,编辑配置一个新文件名要以conf为结尾 7.关闭防火墙和高级安全 8.重

    2024年02月20日
    浏览(38)
  • nginx 前后的分离 (ip/域名)访问 负载均衡

    首先前端随便访问后端的一个端口,后端监听这个端口进行服务转发。 比如:8888 然后nginx在我们的服务器上部署两个后端 这里我用docker部署了两个 当然你也可以在两个服务器上面部署两个后端,只要在nginx配置代理的时候修改一下ip就可以了。 nginx配置

    2024年04月29日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包