使用Passenger+Nginx部署Ruby/Sinatra应用时遇rack/showexceptions加载错误
解决Sinatra + Passenger部署时的
rack/showexceptions LoadError问题 你遇到的这个加载错误,核心原因是老旧的Sinatra版本和新版Rack的兼容性冲突,再加上Gemfile的配置小问题,导致依赖加载混乱。咱们一步步拆解解决:
问题根源分析
从报错信息里能看到你用的是sinatra-base-1.0——这是2010年的超老版本!而你搭配的Rack是2.0.5,在Rack 2.0+版本里,rack/showexceptions这个模块已经被移除了(换成了rack/exception或者集成到其他组件),但旧版Sinatra还在尝试加载它,自然会抛出LoadError。另外,你的Gemfile里同时声明了sinatra和sinatra-base,这也是冗余的——sinatra gem本身就包含了sinatra-base,单独声明会导致版本冲突。
具体解决方案
1. 清理Gemfile冗余依赖
删掉gem 'sinatra-base',更新后的Gemfile如下:
source 'https://rubygems.org/' gem 'sinatra', '~> 2.2' # 指定兼容Ruby 2.5和Rack 2.x的版本 gem 'sinatra-reloader' gem 'docx' # 如果需要把Passenger作为项目依赖,可以放开下面的注释 # gem 'passenger'
2. 在代理环境下重新安装依赖
因为你在公司代理网络后,先配置代理环境变量,再执行bundle安装:
# 替换成公司的代理地址和端口 export http_proxy=http://your-proxy-ip:port export https_proxy=http://your-proxy-ip:port # 安装依赖,生产环境可以加上--without development跳过开发依赖 bundle install
3. 精简代码里的require语句
你的代码里同时require 'sinatra'和require 'sinatra/base'是多余的,而且建议给sinatra-reloader加上环境判断(生产环境不需要加载),修改ITC.rb开头:
require 'sinatra' require 'sinatra/reloader' if development? require 'docx'
4. 确保Passenger使用正确的Ruby环境
检查Passenger是否指向你当前的RVM Ruby版本:
passenger-config ruby-command
如果输出的路径不是你的ruby-2.5.1环境,可以在项目根目录创建.ruby-version文件指定版本:
2.5.1
额外提示
如果还是有问题,可以先删除Gemfile.lock文件,再重新执行bundle install,确保所有依赖都拉取到兼容的版本。
内容的提问来源于stack exchange,提问作者Dave K
相关产品推荐
相关产品推荐

