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