目的:移动设备向服务器发送请求,然后我进行识别后在数据据里面提取数据返回. 环境: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里面也没有问题 求解
/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/
#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 进程是用 root 启动的吧,用 root 试试看这样行不行
ruby -e ” require ’mongo‘ “
估计应该是失败的(这个应该相当于在 cgi 里面执行了),如果我猜对了,你就用 root 安装 rvm 吧,无非环境变量而已
#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
#21 楼 @jialezhang 那就先搞明白 rvm 吧,用 root 安装后可以分用户使用的,互相不干扰
另外问问题最好注意表达信息的准确性,比如你随便说 sudo install ruby
,于是我就不能判断你是 redhat/centos 系还是 debian/ubuntu 系了
没太明白你的需求。
不过有没有试过使用 load("完整路径") 的方式来加载??
还有就是 require 默认情况下,是不可以加载 全局可写目录下
的文件的。如果你能加载其中之一,而无法加载另一个,那很有可能就是权限问题??
#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 ) 吧,要理解才行