我们正在使用 OpsWorks 将基于 Laravel 的应用程序部署到 AWS。我们已通过 OpsWorks 控制台定义了环境变量,Apache 可以正确查看这些变量。但是,在运行 CLI 任务(例如artisan
命令)时,这些变量未设置。
我理解这是由于在 Apache 的虚拟主机配置文件中设置了环境变量。我以为我可以通过运行一个部署钩子来解决这个问题,这个钩子会回显这些变量并将它们附加到/etc/environment
,但这并不奏效(即使它奏效了,它也太弱了)。
还有其他方法可以实现这一点吗? OpsWorks 允许这个特定要求吗?
谢谢。
答案1
以下是我们解决这个问题的方法(虽然不是最理想的,但还是可以的):
- 用于
getenv()
访问所有环境变量:如果使用,Apache 将看不到它们$_ENV
。 - 使用 OpsWorks 部署钩子将所有环境变量写入
.env.php
Laravel 的生产环境配置文件。环境变量将通过 提供给部署钩子代码node[:deploy]['<short_app_name>'][:environment_variables][:<VAR_NAME>]
。 - 运行指定生产环境的 artisan 命令:
php artisan --env=production --force <command-to-be-run>
。
我们主要使用上述内容从部署队列中的第一个实例运行迁移。
答案2
如果您还使用自定义 Chef 食谱,则可以使用 Chef 模板在运行时从 JSON 或 OpsWorks 应用程序变量设置属性。以下是 Moodle 设置的 config.php 示例,假设您有一个名为 webapp 的应用程序,其中配置了 moodle_dbhost、moodle_dbname、moodle_dbuser 等属性。
CFG->dbtype = 'pgsql';
$CFG->dblibrary = 'native';
$CFG->dbhost = '<%= node['deploy']['webapp']['environment']['moodle_dbhost'] %>';
$CFG->dbname = '<%= node['deploy']['webapp']['environment']['moodle_dbname'] %>';
$CFG->dbuser = '<%= node['deploy']['webapp']['environment']['moodle_dbuser'] %>';
$CFG->dbpass = '<%= node['deploy']['webapp']['environment']['moodle_dbpwd'] %>';
$CFG->prefix = 'mdl_';
$CFG->dboptions = array (
'dbpersist' => 0,
'dbport' => '<%= node['deploy']['webapp']['environment']['moodle_dbport'] %>',
'dbsocket' => 0,
);
$CFG->wwwroot = 'http://example.com/moodle/';
$CFG->dataroot = '/var/www/moodle-data/';