Amazon Linux 2 EB环境resque任务误加载开发环境配置报错排查
问题根因
- Amazon Linux 2 版本的Elastic Beanstalk平台钩子(包括postdeploy钩子)运行时,默认不会继承你在EB控制台/配置中设置的环境变量,
RACK_ENV、RAILS_ENV这类变量默认不存在,Rails会 fallback 到默认的development环境。 - 你使用的
su -s /bin/bash -c "..." webapp命令默认会重置所有非系统默认的环境变量,即便钩子脚本中存在相关变量,执行su后也会丢失。
报错中提到的cannot load such file -- listen符合开发环境的特征:listen gem通常放在Gemfile的development组,生产环境部署时不会安装,只有加载development环境配置时才会尝试加载这个gem。
解决方案
修改你的.platform/hooks/postdeploy/resque_starter.sh脚本,按以下逻辑调整:
- 先加载Elastic Beanstalk存储的环境变量文件,导出所有变量到当前运行环境
- 执行su命令时添加
-p参数保留环境变量,同时在rake命令前显式声明RAILS_ENV=production、RACK_ENV=production双保险 - 提前创建resque的pid存储目录,避免因目录不存在导致启动失败
修改后的脚本参考:
#!/bin/bash # 加载EB环境所有自定义变量 set -a source /opt/elasticbeanstalk/deployment/env set +a # 创建pid目录并授权 mkdir -p /var/run/resque chown webapp:webapp /var/run/resque # 启动resque worker su -p -s /bin/bash -c "PIDFILE=/var/run/resque/resque_1.pid BACKGROUND=yes TERM_CHILD=1 LOGGING=1 RAILS_ENV=production RACK_ENV=production /opt/rubies/ruby-2.6.8/bin/bundle exec /opt/rubies/ruby-2.6.8/bin/rake resque:work QUEUES=email" webapp
补充检查项
- 注意你原命令中pid路径写的是
/var/run/reqsque/,属于拼写错误,已在参考脚本中修正为resque,避免pid文件写入失败 - 不需要调整Gemfile配置,只要正常加载production环境,就不会尝试加载
listengem
内容的提问来源于stack exchange,提问作者lei lei
相关产品推荐
相关产品推荐

