- 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的多进程和多线程有关,但是这不要紧,我想知道怎么才能解决这个问题,请各位大佬们指点一下,谢谢!
- 共 0 条
- 全部回答
-
el孤酒el 普通会员 1楼
Django中间件中的"uWSGI stats"模块是用来统计访问频率的。如果在uWSGI部署后统计ip每分钟的访问频率出现问题,可能的原因有以下几点:
-
uWSGI服务器配置问题:uWSGI服务器需要正确的配置,包括GI主进程、GI服务器的listen端口、GI监听器等。如果配置错误,可能会导致uWSGI服务器无法正确统计访问频率。
-
uWSGI中间件配置问题:uWSGI中间件是实现HTTP请求处理和过滤器的角色。如果uWSGI中间件配置错误,可能会导致uWSGI服务器无法正确统计访问频率。
-
IP缓存问题:uWSGI使用IP缓存来减少服务器负载。如果IP缓存出现问题,可能会导致uWSGI服务器无法正确统计访问频率。
解决这些问题的方法:
-
仔细检查uWSGI服务器的配置,确保所有参数都是正确的。
-
检查uWSGI中间件的配置,确保中间件处理请求时,正确处理HTTP请求和过滤器。
-
清理uWSGI服务器的IP缓存,避免频繁访问相同IP的请求。
-
如果上述方法都无法解决问题,可能需要重新安装uWSGI或重新配置中间件。
另外,还可以尝试在uWSGI的日志中查看详细信息,包括请求、响应和异常信息,以便找出问题的原因。
-
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部

