在同一台服务器上托管多个 Rails 应用程序
Posted
技术标签:
【中文标题】在同一台服务器上托管多个 Rails 应用程序【英文标题】:Host multiple Rails apps on the same server 【发布时间】:2018-11-18 17:45:33 【问题描述】:我正在尝试为我的博客托管多个 Rails 应用程序。有点像 www.blog.com/app1 会有一个 rails 应用程序,www.blog.com/app2 会有另一个。我该怎么做?
【问题讨论】:
【参考方案1】:虽然我同意第一条评论指出的反对意见,但几个月前我自己也遇到了这个问题,实际上我什至没有尝试解决它,因为我意识到这有多少影响。 Stack Overflow 上的现有答案解决了稍微不同或更窄的问题,因此他们可能会使用这里提到的一些东西,但没有详细说明影响或替代方案,但有一个 interesting overview(以及该问题的其他答案)。不管怎样,我把它当作一个挑战,潜入了。
首先,根据您的情况,有多种方法:
-
所有应用程序都是您维护的代码 - 探索名为 engines 的东西可能是最好的选择。它们就像迷你 RoR 应用程序,可安装到正常 RoR 应用程序中的特定路径。它有很多好处,例如共享相同的运行时或就地配置的简单隔离。
如果没有带有 URL 或类似动态的 AJAX,或者它们实际上是 AHAH(即异步 html 和 HTTP——返回 HTML 片段而不是 XML 或 JSON 数据),这对于 Rails 来说是很自然的,尽管通常不使用,你可以使用复杂的代理模块,如 mod_proxy_html,在代理时重写 HTML 文档中的链接。 nginx 存在类似的模块,但不是标准分发的一部分。
RoR 有一个配置选项
relative_url_root
,它允许deployment to subdirectories。它非常脆弱并且经常出现故障,许多宝石或引擎在您使用时会损坏,所以要小心。当你做对了,它看起来就像魔法一样。但是,您与子目录相关的配置将分散在不同的软件配置和您的代码中。
我在探索最后一个选项时创建了一个example repository。 README 应该说出运行代码所需的一切。
从这个小项目中最重要的观察结果是,当使用相对 URL 根目录时,您几乎可以肯定地希望确定所有路由的范围。可能有不同的设置,但它们更加复杂(这并不意味着它们没有意义)。示例参见answer with overview mentioned above。
默认情况下(没有范围路由),只有资产路径以相对 URL 根为前缀,而不是动作路由路径,即使它使助手生成的 URL 无用,除非由 mod_proxy_html
或可能更自定义的解决方案翻译。
其他与官方指南、“外面”代码和 Stack Overflow 上类似问题的答案有关的重要观察是,最好避免在相对 URL 根的开头使用正斜杠。它在测试和其余代码之间的行为不一致。然而,它可以很好地用于您的代码 - 请参阅 scope definition in routes config 或 dummy controller test case。
通过创建两个非常简单且几乎相同的 Rails 5.2 应用程序,我得到了这些和其他观察结果。每个都有一个动作 (dummy#action
),它有一个路由 scoped to relative URL root。此操作或its view 具体做了两件重要的事情来验证一切正常:
root_path
助手的结果,这表明我们已经正确设置了 URL/路径助手(感谢 config/routes.rb
中的范围路由)
它加载静态资产,这些资产不是由 Rails 应用程序提供,而是由 Apache HTTP Server 直接提供,并由image_path
helper 引用
您可以看到虚拟主机配置有相当广泛的 URL 列表,这些 URL 不应通过代理传递并依赖别名目录。但是,这是特定于应用程序且非常可配置的,因此具有不同目录布局的更简单设置绝对是可以实现的,但完全是独立的主题。
如果你喜欢Passenger并且不想在你的HTTP服务器中使用代理,你可以找到more information in their deployment tutorial。
【讨论】:
以上是关于在同一台服务器上托管多个 Rails 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
在具有多个域的同一服务器上托管 PHP 和 Node.js 应用程序
React/webpack - 如何在一台服务器上托管 React 应用程序,在另一台服务器上托管图像/字体?
IIS8 - 在同一台服务器上托管 SSL 和非 SSL 站点