如何在cPanel和EasyApache 4环境下配置自定义Ruby版本
问题解答与解决方案
1 关于ea-ruby24是否强制覆盖PassengerRuby的问题
是,cPanel的EasyApache 4自带的Phusion Passenger默认绑定系统预装的ea-ruby系列运行时,你在SetEnv中设置的PassengerRuby优先级低于cPanel全局Passenger配置的默认Ruby解释器绑定规则:从日志可以看出所有加载器都来自/opt/cpanel/ea-ruby24/路径,说明Passenger本身是基于ea-ruby24启动的,默认会用自身绑定的Ruby版本加载应用,直接忽略你设置的PassengerRuby参数。
2 配置错误与遗漏项
你存在3处配置问题:
- 应用根目录配置错误:旧配置用
/home/adminxxx/webapps/assist2prod/current/软链指向最新代码,新生成的配置写死了旧版本路径/home/adminxxx/webapps/assist2prod/releases-2021old/20190707101851,首先需确认该路径下Gemfile确实指定Ruby 2.1.6,其次建议改用current软链路径,避免后续更新代码重复修改配置。 - PassengerRuby配置位置错误:你将PassengerRuby放在mod_env的SetEnv块中,cPanel编译的mod_passenger不会读取环境变量形式的该参数,必须直接写在mod_passenger配置块内才会生效。
- 缺少自定义Ruby权限配置:没有添加
PassengerUseGlobalRuby off参数,cPanel默认的Passenger会强制使用全局绑定的Ruby版本,禁止单个应用自定义Ruby路径。
3 排查思路优化建议
你的排查方向正确,缺少3个关键验证步骤:
- 执行
which passenger-config查看Passenger命令行工具所在路径,若为/opt/cpanel/ea-ruby24/下的路径,即可确认全局Passenger确实绑定ea-ruby24。 - 执行
passenger-config about ruby-command查看Passenger默认调用的Ruby路径,可直接验证是否被全局配置覆盖。 - 检查应用根目录下的
.bundle/config文件,确认是否指定了错误的Ruby路径或Bundler路径。
可执行解决方案
分为两种权限场景:
方案1:共享主机仅可修改.htaccess
将.htaccess替换为以下内容,优先级高于cPanel应用管理器生成的部分配置:
PassengerEnabled on PassengerUseGlobalRuby off PassengerLoadShellEnvVars On PassengerAppRoot /home/adminxxx/webapps/assist2prod/current/ PassengerRuby /usr/local/bin/ruby RewriteEngine On RailsEnv production RackEnv production
此处PassengerRuby使用你确认的2.1.6版本路径/usr/local/bin/ruby,不要使用旧的ruby20路径。
方案2:可申请管理员修改Apache虚拟主机配置
让管理员将生成的.conf改为以下内容:
<Location "/"> <IfModule mod_env.c> SetEnv "RackEnv" "production" SetEnv "RailsEnv" "production" </IfModule> <IfModule mod_passenger.c> PassengerAppEnv "production" PassengerUseGlobalRuby off PassengerEnabled on PassengerBaseURI "/" PassengerAppRoot "/home/adminxxx/webapps/assist2prod/current/" PassengerRuby "/usr/local/bin/ruby" PassengerAppGroupName "adminxxx - WisdomTorontoProduction" PassengerNodejs /opt/cpanel/ea-nodejs10/bin/node </IfModule> </Location> <Directory "/home/adminxxx/webapps/assist2prod/current/"> Allow from all Options -MultiViews Options -Indexes Require all granted AllowOverride All </Directory>
修改完成后重启Apache,删除应用目录下的tmp/restart.txt再重新生成一次,触发Passenger重启应用。
额外验证步骤
修改配置后若仍报错,可在应用根目录新建test.rb文件:
puts RUBY_VERSION puts Gem.ruby
用/usr/local/bin/ruby test.rb执行,确认输出的Ruby版本为2.1.6,同时检查Gemfile、Gemfile.lock中的Ruby版本声明是否正确。
内容的提问来源于stack exchange,提问作者dirktay
相关产品推荐
相关产品推荐

