Ruby on Rails应用仅root可运行,ec2-user运行报错求助
问题分析
报错核心为无法加载mail/indifferent_hash,且仅非root用户触发,根源通常是依赖包权限不足、bundle安装的用户上下文不一致,或是mail gem版本与Rails 5.2.x的兼容性冲突。
解决方法
1. 修复依赖目录权限
root身份安装的依赖包,非root用户可能无读取权限,执行以下命令修正:
# 针对EC2实例的ec2-user用户 cd /home/ec2-user/test/mvs_web sudo chown -R ec2-user:ec2-user /opt/rubies/ruby-2.7.6/lib/ruby/gems/2.7.0/ # 针对Elastic Beanstalk的webapp用户 sudo chown -R webapp:webapp /var/app/staging/
2. 以目标用户身份重新安装依赖
避免root安装带来的权限遗留问题,切换到目标用户重新执行bundle操作:
# 切换到ec2-user su - ec2-user cd /home/ec2-user/test/mvs_web bundle clean --force bundle install --path vendor/bundle # 切换到webapp用户(Elastic Beanstalk场景) sudo su - webapp cd /var/app/staging bundle clean --force bundle install --path vendor/bundle
3. 锁定兼容的mail gem版本
Rails 5.2.x默认依赖的mail版本范围可能包含2.8.0,而该版本中mail/indifferent_hash的路径或存在性发生了变更,需锁定到兼容版本:
在Gemfile中添加:
gem 'mail', '~> 2.7.1'
执行更新:
bundle update mail
之后切换到目标用户重新启动应用。
4. 校准用户环境变量
确保非root用户的Ruby、Bundle路径正确:
# 检查Ruby路径 which ruby # 需指向/opt/rubies/ruby-2.7.6/bin/ruby # 检查Bundle路径 which bundle # 需对应目标Ruby版本的bundle
若路径错误,在用户的~/.bashrc或~/.profile中添加:
export PATH="/opt/rubies/ruby-2.7.6/bin:$PATH"
执行source ~/.bashrc加载新环境变量。
验证
完成操作后,以目标用户执行以下命令确认问题解决:
# 启动Rails服务 bundle exec rails s # Elastic Beanstalk场景验证迁移命令 bundle exec rake db:migrate
内容的提问来源于stack exchange,提问作者Shiva kumar Gajjala
相关产品推荐
相关产品推荐

