You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Passenger+Apache部署Rails应用遇sassc-rails Gem加载错误

解决Passenger+Apache部署Rails应用时sassc-rails的Gem加载错误

问题重现

报错信息:

There was an error while trying to load the gem 'sassc-rails'.
Gem Load Error is:
/var/www/myapp/vendor/bundle/ruby/3.3.0/gems/ffi-1.17.0-x86_64-linux-gnu/lib/ffi/function.rb:65:in `attach'
/var/www/myapp/vendor/bundle/ruby/3.3.0/gems/sassc-2.4.0/lib/sassc/native.rb:40:in `attach_function'
/var/www/myapp/vendor/bundle/ruby/3.3.0/gems/sassc-2.4.0/lib/sassc.rb:31:in `require_relative'
/var/www/myapp/vendor/bundle/ruby/3.3.0/gems/sassc-rails-2.1.2/lib/sassc/rails.rb:5:in `<main>'
/var/www/myapp/config/application.rb:12:in `<top (required)>'
/var/www/myapp/config/environment.rb:2:in `require_relative'
config.ru:3:in `block in <main>'
/usr/local/rvm/gems/ruby-3.3.6@myapp/gems/passenger-6.0.24/src/helper-scripts/rack-preloader.rb:101:in `preload_app'

环境详情:

Ruby Version: 3.3.6
Rails Version: 8
Passenger Version: 6.0.24
sassc-rails Version: 2.1.2
ffi Version: 1.17.0

1. 错误根因

  • 版本兼容性冲突:Ruby 3.3.x与ffi 1.17.0存在适配问题,ffi 1.17.0的attach方法在Ruby 3.3的运行环境下无法正常执行原生函数绑定。
  • Passenger预加载触发问题:Passenger的preload_app模式会提前加载所有应用依赖,而ffi的原生绑定逻辑在这种预加载场景下,无法正确初始化与系统底层库的连接,导致sassc-rails依赖的sassc组件加载失败。
  • 开发环境正常的原因:开发环境未启用预加载机制,且Ruby的加载流程与生产环境Passenger的隔离模式不同,刚好避开了兼容性触发点。

2. 注释ffi文件第65行可启动的原因

ffi的function.rb第65行是attach方法中的参数校验或绑定合法性检查逻辑,注释该行会跳过原本的错误拦截,强制ffi忽略绑定失败的步骤。但这是临时的治标方案:虽然应用能启动,但后续涉及Sass动态编译的操作可能出现隐性错误,且修改Gem源码会在bundle更新时被覆盖,生产环境风险极高。

3. 不修改Gem源码的正规解决方法

方法一:升级ffi到兼容版本

ffi 1.17.0之后的版本已修复Ruby 3.3的兼容性问题,执行以下命令升级:

bundle update ffi

升级后重新部署应用,验证错误是否消除。

方法二:调整Passenger预加载配置

若暂时无法升级ffi,可禁用Passenger的预加载模式,避免触发兼容性问题:

  • 在Apache虚拟主机配置中添加:
PassengerPreloadApp off
  • 或在Rails应用的config.ru顶部添加:
ENV['PASSENGER_PRELOAD_APP'] = 'false'

注意:禁用预加载会延长应用启动时间,适合临时过渡,长期建议优先升级ffi。

方法三:替换为Rails 8官方推荐的资产编译方案

Rails 8默认推荐使用cssbundling-rails替代维护停滞的sassc-rails,从根源上规避兼容性问题:

  1. 修改Gemfile,移除sassc-rails并添加:
gem "cssbundling-rails"
  1. 执行安装命令:
bundle install
rails css:install:sass
  1. 重新预编译资产:
rails assets:precompile

内容的提问来源于stack exchange,提问作者Usiel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 12:40:14