Error 500 "PHP Fatal error: Uncaught RuntimeException: APP_ENV environment variable is not defined." on Symfony app start
Error 500 "PHP Fatal error: Uncaught RuntimeException: APP_ENV environment variable is not defined." on Symfony app start
我最近将一个新的 Symfony 4 项目部署到生产服务器,我在其中设置(通过 ssh)APP_ENV
和 APP_SECRET
作为环境变量。 printenv
和 set
这两个命令都在它们的输出中列出了这些变量,所以我认为那部分的一切都应该没问题。
我在网站上收到错误 500,日志返回 PHP Fatal error: Uncaught RuntimeException: APP_ENV environment variable is not defined. You need to define environment variables for configuration or add "symfony/dotenv" as a Composer dependency to load variables from a .env file.
我在这里错过了什么?
您的网络服务器将无法使用系统变量。该变量应在 vhost/htaccess 文件中定义。我假设您使用的是 Apache。
如果您使用的是 nginx,则必须在池配置文件的末尾定义。
php5
/etc/php5/fpm/pool.d/www.conf
php7
/etc/php/7.1/fpm/pool.d/www.conf
[EDIT 2020] --> 使用 'symfony/dotenv'
根据 how to deploy 官方文档,您可以将作曲家文件中的 'symfony/dotenv' 从 require-dev 移动到 require,以便它也安装在生产环境中。然后您可以继续使用 .env.local 文件。
如果您不想或不能使用 'symfony/dotenv'
对于 Apache 和 Ubuntu 首先你需要 mod_env 激活
sudo a2enmod env
sudo service apache2 restart
然后将环境变量放入.htacess 或虚拟主机配置文件中。对于 SF4,.htacess 位于 /public 中,语法如下。我不知道顺序是否重要,我会说不,所以我将它们添加到文件的顶部。
SetEnv APP_ENV prod
SetEnv APP_SECRET fjsdkfj...
SetEnv DATABASE_URL mysql://...
现在一些随机有用的技巧:
您不想提交 .htaccess 文件。将它添加到部署工具的共享部分。就我而言 (easy-deploy-bundle)
->sharedFilesAndDirs(['public/.htaccess'])
您需要复制 /etc/environment 中的环境变量,以便 composer 可以使用它……这真的很麻烦,因为现在您复制了变量。所以 Symfony 团队说 env 变量更好,因为更安全和标准。但是复制信息一点也不安全。也许我做错了(这完全有可能)。如果您知道如何避免这种情况,请分享。
printenv
命令会显示它是否配置正确。
如果您使用 easy-deploy-bundle 进行生产,请删除 composer 上的 --quiet 选项,这样如果它失败,您会收到一条明确的错误消息(因为它找不到环境变量,例如).还要检查 --no-dev 选项在这里,所以它不会安装 dotenv 包。
->composerInstallFlags('--prefer-dist --no-interaction --no-dev')
我最近将一个新的 Symfony 4 项目部署到生产服务器,我在其中设置(通过 ssh)APP_ENV
和 APP_SECRET
作为环境变量。 printenv
和 set
这两个命令都在它们的输出中列出了这些变量,所以我认为那部分的一切都应该没问题。
我在网站上收到错误 500,日志返回 PHP Fatal error: Uncaught RuntimeException: APP_ENV environment variable is not defined. You need to define environment variables for configuration or add "symfony/dotenv" as a Composer dependency to load variables from a .env file.
我在这里错过了什么?
您的网络服务器将无法使用系统变量。该变量应在 vhost/htaccess 文件中定义。我假设您使用的是 Apache。
如果您使用的是 nginx,则必须在池配置文件的末尾定义。
php5
/etc/php5/fpm/pool.d/www.conf
php7
/etc/php/7.1/fpm/pool.d/www.conf
[EDIT 2020] --> 使用 'symfony/dotenv'
根据 how to deploy 官方文档,您可以将作曲家文件中的 'symfony/dotenv' 从 require-dev 移动到 require,以便它也安装在生产环境中。然后您可以继续使用 .env.local 文件。
如果您不想或不能使用 'symfony/dotenv'
对于 Apache 和 Ubuntu 首先你需要 mod_env 激活
sudo a2enmod env
sudo service apache2 restart
然后将环境变量放入.htacess 或虚拟主机配置文件中。对于 SF4,.htacess 位于 /public 中,语法如下。我不知道顺序是否重要,我会说不,所以我将它们添加到文件的顶部。
SetEnv APP_ENV prod
SetEnv APP_SECRET fjsdkfj...
SetEnv DATABASE_URL mysql://...
现在一些随机有用的技巧:
您不想提交 .htaccess 文件。将它添加到部署工具的共享部分。就我而言 (easy-deploy-bundle)
->sharedFilesAndDirs(['public/.htaccess'])
您需要复制 /etc/environment 中的环境变量,以便 composer 可以使用它……这真的很麻烦,因为现在您复制了变量。所以 Symfony 团队说 env 变量更好,因为更安全和标准。但是复制信息一点也不安全。也许我做错了(这完全有可能)。如果您知道如何避免这种情况,请分享。
printenv
命令会显示它是否配置正确。如果您使用 easy-deploy-bundle 进行生产,请删除 composer 上的 --quiet 选项,这样如果它失败,您会收到一条明确的错误消息(因为它找不到环境变量,例如).还要检查 --no-dev 选项在这里,所以它不会安装 dotenv 包。
->composerInstallFlags('--prefer-dist --no-interaction --no-dev')