如何在 Apache mod_proxy 后安装 Discourse?

大家好。

我试图在 Docker 容器中设置 Discourse。主机环境(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 中的内容)。

请注意包含 Discourse Meta URL 的注释,我已将其从 nginx 语法转换为 Apache 语法。

任何关于如何解决此问题的建议都将不胜感激!

请查看 Set up Discourse on a server with existing Apache sites

所以您提出的解决方案是在 HAProxy 后面运行 Discourse,而 HAProxy 又在 Apache 后面?

正如我所说,我必须在最前端使用 Apache,因为我在该机器上托管其他虚拟主机。

为什么不用 nginx?我不确定 Discourse 在 Apache 上的性能表现。

我目前没有时间或资源切换到 nginx。

需要明确的是,Discourse 本身将运行在 nginx 上,但它必须通过 Apache 进行反向代理。

我进一步研究了一下,认为可以实现我的目标,因为 HAProxy 似乎可以根据虚拟主机(vhost)来选择后端。

抱歉,我搜索错了。或许您可以再试一次,查找一个关于 Apache 的 #howto。

HAProxy 正是我需要的,而且看起来是一个非常成熟且实用的工具。感谢您的指点。

不过,问题似乎出在编辑 templates/web*.yml 以监听默认端口 80 和 443 以外的端口上。我恢复了默认配置,然后编辑了 containser/app.yml,添加了类似以下的行,404 错误便消失了:

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

我最近对 Traefik 非常满意,它能自动配置 Let’s Encrypt 证书(HA-Proxy 也能实现,只是稍微麻烦一些。)

很高兴你解决了问题!