AWS EC2上Rails应用HomeController#index报错:rails-erb-loader相关问题
Rails 6 EC2环境下rails-erb-loader模块导致ExecJS::ProgramError问题排查
问题描述
在AWS EC2 Linux实例运行Rails应用时,HomeController#index触发ExecJS::ProgramError,错误关联rails-erb-loader模块,报错详情:
ExecJS::ProgramError in HomeController#index Error: Module build failed (from ./node_modules/rails-erb-loader/index.js): Rails.root: /home/ec2-user/siam-mha Application Trace | Framework Trace | Full Trace (execjs):279:18 (execjs):282:10 app/controllers/concerns/set_locale.rb:36:in `switch_locale' Exception Causes MiniRacer::RuntimeError: Error: Module build failed (from ./node_modules/rails-erb-loader/index.js):
环境信息
- Rails版本:6.0.3.5
- Ruby版本:2.7.2
- Node.js版本:14.16.0
已尝试操作
- 检查
set_locale.rb文件未发现明显问题 - 查阅
rails-erb-loader文档排查配置问题
注:本地环境可正常运行,仅EC2开发环境出现该错误。
可能原因及解决方案
1. 依赖安装不完整或版本不一致
本地与EC2环境的npm依赖可能存在版本差异,或EC2上未正确安装全部依赖。
- 解决方案:
- 删除EC2上的
node_modules目录和package-lock.json文件:rm -rf node_modules package-lock.json - 重新安装依赖:
npm install - 确认
package.json中rails-erb-loader版本与本地一致,若不一致,锁定版本后重新安装。
- 删除EC2上的
2. MiniRacer运行时环境问题
错误提示涉及MiniRacer::RuntimeError,可能是EC2上MiniRacer的系统依赖缺失或版本不兼容。
- 解决方案:
- 更新MiniRacer gem:
bundle update mini_racer - 安装必要的系统依赖(以Amazon Linux 2为例):
sudo amazon-linux-extras install epel -y sudo yum install libv8-devel -y - 重新编译MiniRacer:
bundle config build.mini_racer --with-v8-dir=/usr bundle install
- 更新MiniRacer gem:
3. Webpacker配置差异
本地与EC2的Webpacker配置存在差异,导致rails-erb-loader处理ERB文件失败。
- 解决方案:
- 检查
config/webpack/environment.js中rails-erb-loader的配置,确保与本地一致,示例配置:const { environment } = require('@rails/webpacker') const erb = require('./loaders/erb') environment.loaders.prepend('erb', erb) module.exports = environment - 重新编译Webpack资源:
rails webpacker:compile - 确认EC2环境的RAILS_ENV设置为开发环境:
export RAILS_ENV=development
- 检查
4. 文件权限问题
EC2实例上的文件或目录权限不足,导致rails-erb-loader无法读取或写入文件。
- 解决方案:
- 调整应用目录权限,确保
ec2-user拥有读写权限:sudo chown -R ec2-user:ec2-user /home/ec2-user/siam-mha - 确保
tmp目录可写:chmod -R 755 tmp/
- 调整应用目录权限,确保
内容的提问来源于stack exchange,提问作者Bhushan wagh
相关产品推荐
相关产品推荐

