Как установить Discourse за Apache mod_proxy?

Всем привет.

Я пытаюсь настроить Discourse в контейнере Docker. На хост-системе (Debian) запущен сервер Apache httpd (я не могу использовать nginx, так как на Apache размещены другие сайты). Я хочу использовать mod_proxy для обратного проксирования на контейнер, который слушает порт 3000.

Текущая конфигурация Apache для этого виртуального хоста выглядит следующим образом:

<VirtualHost *:80>
  ServerAdmin webmaster@example.com
  ServerName example.com
  ServerAlias www.example.com

  ErrorLog ${APACHE_LOG_DIR}/vhosts/example.com/error.log
  CustomLog ${APACHE_LOG_DIR}/vhosts/example.com/access.log combined

  <IfModule proxy_module>
  ## <https://meta.discourse.org/t/running-other-websites-on-the-same-machine-as-discourse/17247>
    ProxyPreserveHost on
    RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
    RequestHeader set X-Real-IP expr=%{REMOTE_ADDR}
    ProxyPass / http://localhost:3000/
    ProxyPassReverse / http://localhost:3000/
  </IfModule>
</VirtualHost>

Я начал только с директив ProxyPass и ProxyPassReverse, а затем по одной добавлял ProxyPreserveHost и директивы RequestHeader. Как бы я ни настраивал прокси с помощью этих директив, определённые файлы ниже корня документа возвращают ошибку 404 при доступе (например, файлы в /images и /assets).

Обратите внимание на комментарий с URL-адресом Discourse Meta, который я конвертировал из синтаксиса nginx в Apache.

Буду очень признателен за любые идеи, как заставить это работать!

Посмотрите: Set up Discourse on a server with existing Apache sites

Итак, предлагаемое вами решение — запускать Discourse за HAProxy, который, в свою очередь, стоит за Apache?

Как я уже говорил, мне нужно использовать Apache на входе, поскольку на этой машине я размещаю другие виртуальные хосты.

Почему не nginx? Я не уверен насчёт производительности Discourse с Apache.

У меня сейчас нет ни времени, ни ресурсов для перехода на nginx.

Чтобы прояснить ситуацию: сам Discourse будет работать на nginx, но он должен быть проксирован через Apache.

Я немного подробнее изучил этот вопрос и думаю, что смогу решить свою задачу, так как, похоже, HAProxy может выбирать бэкенды на основе vhost.

Извините. Я выполнил неправильный поиск. Возможно, вы сможете попробовать снова и найти howto для Apache.

HAProxy делает именно то, что мне нужно, и выглядит как очень продуманный и полезный инструмент. Спасибо за подсказку.

Однако, похоже, проблема заключалась в редактировании шаблонов web*.yml для прослушивания портов, отличных от портов по умолчанию 80 и 443. Я восстановил конфигурации по умолчанию, а затем отредактировал containser/app.yml, добавив строки, подобные следующим, и ошибки 404 исчезли:

expose:
  - "127.0.0.1:1234:80"    # http

В последнее время я очень доволен Traefik, и он автоматически выдаёт сертификаты Let’s Encrypt (с HAProxy это тоже возможно, но потребует немного больше усилий).

Рад, что вы смогли разобраться!