我正在写一篇关于12因素应用程序的论文,我想知道你是否可以帮助我。
十二因素应用程序的第三个因素是:在环境中存储配置。 (https://12factor.net/config)。根据页面,所有可能在部署之间变化的配置都应该提取到环境变量。
我想知道如何在开发期间应用一个Rails应用程序。目前我认为有两种方式在我看来并不完美。
我的观点是否正确?我想知道是否有任何最佳实践来解决这个问题。
谢谢!
答案 0 :(得分:2)
基本上,可以根据您的上下文访问环境变量。运行流程的用户,系统,应用程序都可以修改您可以在应用程序中的任何给定时间/地点访问的变量集。那么,你把它们放在哪里取决于你的应用程序的需求 - 你需要在同一台服务器上隔离不同的应用程序吗?您是否需要有效管理数十个应用程序?您是否需要配置和填充新的服务器环境?等
至于这里的选项是我所经历的:
.*rc
文件适用于这种配置,即使您可能不喜欢它的 flavor 。 这些可供环境运行文件的用户使用,因此如果您的登录用户为ubuntu
,但您的服务以其他用户身份运行,例如{{1},则可能对您无效}或www-data
。
Dotenv也很好,因为它在运行时将变量注入到实际的ENV中。不完美,但仍然可以接受imho(假设你从不将这些变量提交给vc,正如你所指出的那样)。 这使得使用Dotenv 的单个应用程序可以使用它们。
其他方式(对于Web应用程序)将它们放入Apache或Nginx(或其他Web服务器)配置中。它们可以放在虚拟主机定义层的环境中,也可以放在服务/守护进程配置层(尽管我认为Nginx不支持vhost环境)。 这使得变量可供这些服务启动的任何应用。这对于网站或网络应用程序来说很常见。
您还可以在服务器范围内设置环境:httpd
或/etc/profile
。这使它们可用于整个系统上的任何服务。
除此之外(多服务器应用程序,复杂托管等)更多是Ops的问题 - 管理多个配置集仍然与12因素应用程序相关,但不会有一个简单的答案:)< / p>
你不必马上做出决定!使用环境变量是一种非常灵活的方法!您可以在开发Macbook上使用DotEnv,将它们放在Staging环境中的Apache中,使用/etc/environment
作为测试/集成服务器,并将它们放在.bashrc
的定制Lighttpd生产服务器上。让你的应用程序期望你的配置在ENV中意味着你的应用程序不必关心它是如何到达的那样 !!!