Ошибки ограничения скорости, хотя IP включён в белый список

Мы используем Discourse в контейнере Docker. У нас настроены ограничения частоты запросов с белым списком IP-адресов. Однако при запросах с этого IP-адреса всё равно возникают ошибки ограничения частоты. Я почти уверен, что конфигурация nginx верна, вот как она выглядит:

geo $limit {
    default 1;
    1.1.1.1 0; # не настоящий IP
}

map $limit $limit_key {
    0 "";
    1 $binary_remote_addr;
}

limit_req_zone $limit_key zone=flood:10m rate=12r/s;
limit_req_zone $limit_key zone=bot:10m rate=200r/m;
limit_req_status 429;
limit_conn_zone $limit_key zone=connperip:10m;
limit_conn_status 429;

...
  location @discourse {
    limit_conn connperip 20;
    limit_req zone=flood burst=12 nodelay;
    limit_req zone=bot burst=100 nodelay;
   ...
  }

nginx настроен на запись ошибки в лог, если ограничение частоты достигнуто, и мы действительно видим некоторые сообщения в логе — но ни одного от whitelisted IP. Тем не менее, при запросах с whitelisted IP мы получаем множество ответов 429. URL-адреса запросов — это профили пользователей (например, /users/foo.json). Возможно, в самом Discourse есть какое-то ограничение частоты запросов?

Привет! Да, Nginx действительно управляет ограничением частоты запросов, как вы и сказали, но у Discourse есть и собственный способ управления этим на уровне приложения. Сэм написал на эту тему интересную статью:

Единственный вопрос, который у меня возникает: можно ли действительно настраивать ограничения частоты с исключениями (то есть добавлять IP-адреса в белый список через эти правила)? Я всё ещё ищу способ сделать это… :sweat_smile:

Кажется, я напал на след :

Возможно, DISCOURSE_MAX_REQS_PER_IP_EXCEPTIONS — это именно то, что нам нужно :grin:

Я тоже уперся в ограничение в 60 вызовов API в минуту, которое, кажется, невозможно обойти. Я установил все следующие параметры:

      - DISCOURSE_MAX_REQS_PER_IP_MODE=none
      - DISCOURSE_MAX_USER_API_REQS_PER_MINUTE=20000
      - DISCOURSE_MAX_USER_API_REQS_PER_DAY=30000
      - DISCOURSE_MAX_ADMIN_API_REQS_PER_MINUTE=20000
      - DISCOURSE_MAX_REQS_PER_IP_PER_MINUTE=20000
      - DISCOURSE_MAX_REQS_PER_IP_PER_10_SECONDS=2000
      - DISCOURSE_MAX_ASSET_REQS_PER_IP_PER_10_SECONDS=2000
      - DISCOURSE_SKIP_PER_IP_RATE_LIMIT_TRUST_LEVEL=0
      - DISCOURSE_MAX_ADMIN_API_REQS_PER_KEY_PER_MINUTE=20000
      - DISCOURSE_MESSAGE_BUS_MAX_BACKLOG_SIZE=1000
      - DISCOURSE_MAX_REQS_PER_IP_EXCEPTIONS=....

Я знаю, что проблема не в nginx, потому что получаю сообщение «Вы выполнили это действие слишком много раз», что означает, что обработку выполняет RateLimiter Discourse.

Вы нашли решение?