Обратный прокси X-Forwarded-For

Недавно я перенёс свой форум на гораздо более производительный хостинг и работаю над обеспечением высокой доступности.

В обратном прокси-сервере я добавил заголовки Forward Proto и For, но конфигурация nginx в Discourse учитывала только Proto.

Мне пришлось добавить в секцию server следующее:

set_real_ip_from loadbalancerip;
real_ip_header X-Forwarded-For;

Существует ли переменная окружения Discourse для добавления этих настроек?
Или, возможно, есть аргумент для добавления в app.yml?

Я думаю, это то, что вы ищете:

Нет, это руководство объясняет, как настроить сокет nginx, общий между контейнером и хостом.

Я пытаюсь найти декларативный способ включить:

set_real_ip_from loadbalancerip;
real_ip_header X-Forwarded-For;

в конфигурацию nginx в контейнерах после пересборки.

Вы пытаетесь добавить это во внутренний nginx контейнера? Я полагаю, что это излишне, так как оно добавляется по умолчанию:

Эта строка необходима для того, чтобы всё работало.
Без неё все запросы всё равно будут иметь IP балансировщика нагрузки.
Я знаю это, потому что мой Discourse был недоступен из-за ошибок 429.

На всякий случай, если это неясно, вот моя инфраструктура:
пользователь > haproxy > discourse

В Discourse, конечно, встроен nginx-прокси.

Я добавил заголовки перенаправления в haproxy, но внутренний nginx в Discourse не учитывал заголовок X-Forwarded-For. Мне пришлось добавить эти две строки в свой первый пост и перезапустить контейнер, чтобы всё заработало.

Вы используете сборку из двух контейнеров?

На мой взгляд, встроенной переменной окружения для IP-адресов пользовательского балансировщика нагрузки нет, так как nginx не читает эти переменные для блока server по умолчанию.

Кроме того, если вы вручную отредактировали конфигурацию nginx внутри работающего контейнера, она будет удалена при следующей пересборке.

По-моему, чтобы сделать изменения постоянными и сохраняющимися после пересборок, нужно использовать команду replace в вашем файле app.yml (или web_only.yml, если используется два контейнера). Прокрутите файл .yml в самый низ до раздела run: и добавьте следующий блок. Это подскажет сборщику Discourse автоматически внедрить ваши настройки реального IP после открытия блока server {:

run:
  - replace:
      filename: /etc/nginx/conf.d/discourse.conf
      from: /server.+{/
      to: |
        server {
          set_real_ip_from 192.168.1.100; ## Замените на ваш реальный IP/подсеть балансировщика нагрузки
          real_ip_header X-Forwarded-For;
          real_ip_recursive on;