Запуск 2 хостов за haproxy завершается случайными 404 ошибками

Сегодня я попытался добавить второй сервер для размещения одного из наших экземпляров Discourse. Контейнер настроен на использование внешних серверов Redis, PostgreSQL и хранилища — только веб-приложение. До сих пор мы запускали односерверные сайты за HAProxy без проблем. При работе с двумя серверами за HAProxy мы наблюдаем множество ошибок 404 от nginx для JS-файлов. Удаление любого из серверов из HAProxy устраняет проблему. URL-адреса файлов, которые вызывают ошибку 404, кажутся идентичными, поэтому я не могу понять, почему они не обслуживаются ни одним из серверов.

Переопределений в настройках разработчика нет. Мы используем стабильную версию 2.4.3.

Если вы запускаете более одного веб-контейнера, вам понадобится механизм, обеспечивающий доступ обоих к статическим файлам.

Самый простой способ — Использование объектного хранилища для загрузок (S3 Clones)

@Falco Привет, спасибо за ответ. Два сервера используют общее хранилище через NFS. В конфигурации моего контейнера указано следующее:

volumes:
  - volume:
      host: {{ discourse_nas_path }}/data
      guest: /shared
  - volume:
      host: {{ discourse_nas_path }}/logs
      guest: /var/log

Однако каждый контейнер хранит собственные копии ассетов, сгенерированных на этапе assets:precompile. Обязательно ли разделять предварительно скомпилированные ассеты?

Что ещё вы предприняли для тестирования, кроме добавления и удаления бэкендов в Haproxy?

Использует ли ваша конфигурация Haproxy случайный выбор бэкенда или привязку к сессии? Записывается ли ошибка 404 в лог Haproxy? Записывается ли она в лог nginx? На каком бэкенде (первом или втором) возникает ошибка? Требуется ли для вашего сайта вход в систему? Удаётся ли воспроизвести ошибки при прямом подключении к nginx из-за прокси-сервера? Существуют ли запрашиваемые файлы на диске? Ошибки возникают для всех JS-файлов или только для некоторых?

Благодаря подсказке от @Falco я добавил следующее в конфигурацию своего контейнера, и теперь всё работает как ожидалось:

  - volume:
      host: {{ discourse_nas_path }}/assets
      guest: /var/www/discourse/public/assets