【问题标题】:Symfony 4, .env files and productionSymfony 4、.env 文件和生产
【发布时间】:2018-08-17 18:43:44
【问题描述】:

.env 文件在 docker、kubernetes 等中非常方便

但是,如果我有一个没有任何编排的简单 nginx 服务器和一组 cron 工作人员和一组守护进程(systemd/supervisord/etc)呢?
我可以将这些环境变量写入 nginx 服务器部分,但我必须为每个 cron worker 或守护进程设置数百个环境变量。

我找到了一个快速的解决方案:在生产中使用 symfony/dotenv 组件。
但在我看来它很脏。谁能提出更好的解决方案?

【问题讨论】:

  • 这是一个很好的问题,因为不是每个人都可以访问服务器配置,因此这使得 Symfony 4 很难通过 FTP 进行部署。我现在看到很多人在生产中使用 dotenv。
  • 我有访问权限,但服务器有不同的应用程序(在 1 个用户内),我不能使用全局或用户环境。变量。
  • 实际上 Symfony 缺少像 Docker 一样的东西:一个“--env-file”选项!在执行 sf 控制台之前,您可以通过 export $$(grep -v '^#' .env | xargs) 从文件中导出环境变量。

标签: php symfony nginx environment-variables symfony4


【解决方案1】:

如果您想集中 cli 和 fpm 的环境变量,您可以在系统中定义一次。然后在您的php-fpm.conf 中引用它们:

....
[www]
env[APP_VAR1] = $APP_VAR1
env[APP_VAR2] = $APP_VAR2
...

通过这种方式,您可以避免在生产中使用 DotEnv,这是最佳实践所鼓励的。

希望这会有所帮助。

【讨论】:

  • 您说的是 Web 服务器,而问题是关于 Linux CLI(如 CRON)。
【解决方案2】:

首先,并不是所有的变量都需要使用环境变量来指定。将每个系统没有差异的变量保存在单独的 yaml 文件中。

当每台服务器只有一个环境时,您可以在/etc/environment 中全局指定环境变量。 (可能会因您的 Linux 风格而有所不同)

我个人发现,当您在同一台服务器上运行多个环境时,使用 DotEnv 比解决方案带来更多困难。在这种情况下,在 /etc/environment 这样的全局配置中指定变量不起作用。

在 nginx 中指定环境变量也不是一个解决方案,因为正如你所提到的,它们不会被 cron、主管、控制台等拾取。对我来说,这是完全删除 DotEnv 和再次使用旧的parameters.yaml 文件。没有什么能阻止你这样做。

然而,另一种解决方案是在您的开发环境中继续使用 DotEnv,并在生产环境中包含一个单独的 parameters.yaml。然后您可以按如下方式定义环境变量:

parameters:
  env(APP_ENV): prod
  env(APP_SECRET): 3d05afda019ed4e3faaf936e3ce393ba
  ...

包含此文件的一种方法是将以下内容放入您的 services.yaml 文件中:

imports:
    - { resource: parameters.yaml, ignore_errors: true }

这样,当没有 parameters.yaml 文件存在时,导入将被忽略。另一种解决方案是在您的 Kernel 类中向 configureContainer() 添加一行:

$loader->load($confDir.'/parameters'.self::CONFIG_EXTS, 'glob');

【讨论】:

  • 感谢您的回答。是的,我的环境列表仅包含服务器上不同的变量。此外,我们在每台服务器上有 6 个项目(来自一个系统),它们将具有不同的凭据,因此我们不能使用 /etc/environment。我们在 docker 中进行了测试,因此 yaml 文件对此并不满意。
  • 使用上述解决方案,您在生产中只需要一个 parameters.yaml。您可以在测试环境中继续使用 .env。
猜你喜欢
  • 2021-05-11
  • 1970-01-01
  • 2019-08-13
  • 1970-01-01
  • 2015-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-05
相关资源
最近更新 更多