Rails:多种应用程序部署策略

在我的公司,我们目前有一个主要的项目是一个巨大的Rails应用程序。 部署非常简单,我们有几个Capistrano部署到/var/www/<hostname>/current的前端服务器(使用Puppet进行安装)。 然后重新启动Unicorn(零停机部署!),每个人都很高兴。

不幸的是有一个问题。 应用程序的单一性质开始咬我们。 现在运行所有testing需要30分钟以上,并且正在减慢我们的速度。 我们希望将其分成更小的块,并采用更多的μService体系结构。 不过这让我想起了我们的部署策略。 现在看来:

  • Rails应用程序和Nginx作为www-data用户运行
  • 任何有权访问该框的用户都可以进行部署(在Capistrano中,我们会在部署期间将应用程序的内容分发给用户)

这样做的安全性相当低(一切以同一用户身份运行,每个人都可以访问所有内容)。 这也让我想起我们以前的公司做过的事情 – 这是一个噩梦,因为所有的应用程序都被困在Ruby 1.6上,因为它们共享相同的版本。

我想我们可以通过安装rbenv让每个应用程序运行它自己的Ruby版本,并让每个应用程序的用户来提高安全性。 但是我在实践中还没有真正看到这个例子。 例如, 37signals以同一用户身份运行所有应用程序 – 我担心应用程序不能作为不同用户运行的充分理由。

总结:

  • 在μService风格体系结构中将多个Rails应用程序部署到服务器的最佳方式是什么?
  • 什么是隔离每个应用程序(在Ruby版本和用户安全方面)的最佳方式?

提前致谢!

我们有一个类似的configuration(尽pipe我们正在使用Tomcat和Grails而不是nginx和RoR)。 我们为每个Tomcat实例设置了单独的用户标识。 我们将用户的.profile中的Java,Grails和任何其他依赖库的主目录设置为环境variables,因此每个Tomcat都可以使用我们安装的任何版本运行。

我们的自动化部署软件(Atlassian Bamboo)的userid用户是分配给每个Tomcat目录的组的成员。

对于多个Ruby实例,我肯定会推荐使用RVM(Ruby enVironemnt Manager) 。 我发现它比rbenv更适合生产环境。

只有以特权用户身份启动,Nginx才能绑定到特权端口(<= 1024)。 因此,可能需要反向代理configuration来满足您允许用户将独立实例作为单独进程启动的需要。

如果您在单独的虚拟机上运行每个应用程序的评估是明确的,那么隔离GNU / Linux上的每个应用程序的一种方法是SELinux 。 SELinux相当复杂,但提供的function使您能够安全地分离进程和上下文。