账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    Django中间件在uWSGI部署后统计ip每分钟的访问频率出现问题
    40
    0

    正在学习中间件,于是写了个Demo,这个Demo在runserver下中间件的运行是正常的,但部署到uWSGI后就无法正常统计ip每分钟的访问频率了,百度和谷歌后也没能找到解决我困惑的答案。

    很简单的Demo:

    import time
    
    from django.core.cache import cache
    from django.http import HttpResponse
    from django.utils.deprecation import MiddlewareMixin
    
    
    class FindIPMiddleware(MiddlewareMixin, SaveIP):
        def process_request(self, request):
            ip = request.META.get('REMOTE_ADDR')
    
            black_list = cache.get('black', [])    # 如果cache中没有black,就返回一个空列表
            if ip in black_list:
                return HttpResponse('此ip因多次违规,已被禁止访问')
                
            # 将每次指定ip访问的时间记录在requests中
            requests = cache.get(ip, [])
            # 将每次访问的requests记录在txt中
            with open('test.txt', 'a') as f:
                f.write(str(requests)+'\n')
                
            # 如果requests存在且当前时间与最早访问的时间差大于60秒,就pop掉
            while requests and time.time() - requests[-1] > 60:
                requests.pop()
            # 将当前访问的时间插入为requests列表的第一个
            requests.insert(0, time.time())
            # 将ip-requests放到缓存中
            cache.set(ip, requests, timeout=60)
            
            # 如果requets长度大于30,封禁ip,大于等于10小于30警告
            if len(requests) > 30:
                black_list.append(ip)
                cache.set('black', black_list, timeout=60*60*24)
                return HttpResponse('ip被封禁')
            if len(requests) >= 10:
                return HttpResponse('请求频率过高,已被限制访问,如果继续恶意访问,将被添加进黑名单')
            return None

    开发环境与线上环境分别访问10次,生成两个text.txt文件
    runserver开发服务器下生成的test.txt文件:

    []
    [1574515435.201666]
    [1574515436.6527722, 1574515435.201666]
    [1574515437.4844859, 1574515436.6527722, 1574515435.201666]
    [1574515438.1917062, 1574515437.4844859, 1574515436.6527722, 1574515435.201666]
    [1574515438.856246, 1574515438.1917062, 1574515437.4844859, 1574515436.6527722, 1574515435.201666]
    [1574515439.553581, 1574515438.856246, 1574515438.1917062, 1574515437.4844859, 1574515436.6527722, 1574515435.201666]
    [1574515440.3515499, 1574515439.553581, 1574515438.856246, 1574515438.1917062, 1574515437.4844859, 1574515436.6527722, 1574515435.201666]
    [1574515441.155905, 1574515440.3515499, 1574515439.553581, 1574515438.856246, 1574515438.1917062, 1574515437.4844859, 1574515436.6527722, 1574515435.201666]
    [1574515441.787576, 1574515441.155905, 1574515440.3515499, 1574515439.553581, 1574515438.856246, 1574515438.1917062, 1574515437.4844859, 1574515436.6527722, 1574515435.201666]

    这是线上环境生成的test.txt文件:

    []
    []
    []
    []
    [1574516234.4257581]
    [1574516232.7529194]
    [1574516233.7064342]
    [1574516235.0543022]
    [1574516237.4400864, 1574516235.0543022]
    [1574516236.268929, 1574516232.7529194]

    这是uWSGI.ini配置文件:

    [uwsgi]
    http=0.0.0.0:8888
    
    chdir=/home/thepoy/django/javaScript
    
    wsgi-file=javaScript/wsgi.py
    
    processes=4
    threads=2
    enable-threads=True
    master=True
    pidfile=uwsgi.pid
    daemonize=uwsgi.log

    开发text.txt文件的记录是逐条增加的,
    但是线上text.txt文件却非如此,这样就无法正常统计ip每分钟的访问频率了。

    个人觉得出现这个问题应该是与uWSGI的多进程和多线程有关,但是这不要紧,我想知道怎么才能解决这个问题,请各位大佬们指点一下,谢谢!

    1
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 10 元积分
        全部回答
    • 0
    • el孤酒el 普通会员 1楼

      Django中间件中的"uWSGI stats"模块是用来统计访问频率的。如果在uWSGI部署后统计ip每分钟的访问频率出现问题,可能的原因有以下几点:

      1. uWSGI服务器配置问题:uWSGI服务器需要正确的配置,包括GI主进程、GI服务器的listen端口、GI监听器等。如果配置错误,可能会导致uWSGI服务器无法正确统计访问频率。

      2. uWSGI中间件配置问题:uWSGI中间件是实现HTTP请求处理和过滤器的角色。如果uWSGI中间件配置错误,可能会导致uWSGI服务器无法正确统计访问频率。

      3. IP缓存问题:uWSGI使用IP缓存来减少服务器负载。如果IP缓存出现问题,可能会导致uWSGI服务器无法正确统计访问频率。

      解决这些问题的方法:

      1. 仔细检查uWSGI服务器的配置,确保所有参数都是正确的。

      2. 检查uWSGI中间件的配置,确保中间件处理请求时,正确处理HTTP请求和过滤器。

      3. 清理uWSGI服务器的IP缓存,避免频繁访问相同IP的请求。

      4. 如果上述方法都无法解决问题,可能需要重新安装uWSGI或重新配置中间件。

      另外,还可以尝试在uWSGI的日志中查看详细信息,包括请求、响应和异常信息,以便找出问题的原因。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部