在同一台服务器上托管多个Rails应用程序

时间:2018-06-08 16:01:39

标签: ruby-on-rails apache nginx hosting

我试图为我的博客托管多个rails应用程序。有点像www.blog.com/app1将有一个rails应用程序,www.blog.com / app2将有另一个。我该怎么做?

1 个答案:

答案 0 :(得分:3)

虽然我同意第一条评论所指出的downvotes,但几个月前我自己遇到了这个问题,实际上甚至没有尝试解决它,因为我意识到这有多少含义。 Stack Overflow上的现有答案可以解决稍微不同或更窄的问题,因此他们可能会使用这里提到的一些内容,但没有详细说明含义或替代方案,但还有interesting overview(以及该问题的其他答案)。无论如何,我把它作为挑战并潜入其中。

首先,根据您的情况,有多种方法:

  1. 所有应用程序都是您维护的代码 - 探索名为engines的东西可能是最好的。它们就像迷你RoR应用程序,可安装在普通RoR应用程序中的某个路径上。它有许多好处,例如共享相同的运行时或在现场配置的简单隔离。
  2. 如果没有带有URL或类似动态的AJAX,或者它们实际上是AHAH(即异步HTML和HTTP - 返回HTML片段而不是XML或JSON数据),这对于Rails来说非常自然,尽管经常不使用,你可以使用像mod_proxy_html这样的复杂代理模块,它们在代理时重写HTML文档中的链接。 nginx存在类似的模块,但不属于标准分发。
  3. RoR有一个配置选项relative_url_root,允许deployment to subdirectories。它非常脆弱,经常出现问题,许多宝石或引擎在您使用时会中断,所以要小心。当你做对了,它看起来像魔术。但是,与子目录相关的配置将分散在不同的软件配置和代码中。
  4. 我在探索最后一个选项时创建了example repositoryREADME应该说出运行代码所需的一切。

    这个小项目最重要的一点是,当使用相对URL root时,你几乎肯定想要扩展所有路由的范围。可能有不同的设置,但它们更复杂(这并不意味着它们没有意义)。有关示例,请参阅answer with overview mentioned above 默认情况下(没有作用域路由),只有资产路径以相对URL根作为前缀,而不是行动路径路径,即使它使助手生成的URL无用,除非由mod_proxy_html或更多自定义解决方案进行翻译。

    其他重要的观察,与官方指南相关,代码“在那里”以及Stack Overflow上类似问题的答案,是在相对URL根的开头避免正斜杠是很好的。它在测试和其余代码之间的行为不一致。然而,它可以很好地用于代码 - 请参阅scope definition in routes configdummy 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