【问题标题】:How to set environment variables for Laravel 5 on AWS EC2 with MySQL如何使用 MySQL 在 AWS EC2 上为 Laravel 5 设置环境变量
【发布时间】:2015-04-27 14:02:49
【问题描述】:

我已成功将我的 laravel 5 应用程序部署到 AWS EC2。我还使用 AWS RDS 创建了一个 MySQL 数据库,并将其与我的应用程序实例相关联。

现在我想设置我的 env 变量,以便在我的本地计算机上进行开发时使用 homesteads 默认值,并在部署和生产时使用我的 AWS 数据库。

从这里我对我原来的问题进行了重大修改,以反映我在提出问题后所学到的知识

用于本地开发的 laravel 项目中的经典 .env 大致如下:

APP_ENV=local
APP_DEBUG=true
APP_KEY=BF3nmfzXJ2T6XU8EVkyHtULCtwnakK5k (Note, not a real key)

DB_HOST=localhost
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync

MAIL_DRIVER=smtp
MAIL_HOST=mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null

对于生产,我终于明白我只需使用生产变量创建一个新的 .env 文件。使用 AWS 时,我的 .env 文件大致如下所示:

APP_ENV=production
APP_DEBUG=false
APP_KEY=BF3nmfzXJ2T6XU8EVkyHtULCtwnakK5k (Note, not a real key)

DB_HOST=aaxxxxxxxxxxxxx.cyxxxxxxxxxx.eu-central-1.rds.amazonaws.com:3306
DB_DATABASE=MyAppsDatabaseName
DB_USERNAME=MyAWSRDSUserName
DB_PASSWORD=NotARealPassword

CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync

MAIL_DRIVER=smtp
MAIL_HOST=mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null

我现在的问题/问题

我使用 AWS eb cli 从 git 部署我的应用程序。但是如何部署我的生产 .env 文件而不必先将其推送到 git?

【问题讨论】:

  • 您是否将 .env 文件包含在源代码管理中?不要
  • 不,我没有 :) 它在 .gitignore 中默认被忽略。但我认为当我执行eb deploy 时它已上传到 aws。否则 laravel 是读不出来的……对吧?
  • 你解决过这个问题吗?
  • 没有在实践中,但我想我找到了方法。 Jeffrey Way 在他的Laracast 5 episode 17 "Midterm Review" 中对此进行了描述。他从 8.31 开始审查 .env,在 9.14 他说:“所以一旦你部署了这个,你就会在你的生产端创建另一个 .env 文件。所以理解这一点很重要。 " 我现在的问题是,如何在不先将文件推送到 git 的情况下将文件部署到 AWS...
  • 正是我们正在思考的......

标签: mysql git amazon-web-services environment-variables laravel-5


【解决方案1】:

您可以在您的 ec2 实例上创建一个新的 .env 并在其中添加所有 env var。一种选择是通过 ssh 进入盒子并通过 vi 或 cat 创建文件。或者您可以编写一个脚本从外部位置远程拉入 .env。

您也可以通过 ssh 进入该框并 export APP_ENV=production 您所有的环境变量(假设这是您操作系统的正确命令)。

将环境变量添加到您的环境将取决于您的 ec2 实例运行的操作系统,因此解决方案将取决于此。 ec2 有一个可能有用的“标签”概念,但文档显示它们将标签的数量限制为 10,因此您可能必须手动执行每个 ec2 实例:/

请参阅here,了解一种使用标签拉入和设置环境变量(非 laravel 特定)的方法。

我昨天刚刚在 Elastic Beanstalk 上运行 Laravel 时经历了这个,解决方案很干净。您实际上可以通过 aws 控制台直接设置环境变量(EB 应用程序/环境 -> 配置 -> 软件配置 -> 环境属性)。

更新:

要理解的关键概念是 Laravel 只是使用 phpdotenv 将 .env 文件中的变量转储到 php 的全局 $_ENV 中,而当 php 启动服务器时,任何已经存在的 env 变量都会自动包含在 $_ENV 中( docs)。所以 .env 文件本身是不必要的,实际上只是为了方便开发。 (除非到目前为止我刚刚被弹性豆茎宠坏了)。

【讨论】:

【解决方案2】:

上面的 Russ Matney 给出了正确的答案,所以他得到了复选标记。我将在这里写下我自己的答案,以添加有关我如何使事情发挥作用的详细信息。我假设您确实设置了数据库并拥有所需的所有凭据。

1. 转到弹性豆茎仪表板


2.接下来转到您的软件配置


3. 添加您的生产环境变量,如下所示。请记住将文档根目录设置为 /public,并在数据库端点末尾添加 :3306 以避免 PDOEXCEPTION 错误。

See bigger version of picture below


4. 下一个 SSH 进入您的应用程序 eb 实例。 See details here,或尝试以下操作:

$ ssh -i path/to/your/key/pair/pem/file.pem ec2-user@ec1-11-11-11-111.eu-central-1.compute.amazonaws.com

请注意,ec1-11-11-11-111.eu-central-1.compute.amazonaws.com 是您的应用公共 DNS。你会在这里找到你的:


5. cd 到您的应用程序:$ cd /var/app/current


6. 授予对存储文件夹的读/写访问权限,否则应用无法写入日志文件夹,这将导致在运行迁移时出错。授予访问权限:$ sudo chmod -R ugo+rw storage


7.终于!如果您愿意,请运行您的迁移并执行其他工匠命令! $ php artisan migrate gitbash 中的成功应该大致是这样的:

【讨论】:

  • 感谢您提供的详细信息,它也帮助我开始跑步。我要补充一点:在顺利部署之前,我的最后一个头痛是更新 RDS 实例的安全组以允许来自 ec2 应用程序本身的连接。在这里找到了一个有用的(虽然有点过时)指南:blog.goforyt.com/laravel-aws-elastic-beanstalk-dev-guide
  • @MartinJH 有什么联系方式吗?我发现这真的很难,可以用手...
  • @ackerchez 随时在这里写下您的问题,或发送电子邮件至 martin_hammer AT live.dk :)
猜你喜欢
  • 2016-01-26
  • 1970-01-01
  • 2018-11-03
  • 2021-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-22
相关资源
最近更新 更多