首页 > 解决方案 > 有没有办法使用 Gunicorn 限制来自一个 IP 的并发请求数?

问题描述

基本上,我正在运行一个 Flask Web 服务器,它处理一堆数据并将其发送回用户。我们预计不会有 60 多个用户,但我注意到并发可能存在问题。现在,如果我打开一个选项卡并发送一个请求来处理一些数据,大约需要 30 秒,对于我们的应用程序来说没问题。

如果我打开另一个选项卡并同时发送相同的请求,独角兽将同时执行此操作,如果我们有两个单独的用户发出两个单独的请求,那就太好了。但是如果我让一个用户打开 4 或 8 个标签并发送相同的请求会发生什么?它为其他所有人备份服务器,有没有办法告诉 Gunicorn 一次只接受来自同一 IP 的 1 个请求?

标签: pythonnginxflaskgunicorn

解决方案


@jon 回答的一个更好的解决方案是限制您的 Web 服务器而不是应用程序服务器的访问。一个好的方法总是将应用程序的不同层执行的职责分开。理想情况下,应用程序服务器,flask 不应该有任何限制配置或与请求来自哪里有关。Web 服务器的职责,在这种情况下,nginx 是根据某些参数将请求路由到正确的客户端。限制应该在这一层完成。

现在,到了极限,你可以通过使用limit_req_zonenginx 的 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 的超时

文件limit_req_zone

可以在此处找到 nginx 关于速率限制的博客文章


推荐阅读