AWS EBS无法识别Laravel环境变量问题求助
我帮你梳理下这个问题的常见原因和解决办法,这种情况在EBS部署Laravel时挺普遍的,咱们一步步来排查:
1. SSH会话默认不会加载EBS环境变量
EBS在软件配置里设置的环境变量,是存储在/opt/elasticbeanstalk/support/envvars文件中的,但你通过SSH登录EC2实例后,默认的shell会话不会自动加载这个文件。所以直接执行php artisan env读不到你配置的变量。
解决方法:
先加载环境变量,再执行命令:
source /opt/elasticbeanstalk/support/envvars && php artisan env
这时候应该就能看到正确的APP_ENV=stage了。
2. Laravel配置缓存导致旧值残留
如果之前部署时运行过php artisan config:cache或者php artisan optimize,Laravel会把所有配置(包括环境变量对应的配置)缓存成静态文件,后续即使环境变量更新,缓存的配置也不会自动刷新。
解决方法:
在EC2实例中执行以下命令清除缓存:
source /opt/elasticbeanstalk/support/envvars php artisan config:clear php artisan cache:clear
之后再运行php artisan env验证。
另外,建议在EBS部署流程中添加部署钩子,自动清除缓存。比如在项目根目录创建.ebextensions/01_clear_cache.config文件,内容如下:
container_commands: 01_clear_config_cache: command: "php artisan config:clear" 02_clear_application_cache: command: "php artisan cache:clear"
这样每次部署都会自动清除缓存,避免旧配置干扰。
3. 检查EBS环境变量配置是否正确
- 登录AWS控制台,进入你的EBS环境,依次点击「配置」→「软件」标签页,确认
APP_ENV的键名是大写的(必须是APP_ENV,而非小写或拼写错误),值确实是stage。 - 注意EBS环境变量是区分大小写的,键名和值的拼写不能出错。
4. 确保PHP-FPM加载了EBS环境变量
如果不仅SSH命令行读不到,Web应用里也无法获取环境变量,那可能是PHP-FPM进程没有加载EBS的envvars文件。
解决方法:
创建.ebextensions/02_php_fpm_env.config文件,内容如下:
files: "/etc/php-fpm.d/eb_env.conf": mode: "000644" owner: root group: root content: | include=/opt/elasticbeanstalk/support/envvars
这个配置会让PHP-FPM加载EBS的环境变量文件,部署后Web进程就能正确读取到APP_ENV了。
5. 查看Laravel日志排查异常
如果以上方法都没解决问题,可以查看Laravel的日志文件(默认路径是/var/app/current/storage/logs/laravel.log),看是否有环境变量加载失败的错误信息,或者是否有其他配置文件意外覆盖了APP_ENV的值。
先从第1点开始排查,这是最常见的原因,大部分情况下source环境变量后就能看到正确的结果了。
内容的提问来源于stack exchange,提问作者Nenad Kaevik

