python - 有没有办法使用 Gunicorn 限制来自一个 IP 的并发请求数?
问题描述
基本上,我正在运行一个 Flask Web 服务器,它处理一堆数据并将其发送回用户。我们预计不会有 60 多个用户,但我注意到并发可能存在问题。现在,如果我打开一个选项卡并发送一个请求来处理一些数据,大约需要 30 秒,对于我们的应用程序来说没问题。
如果我打开另一个选项卡并同时发送相同的请求,独角兽将同时执行此操作,如果我们有两个单独的用户发出两个单独的请求,那就太好了。但是如果我让一个用户打开 4 或 8 个标签并发送相同的请求会发生什么?它为其他所有人备份服务器,有没有办法告诉 Gunicorn 一次只接受来自同一 IP 的 1 个请求?
解决方案
@jon 回答的一个更好的解决方案是限制您的 Web 服务器而不是应用程序服务器的访问。一个好的方法总是将应用程序的不同层执行的职责分开。理想情况下,应用程序服务器,flask 不应该有任何限制配置或与请求来自哪里有关。Web 服务器的职责,在这种情况下,nginx 是根据某些参数将请求路由到正确的客户端。限制应该在这一层完成。
现在,到了极限,你可以通过使用limit_req_zone
nginx 的 http 块配置中的指令来做到这一点
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
...
server {
...
location / {
limit_req zone=one burst=5;
proxy_pass ...
}
其中,binary_remote_addr
是客户端的 IP,平均每秒允许不超过 1 个请求,突发不超过 5 个请求。
专业提示:由于来自同一 IP 的后续请求将被保留在队列中,因此 nginx 很可能会超时。因此,建议有一个更好的 proxy_read_timeout 并且如果报告需要更长的时间,那么还要调整 gunicorn 的超时
推荐阅读
- javascript - 带有数组包含的 Firestore where 语句不起作用
- python - sklearn 错误 ValueError:输入包含 NaN、无穷大或对于 dtype('float32')来说太大的值
- macos - 将应用程序放在前面
- django - Django 中的临时用户
- asynchronous - Flutter 计算方法冻结 UI
- excel - 将 Word 文档中的超链接链接到 Excel 工作表中的相应文档
- mysql - MySQL 中 FROM 子句中的子查询失败
- javascript - 如何在隐藏字段中保存单选按钮单击的值?
- c++ - 如果 constexpr 给出错误,则在 false 中实例化模板函数
- javascript - 为什么我的变量没有在 php 中传递?