Лучшим решением для ответа @jon было бы ограничение доступа вашего веб-сервера вместо сервера приложений. Хорошим способом всегда было бы разделение обязанностей, выполняемых различными уровнями вашего приложения. В идеале сервер приложений flask не должен иметь никакой конфигурации для ограничения или чего-либо общего с тем, откуда поступают запросы. Ответственность веб-сервера, в данном случае nginx, заключается в том, чтобы направить запрос на основе определенных параметров нужному клиенту. Ограничение должно быть сделано на этом уровне.
Теперь, приближаясь к ограничению, вы можете сделать это, используя директиву limit_req_zone
в конфигурации блока http nginx
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
...
server {
...
location / {
limit_req zone=one burst=5;
proxy_pass ...
}
* 1006. * где
binary_remote_addr
- это IP-адрес клиента, и в среднем допускается не более 1 запроса в секунду, при этом пакеты не превышают 5 запросов.
Pro-tip: С последующие запросы с того же IP-адреса будут храниться в очереди, есть большая вероятность истечения времени ожидания nginx. Следовательно, было бы желательно иметь лучший proxy_read_timeout и, если отчеты занимают больше времени, то также корректировать время ожидания gunicorn
Документация limit_req_zone
запись в блоге nginx по ограничению скорости можно найти здесь