Discourse 容器通过 nginx proxy_pass 转发,以及 Discourse 到宿主服务器的链接

嗨,Discourse 团队,

我在主机上运行着 nginx 服务器,并部署了一个标准的 Discourse Docker 容器。基本上,我由主机 nginx 服务少量特定的(HTTP)文件夹,其余所有请求则通过 proxy_pass 转发给 Discourse 容器。

就我目前对问题的理解,关键在于:我的主机 nginx 配置文件中定义了一个 /xyz 位置,由主机 nginx 处理;同时定义了一个 / 位置,将其通过 proxy_pass 转发至 Discourse 容器。

在我的使用场景中,我需要在 Discourse 帖子中发布指向 my.domaiin.com/xyz/some.html 的链接,即 Discourse 内部的链接应指向由主机 nginx 服务的页面。

这一功能在最近的 Discourse 更新之前一直正常工作。但现在,点击这些链接会跳转到 Discourse 的“无法找到……"页面。相比之下,复制链接目标并在新标签页中打开则能按预期工作。

我对底层协议有相当程度的了解,但协议栈越往上层,我的知识就越有限 :)。目前我的假设是:Discourse 的 nginx 保持了连接(可能是 keepalive 机制),导致主机 nginx 无法解析新的请求路径以选择正确的服务器。连接中的请求被原样传递给容器并保持存活状态,因此对 /xyz 路径的请求由 Discourse 处理,而它并不知晓该文件夹。

我该如何解决这一问题?如果不存在简单的解决方案,获得一些指引也会很有帮助,哪怕是对 HTTP 协议有较好理解的详细解释也能帮上忙。

谢谢!

附加说明:如果这确实是一个连接保持(keep-alive)问题,我完全可以接受禁用连接保持功能,并承担由此产生的一些成本开销。此部署并非旨在服务大量用户。

仔细想想,我可能还需要让主机上的 nginx 也监听一个命名管道,将该管道暴露到 Discourse 容器中,并在 Discourse 的 nginx 配置里添加自定义目录 /xyz,以便通过新创建的管道进行 proxy_pass 回传。(在解决细节问题之后,例如主机上的 nginx 需要先启动,否则 docker-compose 将无法正确暴露该命名管道)

尽管如此,仍非常欢迎提供任何帮助 :wink:

这是因为 Ember.JS 路由器知晓 Discourse 应用支持的所有路径,而 404 页面是在客户端渲染的,因为它知道服务器上没有该内容。

请将您的文件放在另一个子域上。

4 个赞