Проблема с ошибкой 429 при использовании обратного прокси

Привет! Мой Discourse работает через обратный прокси (NPM).

Discourse не поддерживает поле x-forwarded, поэтому он постоянно показывает IP-адрес моего обратного прокси, когда мы, например, смотрим, с какого IP регистрируется пользователь и т. д.

Я перехватил запрос на стороне Discourse, и заголовок X-forwarder присутствует, но в access.log отображается IP-адрес обратного прокси.

Похоже, что необходимо изменить конфигурационный шаблон или файл конфигурации nginx для Discourse (не тот, что в NPM).

Не могли бы вы помочь мне с этим? Дело в том, что Discourse активирует шаблон web.ratelimit и выдает много ошибок 429.

:face_with_frowning_eyebrows:
Спасибо за вашу помощь.

См. Set up Discourse on a server with existing Apache sites в качестве примера того, как настроить внутренний nginx для вашего обратного прокси-сервера (conduits).

У меня тоже возникли сложности с этим.

У меня есть сервер Debian с Apache 2.4 и виртуальными хостами (vHosts), один из которых представляет собой контейнер Docker с Discourse. В Apache включен модуль mod_remoteip (модуля mod_extract_forwarded не было), но без каких-либо опций конфигурации. Конфигурация vHost довольно проста:

RequestHeader set X-Forwarded-Proto "https"
ProxyPreserveHost On
ProxyRequests Off
ProxyPass /.well-known !
ProxyPass / http://localhost:8083/
ProxyPassReverse / http://localhost:8083/

8083 — это открытый HTTP-порт контейнера Docker с Discourse.

Всё, в принципе, именно так.

Я вижу разных посетителей (по IP) в статистике, созданной на основе access.log Apache, и, что более важно, я также вижу разные последние IP-адреса для пользователей (это был простой способ проверки для меня). Похоже, что IP-адреса посетителей передаются через прокси Apache в Discourse. Это работало уже и до включения mod_remoteip, что я сделал всего несколько дней назад.

В любом случае, сейчас у меня снова возникли проблемы. Какой-то краулер или атака типа DoS выполняется на нашем сервере с IPv4-адреса из Кракова, Польша. Это вызывает множество ошибок 429. Для меня это нормально, но при этом все остальные посетители также получают эти ошибки.

Так ли это? То есть, когда предел подключений достигнут, ошибку получает каждый? Или только для конкретного IP?

Чего-то не хватает в моей конфигурации или я могу что-то улучшить/настроить? У нас были проблемы с Claudebot несколько недель назад и также несколько дней назад, возможно, нужно немного увеличить лимит.

Спасибо и приветствия,
Рой

Вы добавили настройки, чтобы убедиться, что удаленный IP-адрес передается в Discourse, или все пользователи отображаются как приходящие через прокси?

Ищите x-forwarded-for

Эм… :see_no_evil: Я забыл про часть Nginx (Discourse). :see_no_evil: Спасибо! :slight_smile:

Я только что отредактировал app.yml и перезапустил контейнер. Бот вернулся почти мгновенно после того, как контейнер снова запустился. Пока что я не вижу ошибок 429. Надеюсь, так будет и для «обычных» пользователей.

В этом и дело… Когда я проверяю админ-страницу пользователей, я всегда видел разные записи «последний IP». Так что каким-то образом Discourse видел реальные IP-адреса пользователей, даже без mod_remoteip и без изменения конфигурации Nginx. :man_shrugging:

В любом случае, мне интересно узнать, принесла ли конфигурация Nginx решение этой проблемы! :slight_smile: