【问题标题】:requiring non-core ruby gems for apache cgi scriptsapache cgi 脚本需要非核心 ruby​​ gems
【发布时间】:2014-03-26 04:08:47
【问题描述】:

我很难使用 Apache 和 RVM 设置 Ruby CGI。我可以很好地执行需要核心 gem 的脚本,但我不能需要非核心 gem,并且 apache 会生成错误。例如:

#!/usr/bin/env /home/user/.rvm/rubies/ruby-2.1.0/bin/ruby

require 'cgi'
print "Content-type: text/html\n\n"
print 'hello there'

#!/usr/bin/env /home/user/.rvm/rubies/ruby-2.1.0/bin/ruby

require 'cgi'
require 'nokogiri'

print "Content-type: text/html\n\n"
print 'hello there'

这两个脚本都可以在终端上正常运行,但是 apache 在第二个脚本上抛出了这个错误:

[2014 年 3 月 25 日星期二 20:53:13] [错误] [客户端 127.0.0.1] 脚本头过早结束:main_index.rb /home/aaachilles/.rvm/rubies/ruby-2.1.0/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in require': cannot load such file -- nokogiri (LoadError)from /home/aaachilless/.rvm/rubies/ruby-2.1.0/lib/ruby/site_ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:inrequire'来自/home/aaachilless/Dropbox/ aaachiless-me/cgi/main_index.rb:4:in `'

看起来像这个人How do I get a Ruby CGI program that requires a gem to run properly? 遇到了同样的问题,但要求 ruby​​gems 并不能解决我的问题。

感谢任何帮助!

【问题讨论】:

  • jimworm 的回答并没有真正帮助。 apache可以执行一些脚本,所以必须加载RVM,对吧?我什至没有安装系统红宝石。
  • 我将尝试使用 suexec 运行 CGI,如果这不起作用,我将尝试卸载 RVM,安装系统 ruby​​,并在使用系统 ruby​​ 时运行 CGI,如果那样的话不起作用我将尝试将 RVM 安装为系统安装,如果不起作用,我将放弃成为 Web 开发人员的所有希望和梦想。
  • 更新:当我的脚本从终端运行时,使用 rvm 切换 rubies 会影响我的脚本,但当它们由 apache 执行时则不会。 apache 和我一样运行。
  • 我真的不想在系统范围内安装 rvm,但我想我会尝试一下,看看会发生什么。

标签: ruby apache gem


【解决方案1】:

我通过从 RVM 为我在 shebang 的 CLI 上使用的版本执行 ruby​​ 包装器解决了同样的问题,而不仅仅是 /usr/bin/ruby

#!/usr/local/rvm/wrappers/ruby-2.1.2/ruby

【讨论】:

    【解决方案2】:

    rvm 是按用户应用的,因此您的(系统?部署?root?)用户将需要在启动时加载 rvm,可能使用/etc/profile.d/rvm.sh

    查看the rvm docs 中的“多用户安装”以获得指导。

    【讨论】:

    • 我的用户和运行 Apache 的用户一样吗?我不明白这怎么可能是问题所在。如果 Apache 没有加载 RVM,那么我根本无法运行任何 CGI 脚本。但我只能运行需要非核心 gem 的 CGI 脚本。
    • 如果 Apache 没有加载 rvm,那么它仍然可以使用系统 ruby​​(如果有的话),而且看起来确实如此,因为您的脚本正在运行。
    • 我没有安装系统 ruby​​。话虽如此,如果我执行一个脚本,使用printenv 打印 Apache 的路径,则打印的 PATH 不包含任何与 ruby​​ 或 rvm 相关的内容。
    • 这个答案最有可能来自您提供的信息。如果您尝试按照指示运行rvm.sh,但它不起作用,请发布错误消息等结果。其他可能的答案是: 1. rvm 已加载,但没有为 apache 用户安装 rubies/gems; 2. rvm 已加载但运行错误的 ruby​​; 3. rvm 加载了正确的 ruby​​ 但错误的 gemset。像“必须加载rvm,对吧?”这样的假设。可能会毁了你的生活。
    • 更新:当我的 cgi 脚本中的 shebang 行指向系统安装的 ruby​​ 时,我能够正确执行所有操作。每当 shebang 行指向 RVM 安装的 ruby​​ 时,脚本只会在不需要非核心 gem 时执行。这是否确认没有加载 RVM 环境? Apache 正在以我安装 RVM 的同一用户身份运行。
    猜你喜欢
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 1970-01-01
    • 2011-08-31
    • 2018-08-11
    • 1970-01-01
    • 2011-06-23
    相关资源
    最近更新 更多