Como instalar o Discourse atrás do mod_proxy do Apache?

Olá a todos.

Estou tentando configurar o Discourse em um container Docker. O ambiente host (Debian) está executando um servidor Apache httpd (não posso executar o nginx porque estou hospedando outros sites no Apache). Quero usar o mod_proxy para fazer o reverse-proxy para o container, que está escutando na porta 3000.

A configuração atual do Apache para este vhost é a seguinte:

<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>

Comecei apenas com as diretivas ProxyPass e ProxyPassReverse e adicionei ProxyPreserveHost e as diretivas RequestHeader uma de cada vez. Não importa como configure o proxy usando essas diretivas, certos arquivos abaixo da raiz do documento retornam 404 ao serem acessados (por exemplo, itens em /images e /assets).

Observe o comentário contendo a URL do Discourse Meta que converti da sintaxe nginx para Apache.

Qualquer ideia sobre como fazer isso funcionar seria muito apreciada!

Dê uma olhada em Set up Discourse on a server with existing Apache sites

Então, a solução que você está propondo é rodar o Discourse atrás do HAProxy, que por sua vez está atrás do Apache?

Como eu disse, preciso usar o Apache na frente porque estou hospedando outros vhosts nesta máquina.

Por que não o nginx? Não tenho certeza sobre o desempenho do Discourse com o Apache.

No momento, não tenho tempo nem recursos para migrar para o nginx.

Para ficar claro, o próprio Discourse seria executado no nginx, mas precisaria ser proxyado através do Apache.

Fiz uma pesquisa um pouco mais aprofundada sobre isso e acredito que consigo realizar o que procuro, pois parece que o HAProxy pode escolher backends com base no vhost.

Desculpe. Fiz a busca errada. Talvez você possa tentar novamente e encontrar um howto para o Apache.

O HAProxy faz exatamente o que eu preciso e parece ser uma ferramenta muito polida e útil. Obrigado pela indicação.

No entanto, parece que a edição dos templates/web*.yml para ouvir em portas diferentes das padrão 80 e 443 foi onde surgiu o problema. Restabeleci as configurações padrão e depois editei o containser/app.yml para incluir linhas semelhantes às seguintes, e os erros 404 desapareceram:

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

Tenho estado muito satisfeito com o Traefik ultimamente, e ele emite certificados do Let’s Encrypt automaticamente (você também pode fazer isso com o HA-Proxy, mas exige um pouco mais de trabalho).

Fico feliz que você tenha resolvido!