Ruby no such file to load --mongo (Loaderror)

jialezhang · 2012年08月06日 · 最后由 jialezhang 回复于 2012年08月11日 · 8550 次阅读

目的:移动设备向服务器发送请求,然后我进行识别后在数据据里面提取数据返回. 环境:ubuntu12.04+vps+ 数据库 (mongodb)+脚本语言 (ruby1.9.3) 问题:ruby 文件不能正常的 reuiqre 各种 gem,目前只能 require 'cgi', 比如

#!/usr/bin/ruby
puts "Content-type:html/text"
puts ""

require "cgi"
require "mongo"

conn = Mongo::Connection.new
if conn 
   puts "suceess"
end

然后查看服务器的 error.log 发现是no such file to load --mongo (Loaderror) 在本地/var/www下面执行没有问题,irb里面也没有问题 求解

#!/usr/bin/ruby 真的指向你的 ruby 1.9.3 ?

#!/usr/bin/env ruby

#2 楼 @Rei 1.额,我也在怀疑之中,因为无意中看到了/usr/lib/ruby/vender_ruby/1.8/......,之前建立过一个软链接从.rvm/rubies/ruby-1.9.3/bin/ruby/usr/bin 2.那个 ruby1.8 是不是系统自带的?

#2 楼 @Rei

/home/webadmin/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require', referer: http://115.156.219.152:7081/
cannot load such file -- mongo (LoadError), referer: http://115.156.219.152:7081/

#2 楼 @Rei 直接执行 ruby xxx.rb,没有问题,但是放在浏览器里面就有问题了,如果把reqiure 'mongo'删掉就都没有问题

#5 楼 @jialezhang 额,什么是放在浏览器里面?

#6 楼 @Rei 就是通过浏览器访问我的 xxx.rb 比如localhost/xxx.rb

@zw963 求问 ruby 在 shell 里面调用 gems 的路径和在浏览器里面执行 xxx.rb 时调用 gems 的路径不一样么?

#8 楼 @jialezhang 浏览器是不能直接解析 ruby 脚本的,你是不是通过某种服务程序提供 http 服务,而这个服务程序可以读取 ruby 脚本?这种情况我没有接触过,所以最好把相关的软件和应用环境都说清楚

#9 楼 @fsword 嗯嗯,浏览其的确是不能直接解析的 服务器:apache2,修改了配置文件,使其可以解析 ruby 文件,然后在 ruby 文件最前面添加

#!/usr/bin/ruby
puts "Content-type:html/text"
puts ""

require "cgi"

就可以正常执行了,但是 require 会有问题,貌似目前只能 require 标准库文件,一些后来安装的 gem 不能正常 require,了解了下 ruby 的 require 的 LoadPath,貌似说require 'rubygems',文件就会自动找你之后安装的 gem.BUT!!! 1.shell 里面正常执行,但是从浏览器里面就不行了=>莫非两个调用的 ruby 执行程序不一样么,但是我差看服务器的日志说的是

/home/webadmin/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require', referer: http://115.156.219.152:7081/
cannot load such file -- mongo (LoadError), referer: http://115.156.219.152:7081/

,那就是说还是靠 rubygems 管理的我的 gem 了??? 2.为毛在系统里面还有 ruby1.8,是不是系统自带?如何彻底删掉?删掉会不会有事? 3.怎么查找 ruby 是怎么去 require 的,按照书上查找的ruby -e 'puts $:',我的里面压根没有出现有关 gems 的东西的啊

#10 楼 @jialezhang 没用过 cgi 的方式,检查下 apache 调用 ruby 脚本的时候是不是使用了你需要的版本。

#11 楼 @Rei error.log 如上,应该是调用的是 ruby1.9.3,#!/usr/bin/ruby,指向的是 1.9.3,因为这个是从 1.9.3 哪里建立的软链接过来的,cgi 不重要,重要的是我无法 require 除了标准库 (额,就是系统自带的库,应该是叫标准库吧) 以外的 gem,而且require rubygems之后还是不可以,好像浏览器压根就忽视了 rubygems 的存在一样。

#10 楼 @jialezhang 原来是 cgi 方式,我接触不多,不过怀疑软链接没解决问题。你的 apache 进程是用 root 启动的吧,用 root 试试看这样行不行

ruby -e ”  require ’mongo‘  “

估计应该是失败的(这个应该相当于在 cgi 里面执行了),如果我猜对了,你就用 root 安装 rvm 吧,无非环境变量而已

#12 楼 @jialezhang 不要关注浏览器,要关注的是「apache 启动的 ruby 不能找到 gem」

#13 楼 @fsword 就是说 root 启动的 apache 用的是 root 启动的 ruby? (root 用户和一般用户的环境不一样造成的?)

#14 楼 @Rei 可以让服务器选择用哪个 ruby 不?rails 和 sinatra 是怎么做到让服务器直接使用我普通用户安装的 ruby 的,从而使用其中的 gems?

#16 楼 @jialezhang 贴出你的 apache 相关配置应该有助于解决。 另外我奇怪你为什么要做这件事,通常的架构是 apache/nginx + application server(rack based)

#17 楼 @fsword 嘿嘿,因为我有个同学做个 Andriod 的应用,然后需要通过发送请求给服务器,然后服务器从数据库提取东西出来返回一个 json 文件。于是我就打算用 ruby 写啦。然后我还开始写一个 sinatra 的 app,让他们在线对数据库进行操作. 这个是/etc/apache2/sites-available/default 文件

ServerAdmin webmaster@localhost
    # !!! Be sure to point DocumentRoot to 'public'!
DocumentRoot /var/www/public
<Directory /var/www/public>
 # This relaxes Apache security settings.
 AllowOverride all
 # MultiViews must be turned off.
 Options -MultiViews +ExecCGI
 AddHandler cgi-script .rb
 </Directory>

这个是/etc/apache2/httpd.conf

LoadModule passenger_module /home/webadmin/.rvm/gems/ruby-1.9.3-p194/gems/passenger-3.0.15/ext/apache2/mod_passenger.so
PassengerRoot /home/webadmin/.rvm/gems/ruby-1.9.3-p194/gems/passenger-3.0.15
PassengerRuby /home/webadmin/.rvm/wrappers/ruby-1.9.3-p194/ruby

#13 楼 @fsword 用 root 安装 rvm 等是可以执行的

#19 楼 @jialezhang 那就用这个办法吧,其实你之前的问题就是 ruby 环境没搞对,验证环境的时候用普通用户,运行的时候用 root

#20 楼 @fsword 嗯嗯,但是有没有简单些的方法啊,如果我不需要处理这个文件了或者这台虚拟机上面还有 rackapp 开发的进行,那岂不是干嘛都要 sudo 了,有没有别的方法哈.(PS:目前虚拟机的 ruby 还没有通过 rvm 在 root 的权限下安装成功,总是什么 yml 文件不能安装,之前是另一台虚拟直接 root 安装==>sudo install ruby 那种)

#21 楼 @jialezhang 那就先搞明白 rvm 吧,用 root 安装后可以分用户使用的,互相不干扰 另外问问题最好注意表达信息的准确性,比如你随便说 sudo install ruby ,于是我就不能判断你是 redhat/centos 系还是 debian/ubuntu 系了

#21 楼 @jialezhang

没太明白你的需求。

不过有没有试过使用 load("完整路径") 的方式来加载??

还有就是 require 默认情况下,是不可以加载 全局可写目录下 的文件的。如果你能加载其中之一,而无法加载另一个,那很有可能就是权限问题??

#23 楼 @zw963 相当于我需要用 xxxx.rb 在服务器端处理一个表单然后从数 数据库提取东西并返回数据就可以了。试过

1.require +载绝对路径,这个只能加载单一文件,但是每个 gem 不是由一个文件组成的,他们之间是以相对路径包含的,require 之后就是以 xxx.rb 来来算相对的,就有问题了

2.load,试过,和 require 报错都差不多。

3.现在 sudo 安装 rvm 之后还是和之前一样的错误,加载不了后来自己装的 gem,require 'rubygems',都不可以了

4.如果单独 sudo 安装 ruby,不要 rvm 引导。就没问题。

#22 楼 @fsword 悲剧了,昨天说可以早了,之前是让同学 root 直接安装的 ruby 没有 rvm 引导,是可以 require 自己的安装 gem,.但是自己 root 安装 rvm,来引导 ruby 安装时还是报错,和之前是一样的。

#25 楼 @jialezhang 那是应该是因为没有装载相应的 profile 文件,可以试试用 root 帐号加载好 rvm 的脚本(这一步要确认好),然后重启 apache

#26 楼 @fsword 求问怎么在 ruby 的加载路径里面添加其他的路径,或者删除,(书上和网上说的不是很懂).感觉 rubygems 压根找不到 gems.ps:我在 irb 里面 shuruputs $LOAD_PATH输出的是


1.9.3-p194 :001 > puts $LOAD_PATH
/home/webadmin/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1
/home/webadmin/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby/1.9.1/x86_64-linux
/home/webadmin/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/site_ruby
/home/webadmin/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/vendor_ruby/1.9.1
/home/webadmin/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/vendor_ruby/1.9.1/x86_64-linux
/home/webadmin/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/vendor_ruby
/home/webadmin/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1
/home/webadmin/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/x86_64-linux
 => nil 

但是我发现我装的 gems 都在/home/webadmin/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/gems下面

#27 楼 @jialezhang 修改$LOAD_PATH 变量就可以变更加载路径,但是你的问题应该是有原因的,应该和 rvm 安装有关,认真读一下你的.bashrc、.bash_profile 和 .bash_login 文件 ( 假设你用的是 bash ) 吧,要理解才行

#28 楼 @fsword 嗯嗯,我再学习下,谢谢你的耐心解答哈,嘿嘿

需要 登录 后方可回复, 如果你还没有账号请 注册新账号