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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:18:00