【问题标题】:Why would I use environment variables for configuring a Symfony app?为什么我要使用环境变量来配置 Symfony 应用程序?
【发布时间】:2019-03-02 14:53:45
【问题描述】:

昨天是我第一次在自己的服务器上使用 Symfony 4 进行部署。阅读 official documentation 关于部署,我引用:

大多数 Symfony 应用程序从环境中读取它们的配置 变量。在本地开发时,您通常会将这些存储在 .env 文件。但在生产中,您无需创建此文件,而是 应该设置真正的环境变量。

现在,由于我在多个网站上了解到这是在生产中工作的正确方式,我对此有几个疑问:

  • 生产环境变量的含义是什么?为什么不把变量放在 Wordpress、Django 等文件中?
  • 为什么我希望将项目数据库的凭据放在全局 OS 变量中???
  • 作为全局变量,操作系统中的所有人都可以访问,如果我有多个具有相同环境变量的项目(例如,Symfony 中的APP_ENV),更改其值将影响我的所有项目!这有意义吗?

如果有人能对这个主题有所了解,我将不胜感激。

对不起我的英语

【问题讨论】:

  • 下面有一些很好的答案。这可能不是很明显,但使用 env 变量将允许在不重建 Symfony 缓存的情况下更改变量。在某些情况下有用的功能。您总是可以老去,只需使用 parameters.yaml 文件并在有任何变化时重建缓存。
  • 当然!谢谢!
  • 在生产系统上放置一个 .env 文件也可以。确保环境中没有设置 APP_ENV 等,它将像本地一样被选择。永远不要将该文件提交到 GIT 中。

标签: php symfony deployment environment-variables


【解决方案1】:

生产环境变量的含义是什么?为什么不把变量放在 Wordpress、Django 等文件中?

  • 环境变量是在您将应用程序从一台服务器移动到另一台服务器时发生变化(并且只会发生变化)的值

  • 这些是该服务器或该集群独有的值,例如服务器的主机名或用于连接数据库的主机名/IP

您将这些变化的值组合在一起,以便当您部署到不同的环境/不同的服务器组(如测试环境、暂存环境/生产环境)时,您的应用会自动调整

为什么我希望将项目数据库的凭据保存在 全局操作系统变量???

如前所述,还有其他设置方法。就像在您的网络服务器中或仅在您的网络服务器的虚拟块中一样

作为全局变量,操作系统中的所有人都可以访问,如果我有更多的话 比一个具有相同环境变量的项目(例如,APP_ENV in Symfony),改变它的值会影响我所有的项目!可以 有意义吗?

是的,因为通常如果服务器被标记为“测试环境”或“UAT 环境”,您在那里部署的所有内容都应该表现相同(特别是如果它是生产服务器)。

与为每台服务器设置多种用途相比,这样组织部署和服务器使管理变得容易得多。

【讨论】:

    【解决方案2】:

    生产环境变量的含义是什么?为什么不 只是将变量保存在 Wordpress、Django 等文件中?

    首先要了解的是有多少种不同的环境可以运行您的代码。您可以拥有生产、登台、测试和本地环境。由于冲突而无法将每个完全不同的配置文件同步到您的 VCS 存储库,这真的有意义吗?

    您仍然在 Symfony 和其他框架中拥有配置文件。但是,有些设置依赖于环境,而有些则不依赖于环境。可以从环境变量中设置依赖于环境的那些。这样,您可以同步配置文件,但仍保持环境特定的设置。


    您的其他担忧可以通过环境变量不必是全局的这一事实来解释。 Web 服务器可以在各种上下文中定义环境变量,例如在 miken32 建议的特定虚拟主机中使用 SetEnv。

    【讨论】:

      【解决方案3】:

      这个问题不太适合 SO,但简而言之:可以为任何环境设置环境变量,而不仅仅是操作系统。例如,就像您的网络服务器一样。我在/etc/httpd/conf.d/variables.conf 中有以下内容,这些内容包含在我的主要 Apache 配置中的某些虚拟主机中:

      #Config for web apps
      SetEnv DB_CONNECTION      "mysql"
      SetEnv DB_HOST            "192.168.242.1"
      SetEnv DB_USERNAME        "dbuser"
      SetEnv DB_PASSWORD        "dbpass"
      SetEnv DB_DATABASE        "dbname"
      

      可以使用权限保护此文件,以确保只有 Web 服务器本身可以读取它们。如果我有多个应用程序或虚拟主机,我可以有多个文件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-08
        • 2014-08-02
        • 2015-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-08
        相关资源
        最近更新 更多